From 38242d022645990b742e686ee6f1a17a3b561bd4 Mon Sep 17 00:00:00 2001 From: Valensior Date: Wed, 16 Jul 2025 08:58:11 +0300 Subject: [PATCH 001/183] [EOE] Atmospheric Greenhouse & Cryogen Relic (#8064) --- .../res/cardsfolder/upcoming/atmospheric_greenhouse.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt | 8 ++++++++ 2 files changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt new file mode 100644 index 00000000000..31f820796fc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt @@ -0,0 +1,9 @@ +Name:Atmoshperic Greenhouse +ManaCost:4 G +Types:Artifact Spacecraft +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCounters | TriggerDescription$ When this Spacecraft enters, put a +1/+1 counter on each creature you control. +SVar:TrigCounters:DB$ PutCounterAll | CounterType$ P1P1 | CounterNum$ 1 | ValidCards$ Creature.YouCtrl +K:Station:8 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE8_CHARGE | AddType$ Creature | AddKeyword$ Flying & Trample | Description$ STATION 8+ Flying, trample +Oracle:When this Spacecraft enters, put a +1/+1 counter on each creature you control.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It’s an artifact creature at 8+.)\nSTATION 8+\nFlying, trample diff --git a/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt b/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt new file mode 100644 index 00000000000..13e21f692a2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt @@ -0,0 +1,8 @@ +Name:Cryogen Relic +ManaCost:1 U +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this artifact enters or leaves the battlefield, draw a card. +T:Mode$ ChangesZone | Destination$ Any | Origin$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ When this artifact enters or leaves the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +A:AB$ PutCounter | Cost$ 1 U Sac<1/CARDNAME> | CounterType$ STUN | CounterNum$ 1 | ValidTgts$ Creature.tapped | TgtPrompt$ Select a tapped creature | TargetMin$ 0 | TargetMax$ 1 +Oracle:When this artifact enters or leaves the battlefield, draw a card.\n{1}{U}, Sacrifice this artifact: Put a stun counter on up to one target tapped creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) From 7e016f4ca5b96f1ee45223806208cb085bf1ad21 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 08:25:09 +0200 Subject: [PATCH 002/183] 6 EOE cards (July 15th) (#8067) --- .../res/cardsfolder/upcoming/dubious_delicacy.txt | 10 ++++++++++ .../cardsfolder/upcoming/haliya_ascendant_cadet.txt | 12 ++++++++++++ forge-gui/res/cardsfolder/upcoming/honor.txt | 6 ++++++ .../res/cardsfolder/upcoming/invasive_maneuvers.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/tractor_beam.txt | 9 +++++++++ .../res/cardsfolder/upcoming/wedgelight_rammer.txt | 10 ++++++++++ 6 files changed, 54 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/honor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tractor_beam.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt b/forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt new file mode 100644 index 00000000000..ae4845569ed --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt @@ -0,0 +1,10 @@ +Name:Dubious Delicacy +ManaCost:2 B +Types:Artifact Food +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDebuff | TriggerDescription$ When this artifact enters, up to one target creature gets -3/-3 until end of turn. +SVar:TrigDebuff:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +A:AB$ LoseLife | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Opponent | LifeAmount$ 3 | SpellDescription$ Target opponent loses 3 life. +DeckHas:Ability$LifeGain|Food +Oracle:Flash\nWhen this artifact enters, up to one target creature gets -3/-3 until end of turn.\n{2}, {T}, Sacrifice this artifact: You gain 3 life.\n{2}, {T}, Sacrifice this artifact: Target opponent loses 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt b/forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt new file mode 100644 index 00000000000..b1b6c873e87 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt @@ -0,0 +1,12 @@ +Name:Haliya, Ascendant Cadet +ManaCost:2 G W W +Types:Legendary Creature Human Soldier +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever NICKNAME enters or attacks, put a +1/+1 counter on target creature you control. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever NICKNAME enters or attacks, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl+counters_GE1_P1P1 | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever one or more creatures you control with +1/+1 counters on them deal combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Counters +Oracle:Whenever Haliya enters or attacks, put a +1/+1 counter on target creature you control.\nWhenever one or more creatures you control with +1/+1 counters on them deal combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/honor.txt b/forge-gui/res/cardsfolder/upcoming/honor.txt new file mode 100644 index 00000000000..53fe053bc4d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/honor.txt @@ -0,0 +1,6 @@ +Name:Honor +ManaCost:W +Types:Sorcery +A:SP$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw | SpellDescription$ Put a +1/+1 counter on target creature. Draw a card. +SVar:DBDraw:DB$ Draw +Oracle:Put a +1/+1 counter on target creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt b/forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt new file mode 100644 index 00000000000..1a9dca6094a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt @@ -0,0 +1,7 @@ +Name:Invasive Maneuvers +ManaCost:1 R +Types:Instant +A:SP$ DealDamage | ValidTgts$ Creature | NumDmg$ X | SpellDescription$ CARDNAME deals 3 damage to target creature. It deals 5 damage instead if you control a Spacecraft. +SVar:Y:Count$Valid Spacecraft.YouCtrl +SVar:X:Count$Compare Y GE1.5.3 +Oracle:Invasive Maneuvers deals 3 damage to target creature. It deals 5 damage instead if you control a Spacecraft. diff --git a/forge-gui/res/cardsfolder/upcoming/tractor_beam.txt b/forge-gui/res/cardsfolder/upcoming/tractor_beam.txt new file mode 100644 index 00000000000..247f8c861e6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tractor_beam.txt @@ -0,0 +1,9 @@ +Name:Tractor Beam +ManaCost:2 U U +Types:Enchantment Aura +K:Enchant:Creature,Spacecraft:creature or Spacecraft +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTap | TriggerDescription$ When this Aura enters, tap enchanted permanent. +SVar:TrigTap:DB$ Tap | Defined$ Enchanted +S:Mode$ Continuous | Affected$ Permanent.EnchantedBy | GainControl$ You | Description$ You control enchanted permanent. +R:Event$ Untap | ActiveZones$ Battlefield | ValidCard$ Creature.EnchantedBy | ValidStepTurnToController$ You | Layer$ CantHappen | Description$ Enchanted permanent doesn't untap during its controller's untap step. +Oracle:Enchant creature or Spacecraft\nWhen this Aura enters, tap enchanted permanent.\nYou control enchanted permanent.\nEnchanted permanent doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt b/forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt new file mode 100644 index 00000000000..a6ca3577a76 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt @@ -0,0 +1,10 @@ +Name:Wedgelight Rammer +ManaCost:3 W +Types:Artifact Spacecraft +PT:3/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this Spacecraft enters, create a 2/2 colorless Robot artifact creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You +K:Station:9 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE9_CHARGE | AddType$ Creature | AddKeyword$ Flying & First Strike | Description$ STATION 9+ Flying, first strike +DeckHas:Ability$Token +Oracle:When this Spacecraft enters, create a 2/2 colorless Robot artifact creature token.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 9+.)\nSTATION 9+\nFlying, first strike From 4346d83582a11badb1cd7f47ed8a3645ce6f7754 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 08:58:57 +0200 Subject: [PATCH 003/183] Update atmospheric_greenhouse.txt (#8071) --- forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt index 31f820796fc..4a9dacbd146 100644 --- a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt +++ b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt @@ -1,4 +1,4 @@ -Name:Atmoshperic Greenhouse +Name:Atmospheric Greenhouse ManaCost:4 G Types:Artifact Spacecraft PT:5/4 From 3158c0b1d97a7b198f2b2c12248f2d80be730371 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:57:18 +0200 Subject: [PATCH 004/183] Hymn of the Faller (EOE) (#8072) --- .../res/cardsfolder/upcoming/hymn_of_the_faller.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt b/forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt new file mode 100644 index 00000000000..db3e58a02fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt @@ -0,0 +1,10 @@ +Name:Hymn of the Faller +ManaCost:1 B +Types:Sorcery +A:SP$ Surveil | Amount$ 1 | SubAbility$ DBDraw | SpellDescription$ Surveil 1, then you draw a card and lose 1 life. (To surveil 1, look at the top card of your library. You may put it into your graveyard.) Void — If a nonland permanent left the battlefield this turn or a spell was warped this turn, draw another card. +SVar:DBDraw:DB$ Draw | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBVoidDraw +SVar:DBVoidDraw:DB$ Draw | ConditionCheckSVar$ X +SVar:X:Count$Void.1.0 +DeckHas:Ability$Surveil|Graveyard +Oracle:Surveil 1, then you draw a card and lose 1 life. (To surveil 1, look at the top card of your library. You may put it into your graveyard.)\nVoid — If a nonland permanent left the battlefield this turn or a spell was warped this turn, draw another card. From f565943d8d69be8c2a3c6fc5b0515a1cf186e976 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 16 Jul 2025 13:02:47 +0000 Subject: [PATCH 005/183] Fix cost syntax (#8073) --- forge-gui/res/cardsfolder/c/choked_estuary.txt | 2 +- forge-gui/res/cardsfolder/f/foreboding_ruins.txt | 2 +- forge-gui/res/cardsfolder/f/fortified_village.txt | 2 +- forge-gui/res/cardsfolder/f/frostboil_snarl.txt | 2 +- forge-gui/res/cardsfolder/f/furycalm_snarl.txt | 2 +- forge-gui/res/cardsfolder/g/game_trail.txt | 2 +- forge-gui/res/cardsfolder/n/necroblossom_snarl.txt | 2 +- forge-gui/res/cardsfolder/p/port_town.txt | 2 +- forge-gui/res/cardsfolder/s/shineshadow_snarl.txt | 2 +- forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt | 2 +- forge-gui/src/main/java/forge/player/HumanPlay.java | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/choked_estuary.txt b/forge-gui/res/cardsfolder/c/choked_estuary.txt index aeddb53ba04..6afa16c5698 100644 --- a/forge-gui/res/cardsfolder/c/choked_estuary.txt +++ b/forge-gui/res/cardsfolder/c/choked_estuary.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Combo U B | SpellDescription$ Add {U} or {B}. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal an Island or Swamp card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Island,Swamp/Island or Swamp> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Island;Swamp/Island or Swamp> | UnlessPayer$ You | StackDescription$ enters tapped. Oracle:As Choked Estuary enters, you may reveal an Island or Swamp card from your hand. If you don't, Choked Estuary enters tapped.\n{T}: Add {U} or {B}. diff --git a/forge-gui/res/cardsfolder/f/foreboding_ruins.txt b/forge-gui/res/cardsfolder/f/foreboding_ruins.txt index d842a7ca90f..33e9d176963 100644 --- a/forge-gui/res/cardsfolder/f/foreboding_ruins.txt +++ b/forge-gui/res/cardsfolder/f/foreboding_ruins.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Combo B R | SpellDescription$ Add {B} or {R}. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Swamp or Mountain card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Swamp,Mountain/Swamp or Mountain> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Swamp;Mountain/Swamp or Mountain> | UnlessPayer$ You | StackDescription$ enters tapped. Oracle:As Foreboding Ruins enters, you may reveal a Swamp or Mountain card from your hand. If you don't, Foreboding Ruins enters tapped.\n{T}: Add {B} or {R}. diff --git a/forge-gui/res/cardsfolder/f/fortified_village.txt b/forge-gui/res/cardsfolder/f/fortified_village.txt index a2f270a77a3..ee222ab943a 100644 --- a/forge-gui/res/cardsfolder/f/fortified_village.txt +++ b/forge-gui/res/cardsfolder/f/fortified_village.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Combo G W | SpellDescription$ Add {G} or {W}. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Forest or Plains card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Forest,Plains/Forest or Plains> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Forest;Plains/Forest or Plains> | UnlessPayer$ You | StackDescription$ enters tapped. Oracle:As Fortified Village enters, you may reveal a Forest or Plains card from your hand. If you don't, Fortified Village enters tapped.\n{T}: Add {G} or {W}. diff --git a/forge-gui/res/cardsfolder/f/frostboil_snarl.txt b/forge-gui/res/cardsfolder/f/frostboil_snarl.txt index 880b16ab2b4..e648a5b6951 100644 --- a/forge-gui/res/cardsfolder/f/frostboil_snarl.txt +++ b/forge-gui/res/cardsfolder/f/frostboil_snarl.txt @@ -2,6 +2,6 @@ Name:Frostboil Snarl ManaCost:no cost Types:Land R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal an Island or Mountain card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Island,Mountain/Island or Mountain> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Island;Mountain/Island or Mountain> | UnlessPayer$ You | StackDescription$ enters tapped. A:AB$ Mana | Cost$ T | Produced$ Combo U R | SpellDescription$ Add {U} or {R}. Oracle:As Frostboil Snarl enters, you may reveal an Island or Mountain card from your hand. If you don't, Frostboil Snarl enters tapped.\n{T}: Add {U} or {R}. diff --git a/forge-gui/res/cardsfolder/f/furycalm_snarl.txt b/forge-gui/res/cardsfolder/f/furycalm_snarl.txt index 51d42c40296..5ed6dd23df3 100644 --- a/forge-gui/res/cardsfolder/f/furycalm_snarl.txt +++ b/forge-gui/res/cardsfolder/f/furycalm_snarl.txt @@ -2,6 +2,6 @@ Name:Furycalm Snarl ManaCost:no cost Types:Land R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Mountain or Plains card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Mountain,Plains/Mountain or Plains> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Mountain;Plains/Mountain or Plains> | UnlessPayer$ You | StackDescription$ enters tapped. A:AB$ Mana | Cost$ T | Produced$ Combo R W | SpellDescription$ Add {R} or {W}. Oracle:As Furycalm Snarl enters, you may reveal a Mountain or Plains card from your hand. If you don't, Furycalm Snarl enters tapped.\n{T}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/g/game_trail.txt b/forge-gui/res/cardsfolder/g/game_trail.txt index 09cc7c92509..f266b87d702 100644 --- a/forge-gui/res/cardsfolder/g/game_trail.txt +++ b/forge-gui/res/cardsfolder/g/game_trail.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Combo R G | SpellDescription$ Add {R} or {G}. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Mountain or Forest card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Mountain,Forest/Mountain or Forest> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Mountain;Forest/Mountain or Forest> | UnlessPayer$ You | StackDescription$ enters tapped. Oracle:As Game Trail enters, you may reveal a Mountain or Forest card from your hand. If you don't, Game Trail enters tapped.\n{T}: Add {R} or {G}. diff --git a/forge-gui/res/cardsfolder/n/necroblossom_snarl.txt b/forge-gui/res/cardsfolder/n/necroblossom_snarl.txt index f60f4ac82f7..54869373d73 100644 --- a/forge-gui/res/cardsfolder/n/necroblossom_snarl.txt +++ b/forge-gui/res/cardsfolder/n/necroblossom_snarl.txt @@ -2,6 +2,6 @@ Name:Necroblossom Snarl ManaCost:no cost Types:Land R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Swamp or Forest card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Swamp,Forest/Swamp or Forest> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Swamp;Forest/Swamp or Forest> | UnlessPayer$ You | StackDescription$ enters tapped. A:AB$ Mana | Cost$ T | Produced$ Combo B G | SpellDescription$ Add {B} or {G}. Oracle:As Necroblossom Snarl enters, you may reveal a Swamp or Forest card from your hand. If you don't, Necroblossom Snarl enters tapped.\n{T}: Add {B} or {G}. diff --git a/forge-gui/res/cardsfolder/p/port_town.txt b/forge-gui/res/cardsfolder/p/port_town.txt index ab342c5b7e9..c33a1efa608 100644 --- a/forge-gui/res/cardsfolder/p/port_town.txt +++ b/forge-gui/res/cardsfolder/p/port_town.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Combo W U | SpellDescription$ Add {W} or {U}. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Plains or Island card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Plains,Island/Plains or Island> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Plains;Island/Plains or Island> | UnlessPayer$ You | StackDescription$ enters tapped. Oracle:As Port Town enters, you may reveal a Plains or Island card from your hand. If you don't, Port Town enters tapped.\n{T}: Add {W} or {U}. diff --git a/forge-gui/res/cardsfolder/s/shineshadow_snarl.txt b/forge-gui/res/cardsfolder/s/shineshadow_snarl.txt index 8fbe6470e19..040d00c4519 100644 --- a/forge-gui/res/cardsfolder/s/shineshadow_snarl.txt +++ b/forge-gui/res/cardsfolder/s/shineshadow_snarl.txt @@ -2,6 +2,6 @@ Name:Shineshadow Snarl ManaCost:no cost Types:Land R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Plains or Swamp card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Plains,Swamp/Plains or Swamp> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Plains;Swamp/Plains or Swamp> | UnlessPayer$ You | StackDescription$ enters tapped. A:AB$ Mana | Cost$ T | Produced$ Combo W B | SpellDescription$ Add {W} or {B}. Oracle:As Shineshadow Snarl enters, you may reveal a Plains or Swamp card from your hand. If you don't, Shineshadow Snarl enters tapped.\n{T}: Add {W} or {B}. diff --git a/forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt b/forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt index d7a39b6fcfd..d8b8c096778 100644 --- a/forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt +++ b/forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt @@ -2,6 +2,6 @@ Name:Vineglimmer Snarl ManaCost:no cost Types:Land R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ As CARDNAME enters, you may reveal a Forest or Island card from your hand. If you don't, CARDNAME enters tapped. -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Forest,Island/Forest or Island> | UnlessPayer$ You | StackDescription$ enters tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Forest;Island/Forest or Island> | UnlessPayer$ You | StackDescription$ enters tapped. A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}. Oracle:As Vineglimmer Snarl enters, you may reveal a Forest or Island card from your hand. If you don't, Vineglimmer Snarl enters tapped.\n{T}: Add {G} or {U}. diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 1f695479f1a..baacfa86b8b 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -407,7 +407,7 @@ public class HumanPlay { } else if (part instanceof CostReveal) { CostReveal costReveal = (CostReveal) part; - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(costReveal.getRevealFrom()), part.getType(), p, source, sourceAbility); + CardCollectionView list = CardLists.getValidCards(p.getCardsIn(costReveal.getRevealFrom()), part.getType().split(";"), p, source, sourceAbility); int amount = part.getAbilityAmount(sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, hcd.isEffect(), (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblReveal") + orString); if (!hasPaid) { return false; } From bdda4d50f7205376bad605d1d55d3f74a288ca7b Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:16:42 +0200 Subject: [PATCH 006/183] Create steelswarm_operator.txt (#8074) --- .../res/cardsfolder/upcoming/steelswarm_operator.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt b/forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt new file mode 100644 index 00000000000..92af9538a61 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt @@ -0,0 +1,8 @@ +Name:Steelswarm Operator +ManaCost:1 U +Types:Artifact Creature Robot Soldier +PT:1/1 +K:Flying +A:AB$ Mana | Cost$ T | Produced$ U | RestrictValid$ Spell.Artifact | SpellDescription$ Add {U}. Spend this mana only to cast an artifact spell. +A:AB$ Mana | Cost$ T | Produced$ U U | RestrictValid$ Activated.Artifact | SpellDescription$ Add {U}{U}. Spend this mana only to activate abilities of artifact sources. +Oracle:Flying\n{T}: Add {U}. Spend this mana only to cast an artifact spell.\n{T}: Add {U}{U}. Spend this mana only to activate abilities of artifact sources. From 4a5969157d454191128998589de1019b05d8bba4 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 19:55:38 +0200 Subject: [PATCH 007/183] 6 EOE cards (July 16th) (#8075) --- forge-gui/res/cardsfolder/a/abyssal_hunter.txt | 6 +++--- .../res/cardsfolder/upcoming/dual_sun_technique.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/edge_rover.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/full_bore.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/lithobraking.txt | 7 +++++++ .../res/cardsfolder/upcoming/mechan_assembler.txt | 8 ++++++++ .../res/cardsfolder/upcoming/requiem_monolith.txt | 10 ++++++++++ 7 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/edge_rover.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/full_bore.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lithobraking.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt diff --git a/forge-gui/res/cardsfolder/a/abyssal_hunter.txt b/forge-gui/res/cardsfolder/a/abyssal_hunter.txt index a04a0315a44..014bf56ffff 100644 --- a/forge-gui/res/cardsfolder/a/abyssal_hunter.txt +++ b/forge-gui/res/cardsfolder/a/abyssal_hunter.txt @@ -2,8 +2,8 @@ Name:Abyssal Hunter ManaCost:3 B Types:Creature Human Assassin PT:1/1 -A:AB$ DealDamage | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ DBTap | SpellDescription$ Tap target creature. CARDNAME deals damage equal to CARDNAME's power to that creature. -SVar:DBTap:DB$ Tap | Defined$ Targeted +A:AB$ Tap | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDamage | SpellDescription$ Tap target creature. This creature deals damage equal to its power to that creature. +SVar:DB$ DealDamage | Defined$ Targeted | NumDmg$ X SVar:X:Count$CardPower SVar:NonCombatPriority:4 -Oracle:{B}, {T}: Tap target creature. Abyssal Hunter deals damage equal to Abyssal Hunter's power to that creature. +Oracle:{B}, {T}: Tap target creature. This creature deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt b/forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt new file mode 100644 index 00000000000..0ad478db32e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt @@ -0,0 +1,6 @@ +Name:Dual-Sun Technique +ManaCost:1 W +Types:Instant +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Double Strike | SubAbility$ DBDraw | SpellDescription$ Target creature you control gains double strike until end of turn. If it has a +1/+1 counter on it, draw a card. +SVar:DBDraw:DB$ Draw | ConditionDefined$ Targeted | ConditionPresent$ Card.counters_GE1_P1P1 +Oracle:Target creature you control gains double strike until end of turn. If it has a +1/+1 counter on it, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/edge_rover.txt b/forge-gui/res/cardsfolder/upcoming/edge_rover.txt new file mode 100644 index 00000000000..c9c4c091bff --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/edge_rover.txt @@ -0,0 +1,8 @@ +Name:Edge Rover +ManaCost:G +Types:Artifact Creature Robot Scout +PT:2/2 +K:Reach +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature dies, each player creates a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ Player +Oracle:Reach\nWhen this creature dies, each player creates a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/full_bore.txt b/forge-gui/res/cardsfolder/upcoming/full_bore.txt new file mode 100644 index 00000000000..43151043722 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/full_bore.txt @@ -0,0 +1,6 @@ +Name:Full Bore +ManaCost:R +Types:Instant +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +3 | NumDef$ +2 | SubAbility$ DBPump | SpellDescription$ Target creature you control gets +3/+2 until end of turn. If that creature was cast for its warp cost, it also gains trample and haste until end of turn. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Trample & Haste | ConditionDefined$ Targeted | ConditionPresent$ Card.CastSa Spell.Warp +Oracle:Target creature you control gets +3/+2 until end of turn. If that creature was cast for its warp cost, it also gains trample and haste until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lithobraking.txt b/forge-gui/res/cardsfolder/upcoming/lithobraking.txt new file mode 100644 index 00000000000..5ca80ff3fcc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lithobraking.txt @@ -0,0 +1,7 @@ +Name:Lithobraking +ManaCost:2 R +Types:Instant +A:SP$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You | SubAbility$ DBImmediateTrig | SpellDescription$ Create a Lander token. Then you may sacrifice an artifact. When you do, CARDNAME deals 2 damage to each creature. (A Lander token is an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:DBImmediateTrig:DB$ ImmediateTrigger | UnlessCost$ Sac<1/Artifact> | UnlessPayer$ You | UnlessSwitched$ True | Execute$ TrigDamageAll | TriggerDescription$ When you do, CARDNAME deals 2 damage to each creature. +SVar:TrigDamageAll:DB$ DamageAll | ValidCards$ Creature | ValidDescription$ each creature. | NumDmg$ 2 +Oracle:Create a Lander token. Then you may sacrifice an artifact. When you do, Lithobraking deals 2 damage to each creature. (A Lander token is an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt b/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt new file mode 100644 index 00000000000..432af665810 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt @@ -0,0 +1,8 @@ +Name:Mechan Assembler +ManaCost:4 U +Types:Artifact Creature Robot Artificer +PT:4/4 +T:Mode$ ChangesZone | ValidCard$ Artifact.Other+YouCtrl | Destination$ Battlefield | Execute$ TrigToken | ActivationLimit$ 1 | TriggerDescription$ Whenever another artifact you control enters, create a 2/2 colorless Robot artifact creature token. This ability triggers only once each turn. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot +DeckHas:Ability$Token +Oracle:Whenever another artifact you control enters, create a 2/2 colorless Robot artifact creature token. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt b/forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt new file mode 100644 index 00000000000..0996c270ff8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt @@ -0,0 +1,10 @@ +Name:Requiem Monolith +ManaCost:2 B +Types:Artifact +A:AB$ Animate | Cost$ T | Triggers$ DamageTrigger | ValidTgts$ Creature | SubAbility$ DBDamage | SorcerySpeed$ True | SpellDescription$ Until end of turn, target creature gains "Whenever this creature is dealt damage, you draw that many cards and lose that much life." That creature's controller may have this artifact deal 1 damage to it. Activate only as a sorcery. +SVar:DamageTrigger:Mode$ DamageDoneOnce | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever this creature is dealt damage, you draw that many cards and lose that much life. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X +SVar:DBDamage:DB$ DealDamage | Defined$ Targeted | NumDmg$ 1 | OptionalDecider$ TargetedController +SVar:X:TriggerCount$DamageAmount +Oracle:{T}: Until end of turn, target creature gains "Whenever this creature is dealt damage, you draw that many cards and lose that much life." That creature's controller may have this artifact deal 1 damage to it. Activate only as a sorcery. From e45ae205ac7a393eb822086461bedc387710ff92 Mon Sep 17 00:00:00 2001 From: Valensior Date: Wed, 16 Jul 2025 21:30:05 +0300 Subject: [PATCH 008/183] Dauntless Scrapbot [EOE] (#8076) --- forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt b/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt new file mode 100644 index 00000000000..8ad68abfb2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt @@ -0,0 +1,8 @@ +Name:Dauntless Scrapbot +ManaCost:3 +Types:Artifact Creature Robot +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature enters, exile each opponent’s graveyard. Create a Lander token. (It’s an artifact with “{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.”) +SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.OppOwn | SubAbility$ TrigLander +SVar:TrigLander:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You +Oracle:When this creature enters, exile each opponent’s graveyard. Create a Lander token. (It’s an artifact with “{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.”) \ No newline at end of file From 504946f72a648b3cdc5bc21093d518fa7136cef4 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 16 Jul 2025 21:29:48 +0200 Subject: [PATCH 009/183] Pinnacle Kill-Ship (EOE) (#8078) --- .../res/cardsfolder/upcoming/pinnacle_kill_ship.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt b/forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt new file mode 100644 index 00000000000..a3a2ccd2975 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt @@ -0,0 +1,9 @@ +Name:Pinnacle Kill-Ship +ManaCost:7 +Types:Artifact Spacecraft +PT:7/7 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this Spacecraft enters, it deals 10 damage to up to one target creature. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1 | NumDmg$ 10 +K:Station:7 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE7_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 7+ Flying +Oracle:When this Spacecraft enters, it deals 10 damage to up to one target creature.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 7+.)\nSTATION 7+\nFlying From 10dbafbe8ce4361cf471945f1da1fe6092171849 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:54:02 +0100 Subject: [PATCH 010/183] EOE: 4 cards (#8079) --- forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt | 2 +- .../res/cardsfolder/upcoming/atmospheric_greenhouse.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt | 2 +- .../res/cardsfolder/upcoming/dauntless_scrapbot.txt | 8 ++++---- .../res/cardsfolder/upcoming/honored_knight_captain.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt | 7 +++++++ .../res/cardsfolder/upcoming/lumen_class_frigate.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/radiant_strike.txt | 6 ++++++ 8 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/radiant_strike.txt diff --git a/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt b/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt index ff453066a95..7b39bae37b1 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a creature spell, you may put a quest counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -A:AB$ ChangeZone | Cost$ SubCounter<5/QUEST> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Equipment+YouOwn | ChangeNum$ 1 | AttachAfter$ Creature.YouCtrl | SpellDescription$ Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle your library. +A:AB$ ChangeZone | Cost$ SubCounter<5/QUEST> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Equipment | ChangeNum$ 1 | AttachAfter$ Creature.YouCtrl | SpellDescription$ Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle your library. SVar:MaxQuestEffect:5 AI:RemoveDeck:Random DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt index 4a9dacbd146..793e6ec7725 100644 --- a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt +++ b/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt @@ -2,8 +2,8 @@ Name:Atmospheric Greenhouse ManaCost:4 G Types:Artifact Spacecraft PT:5/4 +K:Station:8 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCounters | TriggerDescription$ When this Spacecraft enters, put a +1/+1 counter on each creature you control. SVar:TrigCounters:DB$ PutCounterAll | CounterType$ P1P1 | CounterNum$ 1 | ValidCards$ Creature.YouCtrl -K:Station:8 S:Mode$ Continuous | Affected$ Card.Self+counters_GE8_CHARGE | AddType$ Creature | AddKeyword$ Flying & Trample | Description$ STATION 8+ Flying, trample -Oracle:When this Spacecraft enters, put a +1/+1 counter on each creature you control.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It’s an artifact creature at 8+.)\nSTATION 8+\nFlying, trample +Oracle:When this Spacecraft enters, put a +1/+1 counter on each creature you control.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 8+.)\nSTATION 8+\nFlying, trample diff --git a/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt b/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt index 13e21f692a2..557d05c9936 100644 --- a/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt +++ b/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt @@ -4,5 +4,5 @@ Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this artifact enters or leaves the battlefield, draw a card. T:Mode$ ChangesZone | Destination$ Any | Origin$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ When this artifact enters or leaves the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 -A:AB$ PutCounter | Cost$ 1 U Sac<1/CARDNAME> | CounterType$ STUN | CounterNum$ 1 | ValidTgts$ Creature.tapped | TgtPrompt$ Select a tapped creature | TargetMin$ 0 | TargetMax$ 1 +A:AB$ PutCounter | Cost$ 1 U Sac<1/CARDNAME/this artifact> | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target tapped creature | CounterType$ STUN | CounterNum$ 1 | SpellDescription$ Put a stun counter on up to one target tapped creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) Oracle:When this artifact enters or leaves the battlefield, draw a card.\n{1}{U}, Sacrifice this artifact: Put a stun counter on up to one target tapped creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt b/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt index 8ad68abfb2b..2ba40c0ba63 100644 --- a/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt +++ b/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt @@ -2,7 +2,7 @@ Name:Dauntless Scrapbot ManaCost:3 Types:Artifact Creature Robot PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature enters, exile each opponent’s graveyard. Create a Lander token. (It’s an artifact with “{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.”) -SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.OppOwn | SubAbility$ TrigLander -SVar:TrigLander:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You -Oracle:When this creature enters, exile each opponent’s graveyard. Create a Lander token. (It’s an artifact with “{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.”) \ No newline at end of file +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature enters, exile each opponent's graveyard. Create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.OppOwn | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You +Oracle:When this creature enters, exile each opponent's graveyard. Create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt b/forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt new file mode 100644 index 00000000000..d7872e4d8da --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt @@ -0,0 +1,8 @@ +Name:Honored Knight-Captain +ManaCost:1 W +Types:Creature Human Advisor Knight +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a 1/1 white Human Soldier creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You +A:AB$ ChangeZone | Cost$ 4 W W Sac<1/CARDNAME/this creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Equipment | ChangeNum$ 1 | SpellDescription$ Search your library for an Equipment card, put it onto the battlefield, then shuffle. +Oracle:When this creature enters, create a 1/1 white Human Soldier creature token.\n{4}{W}{W}, Sacrifice this creature: Search your library for an Equipment card, put it onto the battlefield, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt b/forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt new file mode 100644 index 00000000000..55be0ba2b35 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt @@ -0,0 +1,7 @@ +Name:Lightless Evangel +ManaCost:1 B +Types:Creature Vampire Cleric +PT:2/2 +T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature.Other,Artifact.Other | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you sacrifice another creature or artifact, put a +1/+1 counter on this creature. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 +Oracle:Whenever you sacrifice another creature or artifact, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt b/forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt new file mode 100644 index 00000000000..e6e1aead3c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt @@ -0,0 +1,9 @@ +Name:Lumen-Class Frigate +ManaCost:1 W +Types:Artifact Spacecraft +PT:3/5 +K:Station:12 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE2_CHARGE | AddStaticAbility$ AnthemStatic | Description$ STATION 2+ Other creatures you control get +1/+1. +SVar:AnthemStatic:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | Description$ Other creatures you control get +1/+1. +S:Mode$ Continuous | Affected$ Card.Self+counters_GE12_CHARGE | AddType$ Creature | AddKeyword$ Flying & Lifelink | Description$ STATION 12+ Flying, lifelink +Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 12+.)\nSTATION 2+\nOther creatures you control get +1/+1.\nSTATION 12+\nFlying, lifelink diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_strike.txt b/forge-gui/res/cardsfolder/upcoming/radiant_strike.txt new file mode 100644 index 00000000000..8e9c541b363 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/radiant_strike.txt @@ -0,0 +1,6 @@ +Name:Radiant Strike +ManaCost:3 W +Types:Instant +A:SP$ Destroy | ValidTgts$ Artifact,Creature.tapped | TgtPrompt$ Select target artifact or tapped creature | SubAbility$ DBGainLife | SpellDescription$ Destroy target artifact or tapped creature. You gain 3 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 +Oracle:Destroy target artifact or tapped creature. You gain 3 life. From bae41478d9c6dcf7ccd5620aa8b78d7803add639 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:27:08 +0100 Subject: [PATCH 011/183] Edition updates --- forge-gui/res/editions/Edge of Eternities.txt | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index c2ef0e862d5..6d6858940d1 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -13,15 +13,21 @@ ScryfallCode=EOE 6 C Banishing Light @Rovina Cai 7 R Beyond the Quiet @Yohann Schepacz 9 M Cosmogrand Zenith @Anna Steinbauer +13 U Dual-Sun Technique @Ioannis Fiore 14 U Emergency Eject @Leon Tukker 15 M Exalted Sunborn @Scott M. Fischer +18 C Focus Fire @Borja Pindado 19 R Haliya, Guided by Light @Kieran Yanner 20 R Hardlight Containment @Dominik Mayer +21 U Honor @Eli Minaya 22 U Honored Knight-Captain @Forrest Imel +24 R Lightstall Inquisitor @Arif Wijaya 25 R Lumen-Class Frigate @Zezhou Chen 26 C Luxknight Breacher @Cristi Balanescu +27 R Pinnacle Starcage @Leon Tukker 28 U Pulsar Squadron Ace @Javier Charro 29 C Radiant Strike @Aleksi Briclot +30 U Rayblade Trooper @Cristi Balanescu 31 U Reroute Systems @Sergey Glushakov 32 U Rescue Skiff @Viko Menezes 33 U Scout for Survivors @Greg Staples @@ -31,26 +37,36 @@ ScryfallCode=EOE 39 C Starport Security @Lie Setiawan 40 R Sunstar Chaplain @Valera Lutfullina 41 U Sunstar Expansionist @Mark Poole +43 U Wedgelight Rammer @Nadia Hurianova 46 U Annul @Carlos Palma Cruchaga +47 U Atomic Microsizer @Gabor Szikszai 51 R Consult the Star Charts @Antonio José Manzanedo 52 C Cryogen Relic @Eelis Kyttanen 54 U Desculpting Blast @Jeremy Wilson 56 R Emissary Escort @Igor Grechanyi 58 C Illvoi Galeblade @Nathaniel Himawan +63 U Mechan Assembler @Mirko Failoni 66 C Mechanozoa @Daarken 68 R Mm'menon, the Right Hand @Joshua Raphael +69 R Moonlit Meditation @Liiga Smilshkalne 70 U Mouth of the Storm @Domenico Cava 72 M Quantum Riddler @Izzy 76 U Specimen Freighter @Sergey Glushakov 77 C Starbreach Whale @Sam Burley 78 R Starfield Vocalist @Nathaniel Himawan -81 R "Interstellar Gacha Ship" @Adrián Rodríguez Pérez +79 R Starwinder @Devin Elle Kurtz +80 U Steelswarm Operator @Cristi Balanescu +81 R Synthesizer Labship @Adrián Rodríguez Pérez +82 U Tractor Beam @Sergey Glushakov 83 U Unravel @Josh Hass +84 U Uthros Psionicist @Inkognit +85 U Uthros Scanship @Sergey Glushakov 86 M Weftwalking @Rovina Cai 87 M Alpharael, Stonechosen @Kieran Yanner 88 R Archenemy's Charm @Brigitte Roka & Clifton Stommel 91 R Chorale of the Void @Alix Branwyn 94 C Decode Transmissions @Josh Hass +96 U Dubious Delicacy @Tianxing Xu 97 R Elegy Acolyte @Diana Franco 98 C Embrace Oblivion @Andreas Zafiratos 99 R Entropic Battlecruiser @Josiah "Jo" Cameron @@ -58,9 +74,11 @@ ScryfallCode=EOE 103 C Gravkill @Dominik Mayer 105 C Hullcarver @Michal Ivan 106 U Hylderblade @Viko Menezes +107 U Hymn of the Faller @Danny Schwartz 108 C Insatiable Skittermaw @Diego Gisbert 109 U Lightless Evangel @Viko Menezes 110 U Monoist Circuit-Feeder @Quintin Gleim +113 R Requiem Monolith @Warren Mahy 115 M Sothera, the Supervoid @Dominik Mayer 116 R Sunset Saboteur @Mirko Failoni 120 C Temporal Intervention @Chris Rallis @@ -69,11 +87,16 @@ ScryfallCode=EOE 123 U Umbral Collar Zealot @Dmitry Burmak 124 C Virus Beetle @Leesha Hannigan 125 U Voidforged Titan @Diego Gisbert +127 R Xu-Ifit, Osteoharmonist @Michal Ivan 130 U Cut Propulsion @Andrea Piparo 131 U Debris Field Crusher @David Álvarez +132 M Devastating Onslaught @Chris Seaman +135 U Full Bore @Olivier Bernard 136 U Galvanizing Sawship @Constantin Marin +137 U Invasive Maneuvers @Leon Tukker 138 C Kav Landseeker @Karl Kopinski 139 U Kavaron Harrier @Hardy Fowler +142 U Lithobraking @Andrew Mar 143 C Melded Moxite @Alexandr Leskinen 144 U Memorial Team Leader @Andrew Mar 148 R Nova Hellkite @Raymond Swanland @@ -95,6 +118,7 @@ ScryfallCode=EOE 175 U Broodguard Elite @Paolo Parente 176 U Close Encounter @Inkognit 178 C Drix Fatemaker @Anna Pavleeva +179 U Edge Rover @Francisco Badilla 181 U Eusocial Engineering @Francisco Badilla 182 M Famished Worldsire @Kev Walker 183 R Frenzied Baloth @Diana Franco @@ -117,6 +141,7 @@ ScryfallCode=EOE 215 R Cosmogoyf @Chris Rahn 216 R Dyadrine, Synthesis Amalgam @Igor Grechanyi 217 R Genemorph Imago @Brian Valeza +218 U Haliya, Ascendant Cadet @Justyna Dura 219 R Infinite Guideline Station @Piotr Dura 220 U Interceptor Mechan @Leonardo Santanna 222 R Mutinous Massacre @Quintin Gleim @@ -126,6 +151,8 @@ ScryfallCode=EOE 226 M Sami, Wildcat Captain @Kieran Yanner 227 U Seedship Broodtender @Eric Wilkerson 228 R Singularity Rupture @Liiga Smilshkalne +229 R Space-Time Anomaly @Loïc Canavaggia +230 U Station Monitor @Camille Alquier 231 R Syr Vondam, Sunstar Exemplar @Ryan Pancoast 232 U Syr Vondam, the Lucent @Cristi Balanescu 233 U Tannuk, Memorial Ensign @David Auden Nash @@ -139,6 +166,7 @@ ScryfallCode=EOE 241 R The Eternity Elevator @Josu Solano 242 R Extinguisher Battleship @Danny Schwartz 243 C Nutrient Block @Francisco Miyara +244 C Pinnacle Kill-Ship @Alexandre Honoré 245 U Survey Mechan @Johann Bodin 247 R Thrumming Hivepool @Rob Rey 248 U Virulent Silencer @Kenn Yap @@ -150,6 +178,7 @@ ScryfallCode=EOE 254 R Godless Shrine @Rob Rey 255 M Kavaron, Memorial World @Adam Paquette 256 R Sacred Foundry @Titus Lunter +257 R Secluded Starforge @Chris Rahn 258 R Stomping Ground @Bruce Brenneise 259 M Susur Secundi, Void Altar @Adam Paquette 260 M Uthros, Titanic Godcore @Adam Paquette @@ -183,8 +212,10 @@ ScryfallCode=EOE 288 R Astelli Reclaimer @Benjamin Ee 289 R Haliya, Guided by Light @Eleonor Piteira 290 R Mm'menon, the Right Hand @Dominik Mayer +291 R Starwinder @Justin Hernandez & Alexis Hernandez 292 M Alpharael, Stonechosen @Jeremy Wilson 293 R Elegy Acolyte @Justin Hernandez & Alexis Hernandez +294 R Xu-Ifit, Osteoharmonist @Ashley Mackenzie 295 R Possibility Technician @Matthew G. Lewis 297 R Mightform Harmonizer @Jessica Fong 298 R Dyadrine, Synthesis Amalgam @Matthew G. Lewis @@ -192,24 +223,35 @@ ScryfallCode=EOE 300 R Ragost, Deft Gastronaut @Dominik Mayer 301 M Sami, Wildcat Captain @Ashley Mackenzie 302 R Syr Vondam, Sunstar Exemplar @Jeremy Wilson +303 R Beyond the Quiet @Serena Malyon 304 M Cosmogrand Zenith @Marlene Yui 305 M Quantum Riddler @Cacho Rubione +306 R Starwinder @Cacho Rubione 307 R Archenemy's Charm @Peter Diamond +308 M Devastating Onslaught @Deb JJ Lee 309 R Nova Hellkite @Micha Huigen 310 R Rust Harvester @Scott Balmer 311 R Weapons Manufacturing @Micha Huigen 312 R Terrasymbiosis @Jack Hughes 313 R Cosmogoyf @Princess Hidir 314 R Mutinous Massacre @Jack Hughes +315 R Space-Time Anomaly @Princess Hidir +316 R Secluded Starforge @ 317 R Anticausal Vestige @Chase Stone 318 M Exalted Sunborn @Scott M. Fischer +319 R Hardlight Containment @Dominik Mayer +321 R Lumen-Class Frigate @Zezhou Chen 323 R The Seriema @Sergey Glushakov 324 R Sunstar Chaplain @Valera Lutfullina 325 R Consult the Star Charts @Antonio José Manzanedo 326 R Emissary Escort @Igor Grechanyi +327 R Moonlit Meditation @Liiga Smilshkalne 328 R Starfield Vocalist @Nathaniel Himawan +329 R Synthesizer Labship @Adrián Rodríguez Pérez 330 M Weftwalking @Rovina Cai 331 R Chorale of the Void @Alix Branwyn +332 R Entropic Battlecruiser @Josiah "Jo" Cameron +333 R Requiem Monolith @Warren Mahy 334 R Sunset Saboteur @Mirko Failoni 335 R Zero Point Ballad @David Astruga 337 R Pain for All @Dmitry Burmak @@ -221,6 +263,7 @@ ScryfallCode=EOE 345 M Ouroboroid @Samuel Perin 347 R Biotech Specialist @Alexandre Honoré 348 R Infinite Guideline Station @Piotr Dura +349 R Pinnacle Emissary @Alejandro Pacheco 350 R Singularity Rupture @Liiga Smilshkalne 351 M Dawnsire, Sunstar Dreadnought @Jaime Jones 352 M The Dominion Bracelet @Nathaniel Himawan @@ -232,6 +275,7 @@ ScryfallCode=EOE 358 M Exalted Sunborn @Makoron 359 M Starfield Vocalist @nina 360 M Sothera, the Supervoid @Mateusz Urbanowicz +361 M Devastating Onslaught @Naochika Morishita 363 M Mutinous Massacre @Aogachou 364 M The Dominion Bracelet @Mai Minamiura 365 M The Endstone @Hidetaka Tenjin @@ -258,6 +302,7 @@ ScryfallCode=EOE 389 M Mutinous Massacre @Aogachou 390 M The Dominion Bracelet @Mai Minamiura 391 M The Endstone @Hidetaka Tenjin +392 M Secluded Starforge @ 393 U Starfield Shepherd @Marta Nael 394 U Annul @Carlos Palma Cruchaga 395 U Umbral Collar Zealot @Dmitry Burmak From a751ad186e61794f92dca49deb4994c55545ea07 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:33:26 +0100 Subject: [PATCH 012/183] Update Edge of Eternities Stellar Sights.txt --- .../Edge of Eternities Stellar Sights.txt | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt index 92825eddb77..18f449540ac 100644 --- a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt +++ b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt @@ -10,78 +10,159 @@ ScryfallCode=EOS 3 R Blinkmoth Nexus @Calder Moore 4 R Bonders' Enclave @Eleonor Piteira 5 R Cascading Cataracts @Andrew Mar +6 R Cathedral of War @Jason A. Engle 7 R Celestial Colonnade @Andrew Mar 8 R Contested War Zone @Josu Solano +9 R Creeping Tar Pit @Calder Moore +10 R Crystal Quarry @Craig Elliott +11 M Deserted Temple @Jason A. Engle 12 M Dust Bowl @Jonas De Ro 13 R Echoing Deeps @Alayna Danner 14 R Eldrazi Temple @Calder Moore 15 R Endless Sands @Tim Brumley 16 M Gemstone Caverns @Mark Poole +17 M Grove of the Burnwillows @Aenami 18 R High Market @Andrew Theophilopoulos +19 R Hissing Quagmire @John Thacker 20 M Inkmoth Nexus @Piotr Dura 21 M Inventors' Fair @Finnian MacManus +22 R Lavaclaw Reaches @Jinho Bae +23 M Lotus Field @Andrew Mar +24 R Lumbering Falls @Daniel Romanovsky 25 M Mana Confluence @Sam Burley 26 R Meteor Crater @Chad Weatherford +27 M Mirrorpool @Tim Brumley 28 M Mutavault @Andrew Mar +29 R Mystifying Maze @Pierre Loyvet +30 R Needle Spires @Lorenzo Lanfranconi 31 R Nesting Grounds @John Thacker 32 M Petrified Field @Finnian MacManus +33 M Plaza of Heroes @John Thacker 34 R Power Depot @Daniel Romanovsky +35 R Raging Ravine @Calder Moore 36 M Reflecting Pool @Craig Elliott 37 R Scavenger Grounds @Andrew Theophilopoulos +38 R Shambling Vent @Mark Poole +39 R Stirring Wildwood @Erikas Perl +40 M Strip Mine @Daniel Romanovsky 41 R Sunken Citadel @Jonas De Ro +42 R Swarmyard @Alayna Danner 43 R Terrain Generator @Cristi Balanescu 44 R Thespian's Stage @Bruce Brenneise +45 R Wandering Fumarole @Cristi Balanescu 46 M Ancient Tomb @Meel Tamphanon 48 R Blinkmoth Nexus @Meel Tamphanon 49 R Bonders' Enclave @BEMOCS 50 R Cascading Cataracts @Sam Chivers +51 R Cathedral of War @William Phifer 52 R Celestial Colonnade @Ann-Sophie De Steur +54 R Creeping Tar Pit @Matteo Bassini 55 R Crystal Quarry @Jack Hughes +56 M Deserted Temple @BEMOCS 57 M Dust Bowl @Aeron Ng 58 R Echoing Deeps @Sam Chivers 59 R Eldrazi Temple @BEMOCS 61 M Gemstone Caverns @BEMOCS +62 M Grove of the Burnwillows @Sam Chivers 63 R High Market @WFlemming Illustration +64 R Hissing Quagmire @William Phifer 65 M Inkmoth Nexus @Matteo Bassini 66 M Inventors' Fair @Sylvia Liu +67 R Lavaclaw Reaches @Matteo Bassini +68 M Lotus Field @Jack Hughes +69 R Lumbering Falls @Aeron Ng 70 M Mana Confluence @Matteo Bassini +71 R Meteor Crater @Ann-Sophie De Steur +72 M Mirrorpool @Ann-Sophie De Steur 73 M Mutavault @Aeron Ng +74 R Mystifying Maze @Lee Art +75 R Needle Spires @BEMOCS 76 R Nesting Grounds @WFlemming Illustration 77 M Petrified Field @WFlemming Illustration +78 M Plaza of Heroes @Elaine Lee 79 R Power Depot @Lazare Gvimradze +80 R Raging Ravine @BEMOCS 81 M Reflecting Pool @Sam Chivers 82 R Scavenger Grounds @BEMOCS +83 R Shambling Vent @ +84 R Stirring Wildwood @Hurca! +85 M Strip Mine @Matteo Bassini 86 R Sunken Citadel @Lazare Gvimradze +87 R Swarmyard @Matteo Bassini 88 R Terrain Generator @BEMOCS 89 R Thespian's Stage @William Phifer +90 R Wandering Fumarole @Sam Chivers +91 M Ancient Tomb @Bruce Brenneise 93 R Blinkmoth Nexus @Calder Moore 94 R Bonders' Enclave @Eleonor Piteira +96 R Cathedral of War @Jason A. Engle 97 R Celestial Colonnade @Andrew Mar +99 R Creeping Tar Pit @Calder Moore 100 R Crystal Quarry @Craig Elliott +101 M Deserted Temple @Jason A. Engle 102 M Dust Bowl @Jonas De Ro +103 R Echoing Deeps @Alayna Danner 104 R Eldrazi Temple @Calder Moore 106 M Gemstone Caverns @Mark Poole +107 M Grove of the Burnwillows @Aenami 108 R High Market @Andrew Theophilopoulos +109 R Hissing Quagmire @John Thacker 110 M Inkmoth Nexus @Piotr Dura +112 R Lavaclaw Reaches @Jinho Bae +113 M Lotus Field @Andrew Mar +114 R Lumbering Falls @Daniel Romanovsky 115 M Mana Confluence @Sam Burley +116 R Meteor Crater @Chad Weatherford +117 M Mirrorpool @Tim Brumley 118 M Mutavault @Andrew Mar 119 R Mystifying Maze @Pierre Loyvet +120 R Needle Spires @Lorenzo Lanfranconi 121 R Nesting Grounds @John Thacker +123 M Plaza of Heroes @John Thacker +125 R Raging Ravine @Calder Moore 126 M Reflecting Pool @Craig Elliott +128 R Shambling Vent @Mark Poole +129 R Stirring Wildwood @Erikas Perl +130 M Strip Mine @Daniel Romanovsky 131 R Sunken Citadel @Jonas De Ro +132 R Swarmyard @Alayna Danner +133 R Terrain Generator @Cristi Balanescu 134 R Thespian's Stage @Bruce Brenneise +135 R Wandering Fumarole @Cristi Balanescu +136 M Ancient Tomb @Meel Tamphanon 138 R Blinkmoth Nexus @Meel Tamphanon 139 R Bonders' Enclave @BEMOCS +141 R Cathedral of War @William Phifer 142 R Celestial Colonnade @Ann-Sophie De Steur +144 R Creeping Tar Pit @Matteo Bassini +145 R Crystal Quarry @Jack Hughes +146 M Deserted Temple @BEMOCS 147 M Dust Bowl @Aeron Ng +148 R Echoing Deeps @Sam Chivers 149 R Eldrazi Temple @BEMOCS 151 M Gemstone Caverns @BEMOCS +152 M Grove of the Burnwillows @Sam Chivers 153 R High Market @WFlemming Illustration +154 R Hissing Quagmire @William Phifer 155 M Inkmoth Nexus @Matteo Bassini +157 R Lavaclaw Reaches @Matteo Bassini +158 M Lotus Field @Jack Hughes +159 R Lumbering Falls @Aeron Ng 160 M Mana Confluence @Matteo Bassini 161 R Meteor Crater @Ann-Sophie De Steur +162 M Mirrorpool @Ann-Sophie De Steur 163 M Mutavault @Aeron Ng +164 R Mystifying Maze @Lee Art +165 R Needle Spires @BEMOCS 166 R Nesting Grounds @WFlemming Illustration +168 M Plaza of Heroes @Elaine Lee +170 R Raging Ravine @BEMOCS 171 M Reflecting Pool @Sam Chivers +173 M Strip Mine @Matteo Bassini +174 R Stirring Wildwood @ +175 M Strip Mine @Matteo Bassini 176 R Sunken Citadel @Lazare Gvimradze +177 R Swarmyard @Matteo Bassini +178 R Terrain Generator @ 179 R Thespian's Stage @William Phifer +180 R Wandering Fumarole @Sam Chivers From 74e587a8a0fe76440a1831d46a1ab98f942de6ff Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:35:13 +0100 Subject: [PATCH 013/183] Update Special Guests.txt --- forge-gui/res/editions/Special Guests.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge-gui/res/editions/Special Guests.txt b/forge-gui/res/editions/Special Guests.txt index 9fd21da4cb5..88500a07c19 100644 --- a/forge-gui/res/editions/Special Guests.txt +++ b/forge-gui/res/editions/Special Guests.txt @@ -131,7 +131,12 @@ ScryfallCode=SPG 117 M Scalding Tarn @Marco Gorlei 118 M Verdant Catacombs @Johannes Voss 119 M Warping Wail @Alex Horley-Orlandelli +120 M Deafening Silence @Skinnyelbows +121 M Robe of Stars @Stephen Andrade 122 M Nexus of Fate @Gaboleps 123 M Paradox Haze @Stephen Andrade +124 M Darkness @Wojtek Łebski 125 R Magus of the Moon @David Robert Hovey +126 M Burgeoning @Stephen Andrade +127 M Green Sun's Zenith @Warren Mahy 128 R Sliver Overlord @James Bousema From 6536d39969d2e95edfdc966fd89e6656daf51125 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Jul 2025 18:59:59 +0800 Subject: [PATCH 014/183] update keybinding for NewGameScene --- forge-gui-mobile/src/forge/adventure/util/KeyBinding.java | 1 + forge-gui/res/adventure/Innistrad/ui/new_game.json | 2 +- forge-gui/res/adventure/common/ui/new_game.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java index fce1a334136..5e122b66db4 100644 --- a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java +++ b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java @@ -21,6 +21,7 @@ public enum KeyBinding { ExitToWorldMap("ExitToWorldMap", new int[]{Input.Keys.F4, Input.Keys.BUTTON_L2}), Bookmark("Bookmark", new int[]{Input.Keys.B, Input.Keys.BUTTON_R2}), Use("Use", new int[]{Input.Keys.ENTER, Input.Keys.BUTTON_A}), + Enter("Enter", new int[]{Input.Keys.ENTER}), Back("Back", new int[]{Input.Keys.ESCAPE, Input.Keys.BUTTON_B, Input.Keys.BACK}), ScrollUp("ScrollUp", new int[]{Input.Keys.PAGE_UP, Input.Keys.BUTTON_L1}), ScrollDown("ScrollDown", new int[]{Input.Keys.PAGE_DOWN, Input.Keys.BUTTON_R1}), diff --git a/forge-gui/res/adventure/Innistrad/ui/new_game.json b/forge-gui/res/adventure/Innistrad/ui/new_game.json index a5298d6fa30..fdb71d59f48 100644 --- a/forge-gui/res/adventure/Innistrad/ui/new_game.json +++ b/forge-gui/res/adventure/Innistrad/ui/new_game.json @@ -219,7 +219,7 @@ "name": "start", "text": "tr(lblStart)", "selectable": true, - "binding": "Status", + "binding": "Enter", "width": 100, "height": 30, "x": 376, diff --git a/forge-gui/res/adventure/common/ui/new_game.json b/forge-gui/res/adventure/common/ui/new_game.json index 8fabf16c6f5..3cd6eebaafb 100644 --- a/forge-gui/res/adventure/common/ui/new_game.json +++ b/forge-gui/res/adventure/common/ui/new_game.json @@ -219,7 +219,7 @@ "name": "start", "text": "tr(lblStart)", "selectable": true, - "binding": "Status", + "binding": "Enter", "width": 100, "height": 30, "x": 376, From b05eb4eed3f4cee4b7dacd4ef3a26a9bf1daff41 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Jul 2025 19:17:36 +0800 Subject: [PATCH 015/183] fix GamePad mapping --- forge-gui-mobile/src/forge/adventure/util/KeyBinding.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java index 5e122b66db4..cb103c6b8a9 100644 --- a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java +++ b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java @@ -21,7 +21,7 @@ public enum KeyBinding { ExitToWorldMap("ExitToWorldMap", new int[]{Input.Keys.F4, Input.Keys.BUTTON_L2}), Bookmark("Bookmark", new int[]{Input.Keys.B, Input.Keys.BUTTON_R2}), Use("Use", new int[]{Input.Keys.ENTER, Input.Keys.BUTTON_A}), - Enter("Enter", new int[]{Input.Keys.ENTER}), + Enter("Enter", new int[]{Input.Keys.ENTER, Input.Keys.BUTTON_START}), Back("Back", new int[]{Input.Keys.ESCAPE, Input.Keys.BUTTON_B, Input.Keys.BACK}), ScrollUp("ScrollUp", new int[]{Input.Keys.PAGE_UP, Input.Keys.BUTTON_L1}), ScrollDown("ScrollDown", new int[]{Input.Keys.PAGE_DOWN, Input.Keys.BUTTON_R1}), From 38da2046074cc4e40fb71017dcc630ccfa13c2d9 Mon Sep 17 00:00:00 2001 From: Eradev Date: Thu, 17 Jul 2025 07:20:15 -0400 Subject: [PATCH 016/183] Try to use current set when creating a card from an effect (#8080) * Fix CardDb fallback --- .../src/main/java/forge/StaticData.java | 2 +- .../src/main/java/forge/card/CardDb.java | 3 ++- .../src/main/java/forge/card/CardEdition.java | 10 +++++++++- .../src/main/java/forge/game/GameFormat.java | 2 +- .../game/ability/effects/MakeCardEffect.java | 7 +++++-- .../src/forge/adventure/data/RewardData.java | 2 +- forge-gui/res/editions/Alchemy Dominaria.txt | 11 +++++++++++ .../Alchemy Horizons Baldur's Gate.txt | 19 ++++++++++++++++++- .../editions/Jumpstart Historic Horizons.txt | 18 ++++++++++++++++++ .../planarconquest/ConquestPlane.java | 2 +- .../forge/gamemodes/quest/BoosterUtils.java | 2 -- .../gamemodes/quest/QuestEventDraft.java | 4 ++-- .../forge/gamemodes/quest/QuestUtilCards.java | 6 +++--- 13 files changed, 72 insertions(+), 16 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index ceacb7dfbbf..388b8707b03 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -790,7 +790,7 @@ public class StaticData { Map> cardCount = new HashMap<>(); List> futures = new ArrayList<>(); - for (CardEdition.EditionEntry c : e.getAllCardsInSet()) { + for (CardEdition.EditionEntry c : e.getObtainableCards()) { if (cardCount.containsKey(c.name())) { cardCount.put(c.name(), Pair.of(c.collectorNumber() != null && c.collectorNumber().startsWith("F"), cardCount.get(c.name()).getRight() + 1)); } else { diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 995c3a82945..461664a123c 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -659,7 +659,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if(cardFromSet != null && request.flags != null) cardFromSet = cardFromSet.copyWithFlags(request.flags); - return cardFromSet; + if (cardFromSet != null) + return cardFromSet; } // 2. Card lookup in edition with specified filter didn't work. diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 316b7f9951f..83e901180c9 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -42,7 +42,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; - /** *

* CardSet class. @@ -384,6 +383,15 @@ public final class CardEdition implements Comparable { public List getCards() { return cardMap.get(EditionSectionWithCollectorNumbers.CARDS.getName()); } public List getRebalancedCards() { return cardMap.get(EditionSectionWithCollectorNumbers.REBALANCED.getName()); } public List getFunnyEternalCards() { return cardMap.get(EditionSectionWithCollectorNumbers.ETERNAL.getName()); } + public List getObtainableCards() { + List allCards = new ArrayList<>(getAllCardsInSet()); + List conjuredCards = cardMap.get(EditionSectionWithCollectorNumbers.CONJURED.getName()); + if (conjuredCards != null) { + allCards.removeAll(conjuredCards); + } + + return allCards; + } public List getAllCardsInSet() { return cardsInSet; } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 943cf9ee9c4..c467f0e04c8 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -226,7 +226,7 @@ public class GameFormat implements Comparable { for (String setCode : allowedSetCodes_ro) { CardEdition edition = StaticData.instance().getEditions().get(setCode); if (edition != null) { - for (EditionEntry card : edition.getAllCardsInSet()) { + for (EditionEntry card : edition.getObtainableCards()) { if (!bannedCardNames_ro.contains(card.name())) { PaperCard pc = commonCards.getCard(card.name(), setCode, card.collectorNumber()); if (pc != null) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java index 8ff2792d476..bb1dc90d20f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -3,6 +3,7 @@ package forge.game.ability.effects; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import forge.StaticData; +import forge.card.CardEdition; import forge.card.ICardFace; import forge.game.Game; import forge.game.GameEntityCounterTable; @@ -150,7 +151,9 @@ public class MakeCardEffect extends SpellAbilityEffect { if (pack != null) { pc = Iterables.getLast(IterableUtil.filter(pack, PaperCardPredicates.name(name))); } else { - pc = StaticData.instance().getCommonCards().getUniqueByName(name); + // Try to get the card in the sa host's current edition + String editionCode = sa.getHostCard() != null ? sa.getHostCard().getSetCode() : CardEdition.UNKNOWN_CODE; + pc = StaticData.instance().getCommonCards().getCard(name, editionCode); } Card card = Card.fromPaperCard(pc, player); @@ -183,7 +186,7 @@ public class MakeCardEffect extends SpellAbilityEffect { Card cc; if (c.getZone().getZoneType().equals(ZoneType.None)) cc = c; else { // make another copy - PaperCard next = StaticData.instance().getCommonCards().getUniqueByName(c.getName()); + PaperCard next = StaticData.instance().getCommonCards().getCard(c.getName(), c.getSetCode()); cc = Card.fromPaperCard(next, player); game.getAction().moveTo(ZoneType.None, cc, sa, moveParams); } diff --git a/forge-gui-mobile/src/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java index d88c0c793a4..39e73bd97b8 100644 --- a/forge-gui-mobile/src/forge/adventure/data/RewardData.java +++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java @@ -241,7 +241,7 @@ public class RewardData implements Serializable { for(String restrictedCard: configData.restrictedCards) { allEditions.removeIf( - cardEdition -> cardEdition.getAllCardsInSet().stream().anyMatch( + cardEdition -> cardEdition.getObtainableCards().stream().anyMatch( o -> o.name().equals(restrictedCard)) ); } diff --git a/forge-gui/res/editions/Alchemy Dominaria.txt b/forge-gui/res/editions/Alchemy Dominaria.txt index fca98ec9860..06f96543ce1 100644 --- a/forge-gui/res/editions/Alchemy Dominaria.txt +++ b/forge-gui/res/editions/Alchemy Dominaria.txt @@ -37,3 +37,14 @@ ScryfallCode=YDMU 28 R Tiana, Angelic Mechanic @Joseph Weston 29 R Vodalian Tide Mage @Brian Valeza 30 R Coalition Construct @Artur Treffner + +[conjured] +32 M Ancestral Recall @Ryan Pancoast +33 M Time Walk @Chris Rahn +34 M Timetwister @Matt Stewart +35 M Black Lotus @Chris Rahn +36 M Mox Emerald @Volkan Baǵa +37 M Mox Jet @Volkan Baǵa +38 M Mox Pearl @Volkan Baǵa +39 M Mox Ruby @Volkan Baǵa +40 M Mox Sapphire @Volkan Baǵa diff --git a/forge-gui/res/editions/Alchemy Horizons Baldur's Gate.txt b/forge-gui/res/editions/Alchemy Horizons Baldur's Gate.txt index d92a9df83bd..b33457ca3f2 100644 --- a/forge-gui/res/editions/Alchemy Horizons Baldur's Gate.txt +++ b/forge-gui/res/editions/Alchemy Horizons Baldur's Gate.txt @@ -339,4 +339,21 @@ A262 U A-Navigation Orb @Robin Olausson 45g R Hag of Scoured Thoughts @Konstantin Porubov 45h R Hag of Syphoned Breath @Konstantin Porubov 45i R Hag of Twisted Visions @Konstantin Porubov - +902 U Archipelagore @Svetlin Velinov +903 U Junk Winder @Campbell White +904 C Moat Piranhas @Rudy Siswanto +905 C Mystic Skyfish @Alayna Danner +906 R Nadir Kraken @Dan Murayama Scott +907 R Nezahal, Primal Tide @Sam Burley +908 U Pouncing Shoreshark @Dan Murayama Scott +909 R Pursued Whale @Jonathan Kuo +910 C Riptide Turtle @Brian Valeza +911 U Ruin Crab @Simon Dominic +912 R Sea-Dasher Octopus @Chris Seaman +913 U Sigiled Starfish @Nils Hamm +914 C Spined Megalodon @Daniel Ljunggren +915 U Stinging Lionfish @Christopher Burdett +916 R Voracious Greatshark @Mathias Kollros +926 R Lightning Bolt @Irina Nordsol +927 C Naturalize @Tim Hildebrandt +928 C Plummet @Alix Branwyn \ No newline at end of file diff --git a/forge-gui/res/editions/Jumpstart Historic Horizons.txt b/forge-gui/res/editions/Jumpstart Historic Horizons.txt index 301e26e065d..a9ae6c8d78d 100644 --- a/forge-gui/res/editions/Jumpstart Historic Horizons.txt +++ b/forge-gui/res/editions/Jumpstart Historic Horizons.txt @@ -383,3 +383,21 @@ ScryfallCode=J21 [rebalanced] A438 U A-Dragon's Rage Channeler @Martina Fackova A529 C A-Unholy Heat @Kari Christensen + +[conjured] +777 C Light of Hope @Kimonas Theodossiou +778 U Stormfront Pegasus @rk post +779 U Swords to Plowshares @Sam Wolfe Connelly +780 C Force Spike @Nelson DeCastro +781 C Kraken Hatchling @Jason Felix +782 C Ponder @Dan Murayama Scott +783 C Dark Ritual @Clint Langley +784 C Duress @Steven Belledin +785 U Reassembling Skeleton @Austin Hsu +786 C Assault Strobe @Kev Walker +787 C Lightning Bolt @Christopher Moeller +788 R Shivan Dragon @Donato Giancola +789 C Fog @Jaime Jones +790 C Giant Growth @Matt Cavotta +791 R Regal Force @Brandon Kitkouski +792 R Tropical Island @Franz Vohwinkel diff --git a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java index a442e1d9322..70caed02419 100644 --- a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java @@ -193,7 +193,7 @@ public class ConquestPlane { if (edition == null) continue; - for (EditionEntry card : edition.getAllCardsInSet()) { + for (EditionEntry card : edition.getObtainableCards()) { if (bannedCardSet == null || !bannedCardSet.contains(card.name())) { addCard(commonCards.getCard(card.name(), setCode)); } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java index d045062cf66..ceea7e594e9 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java @@ -199,7 +199,6 @@ public final class BoosterUtils { } return output; - } private static List> getColorFilters(final StartingPoolPreferences userPrefs, final List cardPool) { @@ -241,7 +240,6 @@ public final class BoosterUtils { } return colorFilters; - } private static void populateRandomFilters(final List> colorFilters) { diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestEventDraft.java index aabf7067426..2b5649eeeb0 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestEventDraft.java @@ -445,7 +445,7 @@ public class QuestEventDraft implements IQuestEvent { final List cardNames = new ArrayList<>(); for (final CardEdition edition : getAllEditions()) { - for (final EditionEntry card : edition.getAllCardsInSet()) { + for (final EditionEntry card : edition.getObtainableCards()) { if (card.rarity() == CardRarity.Rare || card.rarity() == CardRarity.MythicRare) { final PaperCard cardToAdd = FModel.getMagicDb().getCommonCards().getCard(card.name(), edition.getCode()); if (cardToAdd != null && !cardNames.contains(cardToAdd.getName())) { @@ -471,7 +471,7 @@ public class QuestEventDraft implements IQuestEvent { final List cardsInEdition = new ArrayList<>(); final List cardNames = new ArrayList<>(); - for (final EditionEntry card : randomEdition.getAllCardsInSet()) { + for (final EditionEntry card : randomEdition.getObtainableCards()) { if (card.rarity() == CardRarity.Rare || card.rarity() == CardRarity.MythicRare) { if (!cardNames.contains(card.name())) { cardsInEdition.add(card); diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java index a5a656876cf..853751014e3 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java @@ -505,7 +505,7 @@ public final class QuestUtilCards { } /** - * Generate boosters in shop. + * Generate singles in shop. * * @param quantity the count */ @@ -550,7 +550,7 @@ public final class QuestUtilCards { } /** - * Generate precons in shop. + * Generate tournament packs in shop. * * @param count * the count @@ -565,7 +565,7 @@ public final class QuestUtilCards { } /** - * Generate precons in shop. + * Generate fat packs in shop. * * @param count * the count From b4c87a198a5bde11380115f3091932da0efeefa5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Jul 2025 20:02:06 +0800 Subject: [PATCH 017/183] fix enter key and textfield keypress collision --- forge-gui-mobile/src/forge/adventure/scene/UIScene.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java index e0567503e71..bb57178c059 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java @@ -65,8 +65,8 @@ public class UIScene extends Scene { //actor.fire(UIScene.eventExit()); } - public void onPressDown(UIScene scene) { - if (actor instanceof TextField) { + public void onPressDown(UIScene scene, int keycode) { + if (actor instanceof TextField && Input.Keys.ENTER != keycode) { scene.requestTextInput(((TextField) actor).getText(), text -> ((TextField) actor).setText(text)); } @@ -347,7 +347,7 @@ public class UIScene extends Scene { Selectable selection = getSelected(); if (KeyBinding.Use.isPressed(keycode)) { if (selection != null) { - selection.onPressDown(this); + selection.onPressDown(this, keycode); } } From a15ebe86dba3f463cfcc93cdaca71439e1c0172d Mon Sep 17 00:00:00 2001 From: loud1990 <49922764+loud1990@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:32:05 -0400 Subject: [PATCH 018/183] Cleaned up mechan_assembler and weftstalker_ardent triggerzones (#8088) --- forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt | 2 +- forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt b/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt index 432af665810..246f186fbd7 100644 --- a/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt +++ b/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt @@ -2,7 +2,7 @@ Name:Mechan Assembler ManaCost:4 U Types:Artifact Creature Robot Artificer PT:4/4 -T:Mode$ ChangesZone | ValidCard$ Artifact.Other+YouCtrl | Destination$ Battlefield | Execute$ TrigToken | ActivationLimit$ 1 | TriggerDescription$ Whenever another artifact you control enters, create a 2/2 colorless Robot artifact creature token. This ability triggers only once each turn. +T:Mode$ ChangesZone | ValidCard$ Artifact.Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigToken | ActivationLimit$ 1 | TriggerDescription$ Whenever another artifact you control enters, create a 2/2 colorless Robot artifact creature token. This ability triggers only once each turn. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot DeckHas:Ability$Token Oracle:Whenever another artifact you control enters, create a 2/2 colorless Robot artifact creature token. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt b/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt index 94caa16933c..95d1a66095e 100644 --- a/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt +++ b/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt @@ -2,7 +2,7 @@ Name:Weftstalker Ardent ManaCost:2 R Types:Creature Drix Artificer PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl,Artifact.Other+YouCtrl | Execute$ TrigDamage | TriggerDescription$ Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl,Artifact.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent. SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 K:Warp:R Oracle:Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent.\nWarp {R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file From ddbe2d6051a411827d0f43f36f931506906be029 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:22:30 +0200 Subject: [PATCH 019/183] 3 EOE cards (July 17th) (#8087) --- .../res/cardsfolder/upcoming/fallers_faithful.txt | 9 +++++++++ .../res/cardsfolder/upcoming/meltstriders_resolve.txt | 10 ++++++++++ .../cardsfolder/upcoming/tannuk_steadfast_second.txt | 9 +++++++++ 3 files changed, 28 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt b/forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt new file mode 100644 index 00000000000..4d098265461 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt @@ -0,0 +1,9 @@ +Name:Faller's Faithful +ManaCost:2 B +Types:Creature Human Wizard +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When this creature enters, destroy up to one other target creature. If that creature wasn't dealt damage this turn, its controller draws two cards. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Other | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDraw | TgtPrompt$ Select another target creature +SVar:DBDraw:DB$ Draw | NumCards$ 2 | Defined$ TargetedController | ConditionDefined$ Targeted | ConditionPresent$ Card.!wasDealtDamageThisTurn +SVar:PlayMain1:TRUE +Oracle:When this creature enters, destroy up to one other target creature. If that creature wasn't dealt damage this turn, its controller draws two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt b/forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt new file mode 100644 index 00000000000..db76d104b74 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt @@ -0,0 +1,10 @@ +Name:Meltstrider's Resolve +ManaCost:G +Types:Enchantment Aura +K:Enchant:Creature.YouCtrl:creature you control +SVar:AttachAILogic:Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When this Aura enters, enchanted creature fights up to one target creature an opponent controls. (Each deals damage equal to its power to the other.) +SVar:TrigFight:DB$ Fight | Defined$ Enchanted | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one target creature an opponent controls | TargetMin$ 0 | TargetMax$ 1 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddToughness$ 2 | Description$ Enchanted creature gets +0/+2 and can't be blocked by more than one creature. +S:Mode$ MinMaxBlocker | ValidCard$ Creature.EnchantedBy | Max$ 1 | Secondary$ True | Description$ Enchanted creature gets +0/+2 and can't be blocked by more than one creature. +Oracle:Enchant creature you control\nWhen this Aura enters, enchanted creature fights up to one target creature an opponent controls. (Each deals damage equal to its power to the other.)\nEnchanted creature gets +0/+2 and can't be blocked by more than one creature. diff --git a/forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt b/forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt new file mode 100644 index 00000000000..b16803250a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt @@ -0,0 +1,9 @@ +Name:Tannuk, Steadfast Second +ManaCost:2 R R +Types:Legendary Creature Kavu Pilot +PT:3/5 +S:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddKeyword$ Haste | Description$ Other creatures you control have haste. +S:Mode$ Continuous | Affected$ Artifact.YouOwn,Creature.Red+YouOwn | EffectZone$ Battlefield | AffectedZone$ Hand | AddKeyword$ Warp:2 R | Description$ Artifact cards and red creature cards in your hand have warp {2}{R}. (You may cast a card from your hand for its warp cost. Exile that permanent at the beginning of the next end step, then you may cast it from exile on a later turn.) +SVar:PlayMain1:TRUE +SVar:BuffedBy:Creature +Oracle:Other creatures you control have haste.\nArtifact cards and red creature cards in your hand have warp {2}{R}. (You may cast a card from your hand for its warp cost. Exile that permanent at the beginning of the next end step, then you may cast it from exile on a later turn.) From b44738cda3a8d0223761a2be943f3a0119c5d09b Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:23:48 +0200 Subject: [PATCH 020/183] 5 EOE cards (July 17th) (#8089) --- forge-gui/res/cardsfolder/upcoming/cerebral_download.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt | 8 ++++++++ 5 files changed, 38 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/cerebral_download.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cerebral_download.txt b/forge-gui/res/cardsfolder/upcoming/cerebral_download.txt new file mode 100644 index 00000000000..d396b5dd894 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cerebral_download.txt @@ -0,0 +1,8 @@ +Name:Cerebral Download +ManaCost:4 U +Types:Instant +A:SP$ Surveil | Amount$ X | SubAbility$ DBDraw | SpellDescription$ Surveil X, where X is the number of artifacts you control. Then draw three cards. (To surveil X, look at the top X cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +SVar:DBDraw:DB$ Draw | NumCards$ 3 +SVar:X:Count$Valid Artifact.YouCtrl +DeckHas:Ability$Surveil|Graveyard +Oracle:Surveil X, where X is the number of artifacts you control. Then draw three cards. (To surveil X, look at the top X cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt b/forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt new file mode 100644 index 00000000000..055087e6a60 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt @@ -0,0 +1,8 @@ +Name:Codecracker Hound +ManaCost:2 U +Types:Creature Dog +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When this creature enters, look at the top two cards of your library. Put one of them into your hand and the other into your graveyard. +SVar:TrigDig:DB$ Dig | DigNum$ 2 | ChangeNum$ 1 | DestinationZone2$ Graveyard | NoReveal$ True +K:Warp:2 U +Oracle:When this creature enters, look at the top two cards of your library. Put one of them into your hand and the other into your graveyard.\nWarp {2}{U} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt b/forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt new file mode 100644 index 00000000000..7576581ad75 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt @@ -0,0 +1,7 @@ +Name:Gigastorm Titan +ManaCost:4 U +Types:Creature Elemental +PT:4/4 +S:Mode$ ReduceCost | ValidCard$ Card.Self | EffectZone$ All | Type$ Spell | Amount$ 3 | CheckSVar$ X | SVarCompare$ GE1 | Description$ This spell costs {3} less to cast if you've cast another spell this turn. +SVar:X:Count$ThisTurnCast_Card.YouCtrl +Oracle:This spell cost {3} less to cast if you've cast another spell this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt b/forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt new file mode 100644 index 00000000000..c4b8c56deac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt @@ -0,0 +1,7 @@ +Name:Lashwhip Predator +ManaCost:4 G G +Types:Creature Plant Beast +PT:5/7 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Creature.OppCtrl | PresentCompare$ GE3 | Description$ This spell costs {2} less to cast if your opponents control three or more creatures. +K:Reach +Oracle:This spell costs {2} less to cast if your opponents control three or more creatures.\nReach diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt b/forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt new file mode 100644 index 00000000000..d83855fa77c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt @@ -0,0 +1,8 @@ +Name:Mechan Navigator +ManaCost:1 U +Types:Artifact Creature Robot Pilot +PT:2/1 +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever this creature becomes tapped, draw a card, then discard a card. +SVar:TrigDraw:DB$ Draw | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +Oracle:Whenever this creature becomes tapped, draw a card, then discard a card. From 02789188861656daf352742455232cd20add248d Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:20:27 +0200 Subject: [PATCH 021/183] Blade of the Swarm (EOE) (#8090) --- .../res/cardsfolder/upcoming/blade_of_the_swarm.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt b/forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt new file mode 100644 index 00000000000..8db3741e276 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt @@ -0,0 +1,10 @@ +Name:Blade of the Swarm +ManaCost:3 B +Types:Creature Insect Assassin +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When this creature enters, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBCounter,DBChangeZone +SVar:DBCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on this creature. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Exile | ValidTgts$ Card.withWarp | TgtPrompt$ Select target exiled card with warp | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target exiled card with warp on the bottom of its owner's library. +DeckHas:Ability$Counters +Oracle:When this creature enters, choose one —\n• Put two +1/+1 counters on this creature.\n• Put target exiled card with warp on the bottom of its owner's library. From 14af90cd27b7102a2d16e8332a9897a5727c4a77 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 17 Jul 2025 18:57:07 +0000 Subject: [PATCH 022/183] Henzie day: fix copied spell gaining Blitz (#8092) --- .../src/main/java/forge/game/GameAction.java | 2 +- .../java/forge/game/ability/AbilityUtils.java | 10 +++---- .../game/ability/effects/PermanentEffect.java | 30 ++++++++++--------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index b8bf0809478..09faddb309b 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -449,7 +449,7 @@ public class GameAction { if (zoneFrom.is(ZoneType.Stack) && toBattlefield) { // 400.7a Effects from static abilities that give a permanent spell on the stack an ability // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. - if (c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) { + if (c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getKeywords().contains(c.getCastSA().getKeyword())) { KeywordInterface ki = c.getCastSA().getKeyword(); ki.setHostCard(copied); copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getGameTimestamp(), null, true); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 7a6858f9e73..1f7da6d1470 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -794,7 +794,7 @@ public class AbilityUtils { public static List getDefinedEntities(final Card card, final String[] def, final CardTraitBase sa) { final List objects = new ArrayList<>(); for (String d : def) { - objects.addAll(AbilityUtils.getDefinedEntities(card, d, sa)); + objects.addAll(getDefinedEntities(card, d, sa)); } return objects; } @@ -1351,7 +1351,7 @@ public class AbilityUtils { } return; } - AbilityUtils.resolveApiAbility(sa, game); + resolveApiAbility(sa, game); } private static void resolvePreAbilities(final SpellAbility sa, final Game game) { @@ -1373,7 +1373,7 @@ public class AbilityUtils { AbilitySub giftAbility = (AbilitySub) sa.getAdditionalAbility("GiftAbility"); if (giftAbility != null) { giftAbility.setActivatingPlayer(controller); - AbilityUtils.resolveApiAbility(giftAbility, game); + resolveApiAbility(giftAbility, game); } } } @@ -1395,7 +1395,7 @@ public class AbilityUtils { } else { game.getTriggerHandler().resetActiveTriggers(); } - AbilityUtils.resolveApiAbility(abSub, game); + resolveApiAbility(abSub, game); } private static void resolveApiAbility(final SpellAbility sa, final Game game) { @@ -2486,7 +2486,7 @@ public class AbilityUtils { if (sq[0].startsWith("TypesSharedWith")) { Set thisTypes = Sets.newHashSet(c.getType().getCoreTypes()); Set matches = new HashSet<>(); - for (Card c1 : AbilityUtils.getDefinedCards(ctb.getHostCard(), l[0].split(" ", 2)[1], ctb)) { + for (Card c1 : getDefinedCards(ctb.getHostCard(), l[0].split(" ", 2)[1], ctb)) { for (CardType.CoreType type : Sets.newHashSet(c1.getType().getCoreTypes())) { if (thisTypes.contains(type)) { matches.add(type); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java index 378a44ba020..a84981cb4a0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java @@ -28,22 +28,24 @@ public class PermanentEffect extends SpellAbilityEffect { final Map moveParams = AbilityKey.newMap(); final CardZoneTable table = AbilityKey.addCardZoneTableParams(moveParams, sa); - final Card c = game.getAction().moveToPlay(host, host.getController(), sa, moveParams); + final Card c = game.getAction().moveToPlay(host, sa, moveParams); sa.setHostCard(c); - // some extra for Dashing - if (sa.isDash() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Dash"), c.getGame().getNextTimestamp(), 0); - registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c)); - } - // similar for Blitz keyword - if (sa.isBlitz() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Blitz"), c.getGame().getNextTimestamp(), 0); - registerDelayedTrigger(sa, "Sacrifice", Lists.newArrayList(c)); - } - if (sa.isWarp() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Warp"), c.getGame().getNextTimestamp(), 0); - registerDelayedTrigger(sa, "Exile", Lists.newArrayList(c)); + if (sa.isIntrinsic() || c.wasCast()) { + // some extra for Dashing + if (sa.isDash() && c.isInPlay()) { + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Dash"), c.getGame().getNextTimestamp(), 0); + registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c)); + } + // similar for Blitz keyword + if (sa.isBlitz() && c.isInPlay()) { + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Blitz"), c.getGame().getNextTimestamp(), 0); + registerDelayedTrigger(sa, "Sacrifice", Lists.newArrayList(c)); + } + if (sa.isWarp() && c.isInPlay()) { + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Warp"), c.getGame().getNextTimestamp(), 0); + registerDelayedTrigger(sa, "Exile", Lists.newArrayList(c)); + } } table.triggerChangesZoneAll(game, sa); From b785a84dcabf7fc46cf0142e51bd94c629a02dd7 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:16:32 +0200 Subject: [PATCH 023/183] Mm'menon, Uthros Exile and Pull Through the Weft (EOE) (#8093) --- .../res/cardsfolder/upcoming/mmmenon_uthros_exile.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/pull_through_the_weft.txt | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt b/forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt new file mode 100644 index 00000000000..75fec66251d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt @@ -0,0 +1,10 @@ +Name:Mm'menon, Uthros Exile +ManaCost:1 U R +Types:Legendary Creature Jellyfish Advisor +PT:1/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an artifact you control enters, put a +1/+1 counter on target creature. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 +SVar:BuffedBy:Artifact +DeckHas:Ability$Counters +Oracle:Flying\nWhenever an artifact you control enters, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt b/forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt new file mode 100644 index 00000000000..2b67223ce2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt @@ -0,0 +1,7 @@ +Name:Pull Through the Weft +ManaCost:3 G G +Types:Sorcery +A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand+YouOwn | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target nonland permanent card in your graveyard | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBChangeZone | SpellDescription$ Return up to two target nonland permanent cards from your graveyard to your hand, then return up to two target land cards from your graveyard to the battlefield tapped. +SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Land.YouOwn | TgtPrompt$ Choose target land card in your graveyard | TargetMin$ 0 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True +DeckHints:Ability$Graveyard|Discard +Oracle:Return up to two target nonland permanent cards from your graveyard to your hand, then return up to two target land cards from your graveyard to the battlefield tapped. From 0d40508e69c2f98be68dd81d74e8b179819702ed Mon Sep 17 00:00:00 2001 From: Eradev Date: Thu, 17 Jul 2025 13:19:00 -0400 Subject: [PATCH 024/183] Remove conjured cards from rewards --- forge-core/src/main/java/forge/card/CardDb.java | 6 ++++-- forge-core/src/main/java/forge/card/CardEdition.java | 12 ++++++++++++ .../main/java/forge/item/PaperCardPredicates.java | 5 ++++- .../src/forge/adventure/data/RewardData.java | 4 ++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 461664a123c..3b4aa4e321a 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -1134,8 +1134,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public Predicate wasPrintedInSets(Collection setCodes) { Set sets = new HashSet<>(setCodes); return paperCard -> getAllCards(paperCard.getName()).stream() - .map(PaperCard::getEdition) - .anyMatch(sets::contains); + .map(PaperCard::getEdition).anyMatch(editionCode -> + sets.contains(editionCode) && + StaticData.instance().getCardEdition(editionCode).isCardObtainable(paperCard.getName()) + ); } // This Predicate validates if a card is legal in a given format (identified by the list of allowed sets) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 83e901180c9..4171bee4547 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -437,6 +437,15 @@ public final class CardEdition implements Comparable { return false; } + public boolean isCardObtainable(String cardName) { + for (EditionEntry ee : cardMap.get(EditionSectionWithCollectorNumbers.CONJURED.getName())) { + if (ee.name.equals(cardName)) { + return false; + } + } + return true; + } + public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others public Multimap getTokens() { return tokenMap; } @@ -547,6 +556,9 @@ public final class CardEdition implements Comparable { List sheets = Lists.newArrayList(); for (String sectionName : cardMap.keySet()) { + if (sectionName.equals(EditionSectionWithCollectorNumbers.CONJURED.getName())) { + continue; + } PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sectionName)); List cards = cardMap.get(sectionName); diff --git a/forge-core/src/main/java/forge/item/PaperCardPredicates.java b/forge-core/src/main/java/forge/item/PaperCardPredicates.java index 0a26bc5aad7..2bc72a6b38b 100644 --- a/forge-core/src/main/java/forge/item/PaperCardPredicates.java +++ b/forge-core/src/main/java/forge/item/PaperCardPredicates.java @@ -1,6 +1,8 @@ package forge.item; import com.google.common.collect.Lists; + +import forge.StaticData; import forge.card.*; import forge.util.PredicateString; import org.apache.commons.lang3.StringUtils; @@ -87,7 +89,8 @@ public abstract class PaperCardPredicates { @Override public boolean test(final PaperCard card) { - return this.sets.contains(card.getEdition()) == this.mustContain; + return this.sets.contains(card.getEdition()) == this.mustContain && + StaticData.instance().getCardEdition(card.getEdition()).isCardObtainable(card.getName()); } private PredicateSets(final List wantSets, final boolean shouldContain) { diff --git a/forge-gui-mobile/src/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java index 39e73bd97b8..fe4ab7c0e46 100644 --- a/forge-gui-mobile/src/forge/adventure/data/RewardData.java +++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java @@ -118,6 +118,10 @@ public class RewardData implements Serializable { return false; return !Arrays.asList(configData.restrictedCards).contains(input.getName()); }); + + // Only allow obtainable cards + allCards = IterableUtil.filter(allCards, input -> StaticData.instance().getCardEdition(input.getEdition()).isCardObtainable(input.getCardName())); + //Filter AI cards for enemies. allEnemyCards= IterableUtil.filter(allCards, input -> { if (input == null) return false; From 655d01114c67fdacd7eb2c4f16d726c00ef3548f Mon Sep 17 00:00:00 2001 From: shenshinoman <97695393+shenshinoman@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:29:54 -0400 Subject: [PATCH 025/183] Cleaning up Innistrad structure (#8058) * Cleaning up the file structure to move all Innistrad maps under the Innistrad folder, as well as some minor logic change to Shandalar Old Border's config.json to make maintenance easier. (By setting the desired sets in allowedEditions, we no longer have to restrict every new edition as it comes in.) Finally, added block info for Alchemy: Innistrad, so it should start being available in events as well. * Cleaning up the file structure to move all Innistrad maps under the Innistrad folder, as well as some minor logic change to Shandalar Old Border's config.json to make maintenance easier. (By setting all the desired sets to be viewed in allowedEditions, it will only shows those, and we no longer have to restrict every new edition as it comes in.) Also fixed a bug making the "Ghost Town" not work in Shandalar Old Border Finally, added block info for Alchemy: Innistrad, so it should start being available in events as well. * Update Adventure - Guardian Gladiolus.dck --------- Co-authored-by: Hans Mackowiak --- forge-gui/res/adventure/Innistrad/config.json | 3 +- .../Innistrad/maps/Innistrad.tiled-project | 17 + .../cave/inn_cave_river_entrance.tmx | 108 +- .../Innistrad}/cave/inn_cave_river_lair.tmx | 64 +- .../hunting_lodge/inn_forgotten_lodge_1.tmx | 36 +- .../Innistrad}/hunting_lodge/inn_lodge_1.tmx | 34 +- .../inn_approaches/davriels_mansion.tmx | 74 +- .../inn_approaches/davriels_mansion_2.tmx | 0 .../davriels_mansion_dungeon.tmx | 0 .../map/Innistrad}/library/inn_library.tmx | 2 +- .../Innistrad}/main_story/inn_crescentus.tmx | 16 +- .../Innistrad}/towns/inn_ulvenwald_hamlet.tmx | 22 +- .../Innistrad}/towns/inn_ulvenwald_town.tmx | 30 +- .../towns/inn_ulvenwald_village.tmx | 26 +- .../tileset/INN_dungen_crawler_tileset.tsx | 4 +- .../tileset}/INN_tiles/dungen_crawler.png | Bin .../tileset}/INN_tiles/dungen_crawler.xcf | Bin .../INN_tiles/inn_colorless_structures.xcf | Bin .../maps/tileset/Inn_Dungeon.tsx | 0 .../maps/tileset/Inn_dungeon.png | Bin .../maps/tileset/buildings-nocollide.tsx | 4 + .../Innistrad/maps/tileset/buildings.atlas | 638 +++ .../Innistrad/maps/tileset/buildings.png | Bin 0 -> 240599 bytes .../Innistrad/maps/tileset/buildings.tsx | 4019 +++++++++++++++++ .../Innistrad/maps/tileset/buildings.xcf | Bin 0 -> 815977 bytes .../maps/tileset/inn_buildings.atlas | 0 .../maps/tileset/inn_dungeon_floor.png | Bin .../maps/tileset/inn_dungeon_floor.tsx | 0 .../maps/tileset/inn_main.png | Bin .../Innistrad/maps/tileset/inn_main.tsx | 2233 +++++++++ .../maps/tileset/inn_main.xcf | Bin .../Innistrad/world/points_of_interest.json | 28 +- .../Shandalar Old Border/config.json | 576 +-- .../world/points_of_interest.json | 2 +- .../common/maps/tileset/inn_main.tsx | 1064 ----- forge-gui/res/blockdata/blocks.txt | 1 + 36 files changed, 7188 insertions(+), 1813 deletions(-) create mode 100644 forge-gui/res/adventure/Innistrad/maps/Innistrad.tiled-project rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/cave/inn_cave_river_entrance.tmx (88%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/cave/inn_cave_river_lair.tmx (80%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/hunting_lodge/inn_forgotten_lodge_1.tmx (71%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/hunting_lodge/inn_lodge_1.tmx (67%) rename forge-gui/res/adventure/{common/maps/map/main_story => Innistrad/maps/map/Innistrad}/inn_approaches/davriels_mansion.tmx (91%) rename forge-gui/res/adventure/{common/maps/map/main_story => Innistrad/maps/map/Innistrad}/inn_approaches/davriels_mansion_2.tmx (100%) rename forge-gui/res/adventure/{common/maps/map/main_story => Innistrad/maps/map/Innistrad}/inn_approaches/davriels_mansion_dungeon.tmx (100%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/library/inn_library.tmx (99%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/main_story/inn_crescentus.tmx (92%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/towns/inn_ulvenwald_hamlet.tmx (72%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/towns/inn_ulvenwald_town.tmx (67%) rename forge-gui/res/adventure/{common/maps/map => Innistrad/maps/map/Innistrad}/towns/inn_ulvenwald_village.tmx (70%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/INN_dungen_crawler_tileset.tsx (97%) rename forge-gui/res/adventure/{common/world/tilesets => Innistrad/maps/tileset}/INN_tiles/dungen_crawler.png (100%) rename forge-gui/res/adventure/{common/world/tilesets => Innistrad/maps/tileset}/INN_tiles/dungen_crawler.xcf (100%) rename forge-gui/res/adventure/{common/world/tilesets => Innistrad/maps/tileset}/INN_tiles/inn_colorless_structures.xcf (100%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/Inn_Dungeon.tsx (100%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/Inn_dungeon.png (100%) create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/buildings-nocollide.tsx create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/buildings.atlas create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/buildings.png create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/buildings.tsx create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/buildings.xcf rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/inn_buildings.atlas (100%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/inn_dungeon_floor.png (100%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/inn_dungeon_floor.tsx (100%) rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/inn_main.png (100%) create mode 100644 forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.tsx rename forge-gui/res/adventure/{common => Innistrad}/maps/tileset/inn_main.xcf (100%) delete mode 100644 forge-gui/res/adventure/common/maps/tileset/inn_main.tsx diff --git a/forge-gui/res/adventure/Innistrad/config.json b/forge-gui/res/adventure/Innistrad/config.json index 57fde877508..8118b5b6b0d 100644 --- a/forge-gui/res/adventure/Innistrad/config.json +++ b/forge-gui/res/adventure/Innistrad/config.json @@ -102,7 +102,8 @@ "ISD", "DKA", "SOI", - "MID" + "MID", + "YMID" ], "allowedJumpstart": [ "Innistrad", diff --git a/forge-gui/res/adventure/Innistrad/maps/Innistrad.tiled-project b/forge-gui/res/adventure/Innistrad/maps/Innistrad.tiled-project new file mode 100644 index 00000000000..16278ebac3a --- /dev/null +++ b/forge-gui/res/adventure/Innistrad/maps/Innistrad.tiled-project @@ -0,0 +1,17 @@ +{ + "automappingRulesFile": "", + "commands": [ + ], + "compatibilityVersion": 1100, + "extensionsPath": "../../common/maps/extensions", + "folders": [ + ".", + "../../common/maps/obj", + "../../common/maps/extensions", + "../../common/maps/tileset" + ], + "properties": [ + ], + "propertyTypes": [ + ] +} diff --git a/forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_entrance.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_entrance.tmx similarity index 88% rename from forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_entrance.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_entrance.tmx index 98d46251c94..a5e8167f30b 100644 --- a/forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_entrance.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_entrance.tmx @@ -1,9 +1,9 @@ - - - - - + + + + + 2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516, @@ -404,94 +404,94 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + [ { @@ -502,7 +502,7 @@ ] - + [ { @@ -513,12 +513,12 @@ ] - + - + [{ "type": "randomCard", @@ -544,7 +544,7 @@ }] - + [ { @@ -555,14 +555,14 @@ ] - + - + [ { @@ -583,17 +583,17 @@ - + - + - + [ { @@ -604,33 +604,33 @@ ] - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - - - + + + diff --git a/forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_lair.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_lair.tmx similarity index 80% rename from forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_lair.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_lair.tmx index f842fe0c27b..d1671fb4d31 100644 --- a/forge-gui/res/adventure/common/maps/map/cave/inn_cave_river_lair.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/cave/inn_cave_river_lair.tmx @@ -1,8 +1,8 @@ - - - - + + + + 4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104,4104, @@ -121,8 +121,8 @@ - - + + [ { @@ -145,7 +145,7 @@ - + [ { @@ -156,7 +156,7 @@ ] - + [ { @@ -167,7 +167,7 @@ ] - + @@ -175,48 +175,48 @@ - + - + - + - + - + - + - + [{ "type": "randomCard", @@ -248,28 +248,28 @@ }] - - + + - + - - - - - - - - - + + + + + + + + + [ { @@ -280,9 +280,9 @@ ] - - - - + + + + diff --git a/forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_forgotten_lodge_1.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_forgotten_lodge_1.tmx similarity index 71% rename from forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_forgotten_lodge_1.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_forgotten_lodge_1.tmx index 504fda3ee79..2910cf56de9 100644 --- a/forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_forgotten_lodge_1.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_forgotten_lodge_1.tmx @@ -1,13 +1,13 @@ - + - - - - - + + + + + eJxbqcfAsHIUj+JRPIqHMZbhoY95AFR8HD4= @@ -35,12 +35,12 @@ - + - + @@ -48,23 +48,24 @@ - + - + - + + - + @@ -72,7 +73,7 @@ - + [ { @@ -83,7 +84,7 @@ ] - + [ { @@ -110,7 +111,7 @@ - + [ { @@ -121,7 +122,7 @@ ] - + [ { @@ -134,5 +135,8 @@ + + + diff --git a/forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_lodge_1.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_lodge_1.tmx similarity index 67% rename from forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_lodge_1.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_lodge_1.tmx index 46523536480..4853ca0629f 100644 --- a/forge-gui/res/adventure/common/maps/map/hunting_lodge/inn_lodge_1.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/hunting_lodge/inn_lodge_1.tmx @@ -3,11 +3,11 @@ - - - - - + + + + + eJxbqcfAsHIUj+JRPIqHMZbhoY95AFR8HD4= @@ -35,12 +35,12 @@ - + - + [{ "type": "gold", @@ -55,7 +55,7 @@ }] - + @@ -63,7 +63,7 @@ - + @@ -71,7 +71,7 @@ - + [ { @@ -82,7 +82,7 @@ ] - + [ { @@ -93,11 +93,11 @@ ] - - - - - - + + + + + + diff --git a/forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion.tmx similarity index 91% rename from forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion.tmx index 3921ab4b38f..f84b9e721bd 100644 --- a/forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion.tmx @@ -1,5 +1,5 @@ - + @@ -229,62 +229,62 @@ - + - + - - + + - + - + - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + [ { @@ -309,16 +309,16 @@ - - - - + + + + - - + + [ { @@ -343,7 +343,7 @@ - + [{ "type": "randomCard", @@ -364,17 +364,17 @@ }] - + - + - + [ { @@ -385,12 +385,12 @@ ] - + - + diff --git a/forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion_2.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion_2.tmx similarity index 100% rename from forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion_2.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion_2.tmx diff --git a/forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion_dungeon.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion_dungeon.tmx similarity index 100% rename from forge-gui/res/adventure/common/maps/map/main_story/inn_approaches/davriels_mansion_dungeon.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/inn_approaches/davriels_mansion_dungeon.tmx diff --git a/forge-gui/res/adventure/common/maps/map/library/inn_library.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/library/inn_library.tmx similarity index 99% rename from forge-gui/res/adventure/common/maps/map/library/inn_library.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/library/inn_library.tmx index 8e892b7ca1b..0b9363732ff 100644 --- a/forge-gui/res/adventure/common/maps/map/library/inn_library.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/library/inn_library.tmx @@ -1,6 +1,6 @@ - + 6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901,6901, diff --git a/forge-gui/res/adventure/common/maps/map/main_story/inn_crescentus.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/main_story/inn_crescentus.tmx similarity index 92% rename from forge-gui/res/adventure/common/maps/map/main_story/inn_crescentus.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/main_story/inn_crescentus.tmx index b1496d3238b..faa1a8acded 100644 --- a/forge-gui/res/adventure/common/maps/map/main_story/inn_crescentus.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/main_story/inn_crescentus.tmx @@ -1,15 +1,15 @@ - + - - - - + + + + eJztzTERACAMBMEowiXgApiYANwRCSl+qK7Yer2YOb6qoQn15DvCFFq8vLy8vJJ3hyN0ky8AAA/74tft @@ -34,7 +34,7 @@ - + [{ "text":"Hello, planeswalker {var=player_name}, welcome to my abode", @@ -115,12 +115,12 @@ - + - + diff --git a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_hamlet.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_hamlet.tmx similarity index 72% rename from forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_hamlet.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_hamlet.tmx index 6d71ba1bdff..2dd4753691e 100644 --- a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_hamlet.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_hamlet.tmx @@ -3,11 +3,11 @@ - - - - - + + + + + eJyVlf1WgzAMxTumw83BA1mOjwboce6L8chqckgOd3ft1D9yUlrozS9NwxhDGMXKJoQP8TuxN7FPsZXMfb9MtpfnQ5w9jtkHGPfw/CX7VLLnYzPtrZoPZj53tHhcN/yi0yfmD6Rf2r5L8Sfx5zjrazyqtxBfG2+X2FPXeA7ZmFt9K7ZpppxWxrc0XdUrwBfNLW+wXOT2P9A6xqU5fRbbiq1N8xJn1sK4+zjrYi6Rd6S9R1v3eFj33XKsXjWHeM2r3+pcZ98MpMFn7FqoyTG2pqnMT8a8t3eQdyCrbT53jrmceL4q01Ltk+mvm1ve3D0KidodEjWAMemz3qUd6F2sppm3g/PFffeg5RoDvcO8ztECa0V17Lyu3Sf2RW0/U48j10dcd2O5Vt5lgtdrCw17Ca8Nd+JzhtbqujJbZHj5/nbxupcg57077TnRM95a79Kz9ZiYl2sLOVk/QJyp/uLMF8pDjtf7Zf2arjOsAR8jIzLremU9cmUaI+n7e5xb1MCaQd5cLx2tlj1nOneM1/puNeSd65jjcV5mReayme9wCb3rL2P9X//3Gx//AK1XMOI= @@ -32,23 +32,23 @@ - - + + - + - + - - + + diff --git a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_town.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_town.tmx similarity index 67% rename from forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_town.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_town.tmx index d2353f56c14..d7a766fc636 100644 --- a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_town.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_town.tmx @@ -3,11 +3,11 @@ - - - - - + + + + + eJydldtOAzEMREPV0tt2X4j4XLp0S++bT2axxVgdXAcJHkZ2om1OxnHSNqfUio6iqWgmehI9iw6i7cu35pIv8j1y7mNH3ycav0kcJH5gbWXuIZtbYj/G7QI2c1Iwz3kCR9ftRSvRmvgDeO+iAu4YMEvAYW/et8ZPGV9Q0wHMHlzl7Sju8qNfzdtKXS22lX1pTa+im+gM5oa87pAn4nItS4WRMC60H8+doMYTMBvnt2BuBLNxDH/GxcVoj1rrNTyf4HmOb9hv41QwXzvHWk2sXgNYyl6Bfw781u6RruN7t8mPPcB70rHepRnxtM6HwO9I94jXnRPLGI1je7/mQ2ttXof8s4/Nr7FTsC6z7UxtH7V3xLgX1Fr99oHfkh/PeOtqUFN0t0Zw9/A6gBf59fd3dG8J+/ztTltN9Iz1/i5xtrYn79f3Fvv0/I5qEb0v5nnj6lDza+9leY37jHvAcvbInkf8P/Tw25KMb9/52jKDe4b91t5Snb9SHyzy/X/Iq1D0fez3Y369V/Z8zPc7rPnpD/n0H7+x/AsfcLhM @@ -32,35 +32,35 @@ - - + + - + - + - + - + - - - - + + + + diff --git a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_village.tmx b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_village.tmx similarity index 70% rename from forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_village.tmx rename to forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_village.tmx index a03648f37ee..38cc327fa6d 100644 --- a/forge-gui/res/adventure/common/maps/map/towns/inn_ulvenwald_village.tmx +++ b/forge-gui/res/adventure/Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_village.tmx @@ -3,11 +3,11 @@ - - - - - + + + + + eJyVlf1WgzAMxTumw83BA1mOjwboce6L8chqckgOd3ft1D9yUlrozS9NwxhDGMXKJoQP8TuxN7FPsZXMfb9MtpfnQ5w9jtkHGPfw/CX7VLLnYzPtrZoPZj53tHhcN/yi0yfmD6Rf2r5L8Sfx5zjrazyqtxBfG2+X2FPXeA7ZmFt9K7ZpppxWxrc0XdUrwBfNLW+wXOT2P9A6xqU5fRbbiq1N8xJn1sK4+zjrYi6Rd6S9R1v3eFj33XKsXjWHeM2r3+pcZ98MpMFn7FqoyTG2pqnMT8a8t3eQdyCrbT53jrmceL4q01Ltk+mvm1ve3D0KidodEjWAMemz3qUd6F2sppm3g/PFffeg5RoDvcO8ztECa0V17Lyu3Sf2RW0/U48j10dcd2O5Vt5lgtdrCw17Ca8Nd+JzhtbqujJbZHj5/nbxupcg57077TnRM95a79Kz9ZiYl2sLOVk/QJyp/uLMF8pDjtf7Zf2arjOsAR8jIzLremU9cmUaI+n7e5xb1MCaQd5cLx2tlj1nOneM1/puNeSd65jjcV5mReayme9wCb3rL2P9X//3Gx//AK1XMOI= @@ -32,29 +32,29 @@ - - + + - + - + - + - - - + + + diff --git a/forge-gui/res/adventure/common/maps/tileset/INN_dungen_crawler_tileset.tsx b/forge-gui/res/adventure/Innistrad/maps/tileset/INN_dungen_crawler_tileset.tsx similarity index 97% rename from forge-gui/res/adventure/common/maps/tileset/INN_dungen_crawler_tileset.tsx rename to forge-gui/res/adventure/Innistrad/maps/tileset/INN_dungen_crawler_tileset.tsx index e380200853d..3e1eda58ed0 100644 --- a/forge-gui/res/adventure/common/maps/tileset/INN_dungen_crawler_tileset.tsx +++ b/forge-gui/res/adventure/Innistrad/maps/tileset/INN_dungen_crawler_tileset.tsx @@ -1,6 +1,6 @@ - - + + diff --git a/forge-gui/res/adventure/common/world/tilesets/INN_tiles/dungen_crawler.png b/forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/dungen_crawler.png similarity index 100% rename from forge-gui/res/adventure/common/world/tilesets/INN_tiles/dungen_crawler.png rename to forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/dungen_crawler.png diff --git a/forge-gui/res/adventure/common/world/tilesets/INN_tiles/dungen_crawler.xcf b/forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/dungen_crawler.xcf similarity index 100% rename from forge-gui/res/adventure/common/world/tilesets/INN_tiles/dungen_crawler.xcf rename to forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/dungen_crawler.xcf diff --git a/forge-gui/res/adventure/common/world/tilesets/INN_tiles/inn_colorless_structures.xcf b/forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/inn_colorless_structures.xcf similarity index 100% rename from forge-gui/res/adventure/common/world/tilesets/INN_tiles/inn_colorless_structures.xcf rename to forge-gui/res/adventure/Innistrad/maps/tileset/INN_tiles/inn_colorless_structures.xcf diff --git a/forge-gui/res/adventure/common/maps/tileset/Inn_Dungeon.tsx b/forge-gui/res/adventure/Innistrad/maps/tileset/Inn_Dungeon.tsx similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/Inn_Dungeon.tsx rename to forge-gui/res/adventure/Innistrad/maps/tileset/Inn_Dungeon.tsx diff --git a/forge-gui/res/adventure/common/maps/tileset/Inn_dungeon.png b/forge-gui/res/adventure/Innistrad/maps/tileset/Inn_dungeon.png similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/Inn_dungeon.png rename to forge-gui/res/adventure/Innistrad/maps/tileset/Inn_dungeon.png diff --git a/forge-gui/res/adventure/Innistrad/maps/tileset/buildings-nocollide.tsx b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings-nocollide.tsx new file mode 100644 index 00000000000..9fbe13a25fb --- /dev/null +++ b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings-nocollide.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.atlas b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.atlas new file mode 100644 index 00000000000..d70756f211e --- /dev/null +++ b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.atlas @@ -0,0 +1,638 @@ +buildings.png +size: 448,800 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IslandTown + xy: 144, 0 + size: 48, 48 +MountainTown + xy: 48, 0 + size: 48, 48 +SwampTown + xy: 0, 0 + size: 48, 48 +ForestTown + xy: 352, 496 + size: 32, 32 +PlainsTown + xy: 96, 0 + size: 48, 48 +PirateShop + xy: 384, 704 + size: 16, 16 +WasteTown + xy: 272, 128 + size: 48, 48 +SnowShop + xy: 368, 944 + size: 16, 16 +IslandCapital + xy: 128, 592 + size: 64, 64 +MountainCapital + xy: 128, 720 + size: 64, 64 +SwampCapital + xy: 128, 464 + size: 64, 64 +ForestCapital + xy: 64, 656 + size: 64, 64 +PlainsCapital + xy: 0, 464 + size: 64, 64 +Spawn + xy: 304, 288 + size: 16, 16 +Gate + xy: 384, 128 + size: 64, 48 +InstantShop + xy: 304, 704 + size: 16, 16 +CreatureShop + xy: 320, 704 + size: 16, 16 +GreenShop + xy: 336, 704 + size: 16, 16 +RedShop + xy: 352, 704 + size: 16, 16 +WhiteShop + xy: 368, 704 + size: 16, 16 +LandShop + xy: 304, 720 + size: 16, 16 +ColorlessShop + xy: 320, 720 + size: 16, 16 +BlackShop + xy: 336, 720 + size: 16, 16 +BlueShop + xy: 352, 720 + size: 16, 16 +MultiColorShop + xy: 368, 720 + size: 16, 16 +SelesnyaShop + xy: 304, 736 + size: 16, 16 +AzoriusShop + xy: 320, 736 + size: 16, 16 +DimirShop + xy: 336, 736 + size: 16, 16 +RakdosShop + xy: 352, 736 + size: 16, 16 +GruulShop + xy: 368, 736 + size: 16, 16 +SimicShop + xy: 304, 752 + size: 16, 16 +OrzhovShop + xy: 320, 752 + size: 16, 16 +IzzetShop + xy: 336, 752 + size: 16, 16 +GolgariShop + xy: 352, 752 + size: 16, 16 +BorosShop + xy: 368, 752 + size: 16, 16 +GoblinShop + xy: 304, 768 + size: 16, 16 +ZombieShop + xy: 320, 768 + size: 16, 16 +HumanShop + xy: 336, 768 + size: 16, 16 +ElfShop + xy: 352, 768 + size: 16, 16 +GiantShop + xy: 336, 944 + size: 16, 16 +SagaShop + xy: 304, 944 + size: 16, 16 +FlipShop + xy: 368, 928 + size: 16, 16 +BattleShop + xy: 288, 944 + size: 16, 16 +LargeSeaCreaturesShop + xy: 352, 944 + size: 16, 16 +UBShop + xy: 384, 928 + size: 16, 16 +NobleShop + xy: 320, 944 + size: 16, 16 +BoosterShop + xy: 384,944 + size:16, 16 +MerfolkShop + xy: 368, 768 + size: 16, 16 +EquipmentShop + xy: 304, 784 + size: 16, 16 +ItemShop + xy: 288, 912 + size: 16, 16 +CapitalShop + xy: 304, 816 + size: 16, 16 +ArtifactShop + xy: 320, 784 + size: 16, 16 +AngelShop + xy: 336, 784 + size: 16, 16 +GolemShop + xy: 352, 784 + size: 16, 16 +SphinxShop + xy: 320, 912 + size: 16, 16 +HydraShop + xy: 336, 912 + size: 16, 16 +InsectSpiderShop + xy: 352, 912 + size: 16, 16 +SliverShop + xy: 368, 784 + size: 16, 16 +RWBShop + xy: 304, 800 + size: 16, 16 +RWUShop + xy: 320, 800 + size: 16, 16 +RWGShop + xy: 336, 800 + size: 16, 16 +EnchantmentShop + xy: 352, 800 + size: 16, 16 +WUBRGShop + xy: 368, 800 + size: 16, 16 +RogueShop + xy: 288, 816 + size: 16, 16 +NonbasicLandShop + xy: 304, 816 + size: 16, 16 +SpaceMarineShop + xy: 320, 816 + size: 16, 16 +NecronShop + xy: 336, 816 + size: 16, 16 +ChaosShop + xy: 352, 816 + size: 16, 16 +InsectShop + xy: 368, 912 + size: 16, 16 +CatShop + xy: 288, 928 + size: 16, 16 +ShapeshifterShop + xy: 384, 912 + size: 16, 16 +GodMinigodShop + xy: 320, 928 + size: 16, 16 +MutantShop + xy: 336, 928 + size: 16, 16 +HorrorShop + xy: 352, 928 + size: 16, 16 +EldraziShop + xy: 304, 928 + size: 16, 16 +TyranidShop + xy: 368, 816 + size: 16, 16 +M22Shop + xy: 384, 720 + size: 16, 16 +M21Shop + xy: 384, 750 + size: 16, 16 +M20Shop + xy: 384, 766 + size: 16, 16 +AssassinShop + xy: 384, 784 + size: 16, 16 +SquirrelShop + xy: 384, 800 + size: 16, 16 +DragonShop + xy: 384, 816 + size: 16, 16 +AssemblyShop + xy: 288, 832 + size: 16, 16 +VampireShop + xy: 304, 832 + size: 16, 16 +VehicleShop + xy: 320, 832 + size: 16, 16 +RUBShop + xy: 336, 832 + size: 16, 16 +RGBShop + xy: 352, 832 + size: 16, 16 +RGUShop + xy: 368, 832 + size: 16, 16 +MinotaurShop + xy: 384, 832 + size: 16, 16 +DinosaurShop + xy: 288, 848 + size: 16, 16 +UWBShop + xy: 304, 848 + size: 16, 16 +UGBShop + xy: 320, 848 + size: 16, 16 +UWGShop + xy: 336, 848 + size: 16, 16 +GWBShop + xy: 352, 848 + size: 16, 16 +DwarfShop + xy: 368, 848 + size: 16, 16 +DevilShop + xy: 384, 848 + size: 16, 16 +OgreShop + xy: 288, 864 + size: 16, 16 +EquipShop + xy: 320, 864 + size: 16, 16 +SoldierShop + xy: 336, 864 + size: 16, 16 +CardShop + xy: 352, 864 + size: 16, 16 +DnDShop + xy: 368, 864 + size: 16, 16 +DemonShop + xy: 384, 864 + size: 16, 16 +RotatingShop + xy: 288, 880 + size: 16, 16 +DruidShop + xy: 304, 880 + size: 16, 16 +WandShop + xy: 320, 880 + size: 16, 16 +BirdShop + xy: 336, 880 + size: 16, 16 +WolfShop + xy: 352, 880 + size: 16, 16 +KnightShop + xy: 368, 880 + size: 16, 16 +WallShop + xy: 384, 880 + size: 16, 16 +PlaneswalkerShop + xy: 304, 896 + size: 16, 16 +SkeletonShop + xy: 320, 896 + size: 16, 16 +SpiritShop + xy: 336, 896 + size: 16, 16 +ShamanShop + xy: 352, 896 + size: 16, 16 +WizardShop + xy: 368, 896 + size: 16, 16 +LegendShop + xy: 384, 896 + size: 16, 16 +ShardTrader + xy: 288, 896 + size: 16, 16 +Waypoint + xy: 288, 912 + size: 16, 16 +Overlay8Black + xy: 400, 704 + size: 5, 16 +Overlay6Black + xy: 405, 704 + size: 5, 16 +Overlay4Black + xy: 400, 800 + size: 5,16 +Overlay2Black + xy: 405, 800 + size: 5, 16 +Overlay8Green + xy: 400, 768 + size: 5, 16 +Overlay6Green + xy: 405, 768 + size: 5, 16 +Overlay4Green + xy: 405, 864 + size: 5, 16 +Overlay2Green + xy: 405, 864 + size: 5, 16 +Overlay8Colorless + xy: 400, 784 + size: 5, 16 +Overlay6Colorless + xy: 405, 784 + size: 5, 16 +Overlay4Colorless + xy: 400, 880 + size: 5, 16 +Overlay2Colorless + xy: 405, 880 + size: 5, 16 +Overlay8Blue + xy: 400, 720 + size: 5, 16 +Overlay6Blue + xy: 405, 720 + size: 5, 16 +Overlay4Blue + xy: 400, 816 + size: 5, 16 +Overlay2Blue + xy: 405, 816 + size: 5, 16 +Overlay8Red + xy: 400, 736 + size: 5, 16 +Overlay6Red + xy: 405, 736 + size: 5, 16 +Overlay4Red + xy: 400, 832 + size: 5, 16 +Overlay2Red + xy: 405, 832 + size: 5, 16 +Overlay8White + xy: 400, 752 + size: 5, 16 +Overlay6White + xy: 405, 752 + size: 5, 16 +Overlay4White + xy: 400, 848 + size: 5, 16 +Overlay2White + xy: 405, 848 + size: 5, 16 +PhyrexianShop + xy: 304, 912 + size: 16, 16 +Test + xy: 128, 48 + size: 32, 32 +Cave + xy: 192, 272 + size: 32, 32 +Nest + xy: 256, 304 + size: 32, 32 +Nest + xy: 321, 400 + size: 32, 32 +Aerie + xy: 289, 368 + size: 32, 32 +Factory + xy: 288, 433 + size: 32, 32 +Factory + xy: 0, 146 + size: 32, 30 +Factory + xy: 192, 240 + size: 32, 32 +Fort + xy: 160, 274 + size: 32, 32 +Fort + xy: 224, 368 + size: 32, 32 +Fort + xy: 320, 368 + size: 32, 32 +Monastery + xy: 352, 367 + size: 32, 32 +Castle + xy: 160, 274 + size: 32, 32 +Castle + xy: 224, 368 + size: 32, 32 +Castle + xy: 320, 368 + size: 32, 32 +CatLair + xy: 161, 49 + size: 32, 32 +CatLair + xy: 351, 209 + size: 32, 16 +CatLair + xy: 351, 209 + size: 32, 16 +CatLair + xy: 96, 81 + size: 32, 32 +CatLair + xy: 96, 81 + size: 32, 32 +MageTower + xy: 289, 32 + size: 32, 32 +MageTower + xy: 32, 304 + size: 32, 32 +MageTower + xy: 0, 240 + size: 32, 32 +MageTower + xy: 64, 304 + size: 32, 32 +Portal + xy: 96, 48 + size: 32, 32 +DjinnPalace + xy: 128, 272 + size: 32, 32 +DjinnPalace + xy: 320, 432 + size: 32, 32 +MerfolkPool + xy: 320, 208 + size: 32, 16 +MerfolkPool + xy: 64, 112 + size: 32, 32 +MerfolkPool + xy: 352, 32 + size: 32, 32 +BlueOrb + xy: 129, 48 + size: 32, 32 +Graveyard + xy: 368, 96 + size: 48, 32 +Graveyard + xy: 256, 464 + size: 32, 32 +Graveyard + xy: 192, 400 + size: 32, 32 +Graveyard + xy: 32, 272 + size: 32, 32 +EvilGrove + xy: 256, 768 + size: 32, 32 +Slobad + xy: 416, 336 + size: 32, 32 +Jace + xy: 416, 432 + size: 32, 32 +VampireCastle + xy: 416, 464 + size: 32, 32 +SkullCave + xy: 64, 272 + size: 32, 32 +SkullCave + xy: 240, 0 + size: 48, 48 +SkullCave + xy: 256, 336 + size: 32, 32 +SkullCave + xy: 352, 336 + size: 32, 32 +BarbarianCamp + xy: 224, 304 + size: 32, 32 +Maze + xy: 0, 336 + size: 32, 32 +YuleTown + xy: 352, 592 + size: 32, 32 +SnowAbbey + xy: 192, 448 + size: 32, 32 +Grove + xy: 416, 496 + size: 32, 32 +WurmPond + xy: 224, 400 + size: 32, 32 +StonePyramid + xy: 384, 464 + size: 32, 32 +Mine + xy: 96, 144 + size: 32, 32 +LavaForge + xy: 384, 336 + size: 32, 32 +black_castle + xy: 0, 800 + size: 64, 64 +green_castle + xy: 64, 800 + size: 64, 64 +blue_castle + xy: 128, 800 + size: 64, 64 +colorless_castle + xy: 192, 800 + size: 64, 64 +white_castle + xy: 0, 864 + size: 64, 64 +red_castle + xy: 64, 864 + size: 64, 64 +final_castle + xy: 128, 864 + size: 64, 64 +farm + xy:351, 0 + size: 33,33 +hall_of_flame + xy: 194, 864 + size: 32, 32 +hall_of_fear + xy: 320, 464 + size: 32, 32 +ruinedcity + xy: 321, 96 + size: 45, 32 +digsite + xy: 320, 64 + size: 32, 32 +abandonedshardmine + xy: 32, 208 + size: 32, 32 +libraryofvarsil + xy: 0, 720 + size: 64, 64 +banditcave + xy: 32, 208 + size: 32, 32 +frostbittencavern + xy: 32, 928 + size: 32, 32 +primaljungle + xy: 0, 928 + size: 32, 32 \ No newline at end of file diff --git a/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.png b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.png new file mode 100644 index 0000000000000000000000000000000000000000..19ec78526d5761bcabc2c8dac1ac6e8939201456 GIT binary patch literal 240599 zcmbTd2Q-}D_cuDa(G7wi7=sW!dK=v!O7ujc_ujkFTXcem8YNmnh~9}#qDAi|(R=Ur z@%@$cfA4zleb>FSmSyIdGtYB&Is5GW*`E`srXr7z^B4yN0^utlWYj?*lr|6u9fXYu zTyZ~*Gz2aPSV>E(Nt!wso6)JuOVK^$77`L<0fC+-B*(QX{!k+gZ>5s$`lOA$vgFA8 zQq6X}Jz7EU9i48ebmCV9>11PweVP9iQLH`9n>jyJX8Cr>L$EJeS8=d(2p&e%;z{PB z5cMyVJmbmCu$N)Sx~1-831#a8)8ytKPy&TR8~1p-ul;#w zKP#d!7&cOw(MRA6w~iKLa-$FCWLpyv1{ABz@DZs>6sKNOso^-^gB1HueTfVLrd`Bn zqlMb=oDEQ3(7d$?c%4Y_`_;bYK#AF_(LE+fSR7Vb?62qbwBeD8B;zA5$$R(F47q7- z1!(HEtG_g#`rnBWPad1uXUk(tu!)hslJxw<;jcv@lC*8y<48%cZ{)3M+9=>yi-KD# zTk|^f=#eOaKd7x+_4Zf;-V10F?1*^f0s`TZJp7@6K4wq=O5U~7)OFQWej#k)V8>zf zpkEG8J4awN2qX&kbTl%tF>|FeHnXs@7lZCMwnFKwOvRu&e9BzPj?!k9RtRrrGYxMQ zO%rb$6CqP5T%1nSQy92`otdi4Rr9v&VX9?v-(oGmy3XA$D$;^E}sVFyOAyLj2V8hNtY zyD1T=!>#}O_5bn!K()%s z|9!^)b}n{y|9ymutE@X9#=jNvza8zO>E&p~scz=t;O1;%ChHDNli@)cM`3AaGb2|A zXH5qO+y59!?LSkd;llDieqbhJtKejh9FG zIq>nhFc;UqhAKOlTA6$O&!Nu&>uPfG2y+VvbMyW$LjjjDHF7ojKMpoE5jJ;lwle|* zwz4y_FynNzw}8_9SB=8b4z>=?z=MI=J^yDG%F4nD_AahQ_9kWuGGb6bW)3SWQ(>d$ zf&x5(W<2a>=0;}h#?N_q*^Nz1fI0DU@tX4S^P8LS8vW<@G7ctg50?GU?@j+d{$ADD z3Rqc2w*SBH^RV6?TtXOO)$Iv!_4X5?`*B;{_z4~Ba;X37K55RnAOY_`tQqD z|GzcxuiJW9ngKWce=+yJhPgPHyLuQon@L&#+WJ4b6DKfv&WCmQFF82>?;`&5-Tzp# z{}~Phf`_;NjX=PM|Hd#gdmwN*0}<+?s_qzsR-mjPBdO_`vE%3EsWo1I*Qi>JRx9xd zkB8C7vW*Dw4WsiBo`x1WxT=d72a+3M`HZ})itH2F$eS;2Qqn{mIg>N|A(EZ_@lv5w z>WqOz%e)d0Sg#t<2BAZ#`TgD0y59P%O?h>=iwf#Y%TN-t&l{Uezq42SSLSHk9b8i8 zU(QPmKjOHR443f+JCC)p$Bt)S%h)=6nI*aCvSvLX_q5*= zbh=TyrL1Un_KU3hTr3`J6f)RwHS~TxQ5eaxxBq4w37xrx2Dd(o^t_9-9^eck?B&hA znzpMkNum{X*b{d=Ft`&Dh>lN7n;`?KJrUp8_AsQNcaa>>cREe?aBtn%hO)O64@vlS z$^>M~*L{5_c!<9>LMc)TSF3UIQ#SzZ$xsYzJ=5MmsD?-8eeZPFh^J2&YeB>BKXyCK z?vmARI9s(lkHYabm}t^M0a5t8m6Mt=+vU4zEQi8Dx_4`DKin)S-B-eT*Mp7@jAjpW z7JD*IT&8@AC>QE-K4aA$hY|BoX|o{r_d%b!+Iwp*1>YCy_`=|+Uwq^e09m(<_8kE<8i7#=;Y@Py@|tZR1f zf+~mK751g#pF|fL*U4f=k-0N582TmopP9_WpFm5_e}r>enDYbE4y>3o>#PPvRt1I* zJrao^LhP)MC(wevEU3K`FYW^!aLNarh&eW0Pw@^e)+lA1UyBVYz{8mxyih=nt3mg! z@fovTlE{5T%-$v*$nwLTBor~sTRIvruce(`E8ll8l6n^)zkel32RTs=h^)EvI!!=a z4_EF~1kIJHZas^Lis01lmFd+g{5{n5Udp?WSAPHfU)|cgJ!AZK0pse;9g*RHO#%I7 zL3eJzcF&vd4JU0_2WpsaG99n&jv^0lBTTsfNgj#oWqi9M7uU13NjmTAQeyM~7lP6}rTw=so*3iv{6F3#;-aUDe1L@MtR=3X!I@%9t(J-@!qC z1?wnT99VI1zJm4hET_#SIV9`Nvjjt;_D({uK4k^%=vhm^y8I*MuG!Vp*Xm0iD0C%S z+t;Z!D7NP!Zzx~(m1n<0uQeR~U__@?WZ-M0l~cJUUw2tj_EBU-e!gBc{`ZRWEH@lh z*ZQ}v=BGZ(E?Qi05-q(pB-+E4HE3lWBq51(9ZW`7{@z}c!S_3(+49+0nJ)%t*kWZD zxWLPS-*IrL@xDiZoL%Dyu#SZM&Y*0+vI`jDZP4!i%3Z`hd`b&~H`8jxPa&*Onk!9c zN?rO${c((rNH0bEY<>%?@QFlN*v1VK&U&QR{E2i`4xe=PzJxBE-2V93C2sb+zjp@( zo?RNOMn3md&ap$B!Mg-mjjx%x8@Ys_Gv7-(De>-{0O=zahW5N3)oXh}choQM>+eTV z5*7k2Tnaw-OUQW?+Qg+Wz3`j?9|IIn zv{gd1;!uKD@Vz5Svu2^R^||XT^1|@j%dSy)f}n=k>6sd9QL^xTr+9Q7Qw z+v1tecjQ$&p;YO9IG|oZZT9XBEa9WEPkKGt9ov^t92m|HL%MqyzoUrKhJ&)O3{ydU zPbeB$c@>co?{D5994`W1EXLS?hxb`WE-syI-nV}IBC0Z+nHsmdF9@VuMlaPYFs!I(ZU}w|qPX1+bg>aP<2)w%lddwfd3YpZBlH z_XNco4&MQ`)6IYnWQh9^^Bh?i0kO@KullQ7rEP27UJP!kPy{P+(Z=wPWiI+F!fcs^ z>D!>28{csIHFBA&?aA*xQi$Pl4-XCR!0XVc$FJGEEfXNmj(&B!H4<1Kp@|~C&3Rxc zqT(4JKX-9Bn13~V4Y4CR!G((Buz%3`_E=(!$mq*~G%`e&vHde@!eUd<_yNtTKyL6U zyk)UMA}&y;%at}^@!0>qc=sZ@{QhzA{8&YO!ZmZ##~E!zOtRUmU5~@f5(TL7_?-cZ zTFPCW_38NU8ve?HI|B^co@S!oe|tW~qXtII`hJn=ZDyO#N?6>6pa6@f|3`RNNBpd& zNdlh#+}u@W%+G#2*Ts*C&Ne^13v&4-Fs|;tiv)PLD$n*2MkLZKPA2BGs;tzaFct4g zWT6+Mu1O^|8S=Ozbpl1KTzViMJE2<6-I1>kLGts}(`)ue z(Jq!gto-VhHk)>*df8wExWesPZKGmRT zr`Uz7rWYjLXdY;WcZ`wnGNGO%V=y&)tjxLw8il-gltQ$zz|v&{5)AIM;=yD~j7-J$ znnJ%fDzddjI@v5laWBqJ_CQ6lDyF$|gXxO5<=blWKSv#|8j&RRoc-8gUQ`|wG)ny- zxYqYVgm|7RMx&A@-4>qznkdaY_~omb<`JpbteN`xWzxJvRISZFnl zRDz6sm5JBMIbCb$GJ6WiO;Of(HBQjmsOwk#S!9Y&(QLq0?7j^=zT`7#O zWeGHAa$`C)a)Z^HNd(D{6t7S6V=WhZT%A{Ut3BhfiL!H-r1AE9BhGH)3$4V`ci39D z*Iot>F%45gS=)8Ph=Flhr4TBj)lD&Ok+PpWo6_fQIRLX2+b(m%hEDS_T5l7ef(A=y z+Dv)^lwHH}Hwm~(-P;h2nAL7rH2lXhE38o)w^9!dIE(5p0>iD`;ddH6BClPdJ#9rq>G5P3sW}L z!4R2ZxkbXI?z!I)ZnmVe^5{iBK3zS3O=cfY(F*KO(ED}=6T`i9&|}VGRKo-kW*J6P z@Gx2eKS>LAvI5Kg4pI_v^5$un!_|%~41;y{^|3Yvzx|A%&jq8 zAdI^rf=#j3&Ln~iSmLGhA}$`S4^_fidtzC%E+=YagQCXD+E1pVK)hwFnwSdOut>nF zFksPELsCUQU(UKuV}Es#`+dA6ex~TF=G3|6;Qol`SV;n6WsZ#e2LG#E!yKaf&9{*v zuiT=&ZxGiB5frGI!#ea+#yjxp5HE&|!T!5uC1a;DfMnnkAB z^u0@qzp243P3=6hJs_QK&iM#~XeAWjCyMt1i<2@!?Ynj{2Pu3^*m`So; z1R)C~Ucc#&!j8IW`qXHE;T@~5MR_B-m|kYNt(J84vuR8yFN#h)Plp*4P=8-!m;Gxo zbyfor92w#yLWkhOz9fdO$sY!E@BVoW!TXDzcQp3`Py~Z#n6o-+!0#$vDzLK@+8iT% z`jH^LLulg78uBKnHQ#2TMBfP32pGvOkoDhR;cp_1m6fU^xQ55l%|M$rMA0xq8O# zhzJswT$?QRvjMdoprpNqoX7@nds$+hpeiG>A$4oyW$#oFtj;q!E>He+;i5>~=zMDO z{InX*l9a6nKWy7yBX?+Q=$pia-R_nO(I(BXXls$lLlaE~M&A%s(}GS*+&stvB$at$ zfsAKsaAgR_OJ+3UQI=%7S@#axr=W`5ZY$z^)7(HVj7hhlqL1@QJpQoNe$uynvp>xh z!aoKT;+Ul3TU9w2|7Ol}YNp!9K0~%?Wv!hG0YZ_=#>Uuqb&m`IVug4-mG7}<5v*9} zt1#fyiExyxjs0rOB&mXYHkk^FxUw!n9N?zox+)$%ey>k~^>8ym@0%*!;=>_X#MT94kC@E+ zlV&FvRH%kJocseQuuX+4@=3Vj%BX_To6u5?z;~;}VC~e=7nA!j7nS8sXnQ5Ua<~H| z>6QFzhU)gsa?UeXHjJKx&h|`htl0L;I`gvh_akbwb^eK<3TQGCXkBLr+3)SS-N;lb>~HTk=V!iCaoV?<3J1*B=~? zf1BIZ$9WQ)%opn1$d3vB?7C+$@#L#v;v3B_ux?20*^i`&u7Z&|DI~i>>_88b$TqWq>D{3+r z!PMEXI%0D3T43d*frDUl6``yoT~~qwD2Je$X?lO_mtWA}j?jm6kzXEiWP3O29(yD& zfX#N2{Dt~io_Y*sXtwo!WY{}&w>4V;AaL1=GIpN2*zQ`H!=8%->q=a(XXb4fRDEY=?SA#Qo0R zyv52pO13dvX!(&2@>vA0CfgLP$PZc%4~v|3%nC6$gwjb)gS$)bVDd87=ZvATaq)D7 zWrcRh{Uis4LF}x}0json`xP1cDO~3>r6@AEbKVL;GRQTA?4l5}c-w0kx9usMbdTgH zpJa53-n(u)Kjbb_f0E@_dS2KiEeRSkU1E3LF%BsGd35#x*50MUISE)j`*$i8%A-e* zK8}6=38-5w<78E5y#C8a#x1!0$~ zgl}n&)1H#Ny7fxYnR!z+`0{s6rL9P!h?(JUyNUD0=6s3(rBF=-j~;jxERQ zzaQp+I=^v(!PfEu?~|IQVoHJVUVsbWcmxpFWAi^IZ!+Mxz*+|%C6Vydol;Te*+G~h zV|xj|F)2Ptt=aGs0rSgI!ji9&y2Y8!`9#IPCW(OMdiR$ZDLaU0v}zh0{%bs;Wy3Xq!@mHP>1bz8)C9s)GKU`ieWl$fg%q3v z{Ok1`4Mq3RX|JORx|xe0RO1ZGMW+C}3LslV=?R|3pfLE<>{GNq_*e-o^V-({R-0&A z2<&KVUKQ4RjjyA%e2S4&<#ig+`5R5M3++nmFJ`OB?1wP}qR9rAWeGo`rX$Z$ucNKC z8Y%bzYq?DOP)THNrEMdf_>-0#SUX6Ct0zt~>MT|syZp>D)V;&Gl!2m51fz{rB*bLg zxC3S?6A@Xsy#m|#jFYUDopIx7T?N$a{YWd}&)kqbKLB9c>oZ`zMyG4S9k8$fTd855 zL(ig`mtW6aFL83YZJEwGC3o^Kg#o4WD7l^NpDz)xqJYDGK15v6BG%l&vmNi__1Kzb zx+Gdd_S{Hxltx0-W(KMxWRSUbnmAi@11tjh1M6AxhW5P}*O#Eq-2^&b2ez))u zjAy@u(1uni0}HQ|1o4-u8b`DLYDMmyB%;sBfuR}~l&(L&-i!0S!amN1&l4*7R*oEg z4rJ8Jbp{-XrBY3&Agwde)}E#%3)|Te)u)l1Z!3EkA*_0z`mLB=#;=}P8Yl%lSz0T! zhCh8bxr+|c6O$kiRw;0rG&Lw+6}f$P*r>uP{<()WrCK2 zlRI82E-)QYi6e121d#d6E+!PKn79JI+R zy*3l)uXOGyRqnm(%7>nE<)VG-M?PKcW0%5ETq1~&2?B5jQ(9CZX>vn_(0u5rW+3a! z`k~^Fuv}RBTcU8vhMuqUf?P%N7CBdF2E`+fNfg*Q&iTT0ZT1eqPqFJU6rBEA*y3_r zGhbQm(VoI*sgr`=v9b6X9a3#k7rJI?7T7Q2n_9dtP;8ZTS6DfGH(Sa!8w)HPZnCCR zX-{Miip1I-3>9*Efo-Ie+;tq9NX|_(PVgpeX8i2dJWhxMCPpwrIK$cVyErMPKq)mH ziBJp8;TKmyY80yQ2NbaciF{&YcI)Y|h+-J}OL|vZhTmO<=xT5=nv|XY@F>O7#ch-Y z^w#ci>RSF@2SKf=0!kfP8cwBrJwek1%%9Ne`Xa%)3aGt-wb3|}5a(->L&vQiUdCQg zHsoc;>c!e|NKQfATs{_MLzTsi=NFcNpsG!Q+s8xwQs^+H&*gG=8e$S!3xu>a2~2U9$Ft?4mjf_t(A&4Hlp9CB-jcFN9-xwBeNOu}lax`CQ+LfG@ctK2 zm*qEz+B;gQR%g$M&70SjvCVS84mcdfQPASRJT|u)&kk7S$8=O=R+2{kJS_f`m6J;63iBK)XEVFZxYl>eI7X|z4o);^ z;yX8vM0>F|6@iX|4L#|s{4s^s_F|AAvc6+)YqR&J6Az-iXRglGyCbACzxK)$ouBWs02C*^DBwq|m0cjCqCqTDwbhII}7gvOLT&uFR9#0A5!FsGXl*)vu; z^@*h|iV*Z%_3Zuy`89bv^i3TsC=&<%mi6LgVE;s6(v77v8yg$%{h9xS#kfMSWZO?H zodSLjEuX|0HxpPhlOOYuIF^D>9m@OyQWF4XFdaJOtx>m>_P6@+rA+JefBO+#Ec00G@Upfb+ydICbsS7Xq zWhD1Uw&eRgaUBg2Xm2QULj~Dj(%@pd=s-<(=UV+WrlUiO?#o0+pIvM{6L{NQmyc0l zoP{J?alAM<1@t!Q)c|_encMkg*$G`WjZG-Fek@wV<3u5^KDoc4Lvvv<(>_&!>&H0S z*9``fwFCws-T`9{O;Up88!$o6_*I-ZO3lnTvNt#{bj^t{%r$QsMrH_5-%b$K=2pS* z`;(eg{wO@az|NXXP`yY+Mx5+-iMkPSKguB0h#pmJw7@dPl{|j8NzPa50h0@wvlD{G z%1w?p2)+kNgkqyG4x5y|=2Jd5hudbxBPzaqBf9Qi==@-lc(Af{R2LDKe*|ig!}B(8vFmb+V~#HND$u}Q+qkpEU+57*vx(gRA!SC zXwgOLo!p$9Dy;`fuB>`FvA%t8Unl$UCQKcacq~kIqn2X{LbhyaV4*K}3_97xKi_TW zTW{OFaoqLTo)-RktAz22@iA#dJZ)g9%qB$wy`h4YjH@qI0G-%Etd2nwElrsse##56 zcaq9dzAdYu`!&&D*@3&$&(-s7&XSw0j<=#iFR<@Yt?f$`+*LS2p5<}Bn=ff&V!nt94K2m?!vt_67}p_$`X{7g%m@m zQcqkYcuhjHSr2v_Puec8&fkDkV#C8ChoCV(+=xI4wPqV$pn_g$Zjb!f@!G>)%TU%&k+rh}uAu^gFX z@||M@`lG(EF0Vc1KFW&>Ql+Rdfg9K-&{dO#|5R1!eld(uiS|fnll5IAMmzHsk_OQw zgVMKFP#o2)2)j9vG+8k@j`D2gccWXaWu?%@;K1moQ}DgGV2R~b{wY#(K$HI@>ZeL~ zM%uI^mAujNKr9{;wE+J$Y2A{FoG5Kks4?h_3meM+II*@UItP-2lYxG_GBM{< z;gu@3qM+p*(HP6jdKM=={&`aHMxr1V=3EJ@He4M%5__S zcuAo(So88A7?@^y!*+tSSb52VFQrE+UZ5*pE)IE_dnMNzmn#|*3pV=)g`u} zLM!+1_S(cAcx|QUU*d<{PcDAjl}#>ab+yUx$hK76=z6sWf?+>&T)FEM1Z-CeavCBp zyJM97b**i$eyIO=h9++ks6!B6icJJ;vfY7bv@_VM$^I#{dE0I?*zntKoFCX}WHjD6 zKm&`-a(ck65+4W43uS`;kG_gcUh*EqskP=O_9aT&UQ_F{+4w$((=hcD1!aOcgD+gs z@e2O=^s@#oZ;EaV47kAMoF7aZ%PM-F3wTgJfQ;Yn{HpgAzP;cQMy$zJD2ax#qCtGvGtY2xGybbssOB1LWb<=7amvnv!%g0?xmOLN! zuNBucIl|@a<9vCLG|x!9R_Go6Cv^UhVO-F_pP*X)S!Y~qi2`UmR>BEx$B!8nmz|3j zoEfi?=`cH_opusWNVg6fuP&WYh;3UqD`L&JD@I_-J;{t@<-YW;M^7q&X|N$QooyNlSu_jZ95LW+j+Bk;1nEcU9N8>Xgx-R1U*+FqHFRZh zc-82o$3&jo1t%L33hx`0ZNbJZ;=NrDC74>V4;l0Au)N3$v5S@C$!Aj)*cPtezQh2r zNLa^I)2dVuvxb++yf^qqiXH9)R?XBcn))>lK8#27{ZTdSWTk;PQP_*#>v10r+o(ZX zQj?MB2?ju?mtQhZ<9b375}gUEKgLM{&1YbA)-xf}|At#?cFOdas{T4!30E4_7%_?IAHjI|=UA^nqy35MI8~2wXW@vm;1DZ*G!6aX302 zb70H4kOE-lqhEUhk?17GI*QWoP2Xv-B`PGvhHC`y<}B`ieQ)`ud8&MiG^Av76-g85 zB%_t>A2&s;@r6VSRB7`~WVR9u6{O>bx<#SG329nyH%Jd4v*}fcw>Cso&kgTwp_8#1 z;b$|UCdd*F0VL&K4Rp}m_3QDzzeOMHK~+KWJiSq1YM%lR2Y0Tp9w&mp38hTI+Gfm0 z1JN(g|1AIL9n4x4so_j%xy)ZJ=s#)Dme+6KzeS`V$4iCL6E0jQ`%U|UXB6;-0j~$R z8GXb`Q>1HHZObUiIVMuL&Iz9?6`aTG_A(O}+3j8~$zdiKc4V;DT$DcO!$!cyKsAqaBe5?4bXm7Y^~|6uU~ciF+8yPi~3kL zfJ5*t6Nf!vz9V(*F@VhYBxdUw`m)tkOc#Q3`CCJLNFiVd;&s$b$hDTj8rD>=y~k^+ zD0KfRIWK=T-Ne6>T`iUZ&MGz6Kl|$!YKE2zy)l_Z)YnNW7(M!l&US&gz2ti-97XlXl()Vmew@yxaH#i(eE0{KsR!aW-E43ECNF@QqMLBC44UZO^aN37IO zDphKp{y`ClQ*CoLwqo0iyHZqEBFW#brB#tZY9+H)n{I0_elr^~xL#JkqTkxX9~Ed< zR7F2-pehvp)djgz^Eis$4d?Nn<-nqcY=pC8wR>1EJ|>a3SU$AMME#TPi|m0$+xlmI z&26_^PU=M)-rd(WVEA$0retuBvv+k3k0;+qDjwl~6D4in5ZZWmN7xjDTcj1eTAVq1 z*d03Hd)m`S24YbC~dm_0p|-BD5NrGl;n`yx>|wt#-V7Jy%c9jHxEAi zS)Rp(vLusP`@L77)p{`%ti(a%GDc?C6-VTlI29>;-^EqzkfsR~!8tC3>o7|6Bi5HX z6k4*#+P@1njpn^mv#27ijz>P$>+VhMNG8*EY&oMgpo@12_V< z3~d0Ir^v=0tCiXk{<2mX5;@0WLOu;D1ZwLC|AYw&KBEFC84vBisXD79WvM3J;e^G2 z_vNU=NlRt{`5jwu0-+v{3kGqdGEpv`I#H@nw_rC5BSLK8<5Ll^$PAJY^vyK#)Ijz% zP;BSy1NB(avyOyp4MZ*|c#$t?DKQD2I*%aO$h zVsW;u$k&GOJ>#}P?a8)$9Pq8TyMSyO?b8K~SK|sY{fv@wWxVTR+4psYAy_gtFm){q zWLZyJDUrA?ONL&6E5;9b12n|5yf&=>c$z7ePunw?_9?hnU0==HhY+`KF`7~c;&`t<~^&W?z;VXJdR zzz}Cf(B3r_$`7q}sXu-6!;cP@L)Ot5<5X3U)BuNZ3K73#LzD}XowmL{#Fp$5rsUIZ zl)Pd>-+i`lO#+5jce>WS@Bj9o%Wy}AhGqOeUcw$MFRnA{K$t3XhX#8c(UX4vhgxq9M9j1|UFor(R4?c=%HiR9 zig%HrVrN2GBVvSiGi&49;HYB@dVr5eeABW#P6j;*{GIhi>WkRx<$*r4yPCIwJ4g0( z#eP5+USYSmyX@orkM0IBQq1Kz5IBZ!(?HSm$l=YKy6NznnbB*J+-wu*bs|_z z-j{d!*J8~xdPwLyQ1L;DUIB3;h$?TiJ!5O3e|;=p@_TT{9GtBki5;*i1jWcPZ;sY0d0-87Fvx<0Im(v5H`DvJ1Ds4!XxSN1xm` zrTNT1AADx(8POdU%jWE`Q2OxkdeL%pJ-N4~s8Y<(#h!RQy+0Z0*lIccsN7kPINiE~ z+A-onf8dH|?Iz=WL08fZbSnJ{oe239Qs$`WGY`~dhl5J0t1XSlAb??-knww-7!yU; z-5`rJFu1qe*F7cgcJKxw%3~^#lMm$)JVZ%}al4UtR(}S>9AgujH^*ZDnTdR|-aH5_ zOh+kcfDQ!8F$+#qP`qFkBHpr9&|kYlU;S!FSyGfAt+@r_*Rhg&hcDLBiyJTVgG-A0 zc46ZQjzjzp<292=OlEix6}W{~{DlhKylM0&pgksHgSfy6?!6o-(~a<(2k3m0;_S0{ zp!jllRVwi%4O~4Y`}Rg3?^nN^v$_W(ST5=*+O$dRENeu3ZT&C$FrPfEz;_p*r_Tm8 z`uQvEj_ia6nK>TlxmI`9Jn zqkMN&a+&r}BB-RI*Vzx++hKRkVo89S)&aN#nF{>P=)j9z*4_anR84j+w@!I_gC=Fg z&2EjxL%Y}y*lGxI)+4lllLfA*V+>+UFYa5IInuG4;)_qCddBwjF^;^lh?b*AE-N)J zW5kW%=GWOz?o|{&Y6han@6ypp@SyPdIF?HFyYuJr?{D_*cgn#w8U){Jx;Cx4LFjrR z18dAX(c4PC33P@+w1;bIMZ+!q31 zCP>E3V}3n2!_nXTrHh}y6@E+r9eoI7LP*0$!WORW#ah}$-B@JuRj}UR4e9;gK1f=g zS58N0P<18-NwP9pZq%sb(~?&LELu!(N#FbxQDMRj-bweNzuBUH&Jw7HyS&9+_mwd{ zLPjLzIJ$dYelzac-idB_0lb& zR`dB-;X&(sO^18yoJEwcutwVj%HkIXEcTtLD84u#!BMfdMUlqUetyKm6r;4uX+dbl zda2Gz1i5jfqvJ?gfTix0eB^~unyf;-X3Op5`bZ_aTIX@mSCI%HvL5!vqs%zT?s@oe zqF?saG`H@c2@91k-p{h@`dp!j)_Y5B%6dt%$iaq8}Z(`?F?|#=k)bP*M)3-B2A^g~c)pg4df1~hbg(eb z+9Y}a)u;HMoP5PG6PQyUJmJ2&h@u-^6C(hoil*Wlt|<@lRgSNulXR?TqAOk`@zF;E zRc-r3Il~k5Th`Q-VS>Ilqy@sEzm)(&ZYb4RD-?X>@t~1M_xLasRwkC=pO}cwbMI?^ z^nTGqppmDc{?bh3<-CVM_jzXx)hiO)L|O&klUAIz+KhA2i?0bFxz{2utar{Yxa2qU zk#U4S_QGpDV}pASBG)HAu2H^zRr8h&)r`%zhJtY3C+V=UhdKTI<4TiSQm2+XHT=D+ zJ!VgoHe5gphhl<%NjNZ2+xA#Z|L%w5&5M$L$5-1P2ZQp$P^h4Us>%7na=B3$l|P5d z@#9MsO#r&W4-dhL6;!**k^8QSJ#@g}qor=Bi12|V=k*Eqmlqi_MfGgTR=_Ik&$ zQ!(^GLu~xb#X9~3KJ2hBG20ebGei>mXf?8`_{G@jj{t#_G^X;xt~pyaW)5{5uO8J{ znqwp2pLwic=JgM@0cC6Q@d`u-I^De%xwfr|)Cn{~KX}dSf}`_1&LR2dYscG;CwuxE zCo4$Fut?{i9B}CG>^Xvs&ogs6F8ZWx8ObhU+GU&yz5TOXQlIHs0uz-^B|rres z!9h<$g27-~`g#parnRp`Fl-rIJjczrVL*LZz#$>eCGIJNV_zcb&1b^`K23au;-!=( zv2Xap&F5*i+w^k-Mq8mq764v4*9!6ow1Pu`3~zXfD=GFRv+hT zB!f}!`0^$0(zj<$tAKnD+FABib++snmGPV@P8GElCHDmM*I^c8Z&yJJlETI!K^eeN z+?E)rU3qRb=1lTAj6KfNp9DC1B4=)`!$wQ>b#N*5LJ%EXb}4*7`z<2QxS1uzVT^kp z(=W-)mM7{9s$Gi?69Gb1@;}-wC)S=;FnjbnY|BJma59ft8*k z=X~stoL}H5X>nxh`zpW3xQ^#GXy^e0s0p-KZ-?xH11d|Zyc)phmyYay2UIRvV2B^ z<-G_dc?3p1ER|8{5(3n*YR}1Zu0f-@b3@aaV;(Jh7JvXn40FrS;CT zFNe-7OuU@yC+6x}f(HZ1VyztvyG;(s9M|-0Z={+ziIx~lOsf!hT)T@}{#Y`xRk8nh zbo{iMnS%DGs+avji1kYr6J$%~4bX|NOqB5Edn)AYnT%hF_*M&k(baK7x@}078*;(U zcM0C)#8+?bz}DnP5DK^L>ZlLq;+dnlX zu&=a0>iJW4AbyVJhql?1fYmy-Wf#FJe&XK~G|`*{!zh_a(b4&5E3XA0Uw}>5*kOI> z1AR{^I?D7tsF2k2-ojs&8I=9EIgtD_UQhyU4;=$tvk)-_F+J$33vR*_LuT>$fep-e z1IsM&5jU2zl1Q{TlmePB<5r!pjNZCBM=i3Ntgovz;voK6gF)F?v-sUOi@w5hi?!j3 z6$%5bL=nM+C!EiZWwErXbsJpk!M;?W;jvK=PVqjVOh2902Y|(Hua_)eQ_~yeX-o+m z<=Mq_Tq-j&T(l94KSnEId8h&QVg{(dn5wZ$e3n)q?^=%*uG%zaFNr%^ z$|E^9gOgn_(S)J2x5Ku6v0M&_0nTa5$#RxyNB784;8d4Rq?t&#xo*)ppid;iCuJ8M z!nK+DWijB(NM2{n`@b)|;xag57HM$-CVP;|>1JdEDTQjaWuk<@jc5H+KG^S15fIu% zhspCtFP$T1B2ImB6k?pA{kTuPk}uCD_>6rV8CrT$c|NOT+UmlvPj=X-UFOekm298H45kEjuhtmFXPaV(vokc#sr_0zbhdD za-R_ppG5&w#(fazm`5{`xEQ;4zAWH$>A3n?oTb`CAfdm8rOWz@E~iT+S{ky%-v+RP z)NWTatw#ocq@4@dGRN!U@C`evgOU_nmfYi}mOxv*yg~+`S8sD?P;$2<_6|Dw;+Q%C ze~7-LgG~5n1|39?}*7#Uj(nGr{;O zEPs1$dQw!$CT%~bLsd_ZWl50_c04Yw;w{)*3hdGE`ulbOzfuE&D6#2(9Bq$q^(v7!xC(Y3 z;Wpi|tGNZ5qGjgfLe$WNP$v|_aU8cw?@LdB)T>3%2ULuCOFy52QLpO6wGKq!pVdQ; zjycvm0KQ~@JC+u+S2c;Mkrr@Xtv31>-*@_D8e74m8~EAIi% z1%+1?99!dE=`A*u&h=90?Rm${F%`dU?d5xR>sv!B)^wBWiv+q{e{VPaQ9wQ(w|!1o zK>rm)*Ga{NvrrYz@A=6&+XvL-D?VEG^5Ao!#ga*@w~EaHUQiG6lp55$o@Ee1sGVE0 zmjj#!Lo79-p3k3>fF7ZAzMk`#D++{uj$4w)pf@r2=|wC>Oqy}?u!_AJ8vzQ>-(8V! zg8q+yxV-`t#t963PXXC`fTL=_u{bm;WE1tc>Q2XSio%EZTGZtd)^ujJga^(M1<)b^ zzJVMD09=tC7{{T$ z!%IHm(0~%Cnl|?hD(-W>O@r(bb98jk;Om&1;_$V}7Nxk5{6~52D~#}<2+2r9V5a`u z{sH=0*+F`kABOoj0fp5hdJ4K#qJd`Jh-8TVQu~2@VgfleaEc=}a5P&e(^zrbe!9YQ zev~j=^mTpeB7zqU3cI)pQm7e{U6cRCd82RrEJAv4<>nPYol2-Vs>Yd{koO`6>YwVs z<9j(SqRYq+{B1|}FQj?LB8M(&hMsEzWMQUncWTOcT0u_R+2M(vjCU=hO9%A)KQYlb z?YQuN1jJx#sTIg*gh&JV(9G;Ps6I_YMIb2q1(h#kw3-CH>4bRsHe!;w77cRv7H*6V zin;;9Ev+g@?b`PLqUkH6qTr&n2N75u2{lRv7Ew~D?7B=7g7AGC5dYxZCNWxqbDwXIuvheJ)tk#d4%@x){2HQ|u zm7gzE!T;XC)ZqZ7i&xgZlGIHMD>S*&`D> z*@^;$f4X4uJUqf@Z8aDwv>JB&8U3sB*wW#=JU%S{Cd1-_0DC z2(Vdyv5ZZaxqVDq{lH9>37Q#H4i0SvVA@ob376%4VG5BN(|!dhdAFjr=Zka7;98$B z+a>ES#<8$zp0Y{)DhK%7*NsB8lZ#b+vMY>Htj#XtiU`e0jsmZ0X`9h(;_GyZ2)1z{ z)H%H9mjP8x$>=l`i@53z5(IP#%LT!%A$ib&27+32j&hN-e!7BqZV3B1>;+?gjPueE zkGDB6{AVIr4*x((nY}=*O34;Sd+{AVvRUN^;L)D`>*7)?6i)&+ck|mSxihpZ?|(NE zU$LK}*fqFxKP_{ALeTX2MCIT^2w(&SV5DFL>MPR@7K|EI8gt80v!TycR4FXE!Wt~{ zy-|ZlaI8wwCW}?k=_RWK7$GmH3EUK&fp|n(-rvo!y|;T7PhEsjVll|_f(n}WzB#t8 zjj#xKkO5P@0R$IyWe!PU*cdw00RI=FgUfsIJE^1G3D>(IPc)%iokID6lle65UMhTA z7Cqc!fhboULh$3;q2ZTfS@;c1ps==gMR@1=Ja0FoJIkKA!ii{k#w_@X??*E0$aAj7 zw=)6Jl`__{{opUemnSxdo7qId+hG4SI&D**9D_rcmFy0~#4>Ge8Uahz3l8DO>;;<3 zZUg=yS%o+*PLj&*nkoPj({_?Q+)%`?*89LP^?r!HH=_A3+ZL)>1#@t-@{+8>>q*~W zd!7eJt6R7|$K1!%3J72x z*DQUaTP#R9Z^IA^fdL87N=qkF`*iW8PSEHX-?eLQ8f&spliydDim5N1NJFpJTd0Ju zbfeS=uiI8)e#4IN@%7IKc-RhKu^YGuLTpAweMP<^JVYE+Pw^59(?7AU*`WoHJri_v zn>J+|Vz>Cq!4-4W`a5n`|H^^qqw3H_$59b?G$7EEf#2+cvLAQ4BH#souEXQda6uUO z=h~W$_5`T)`6rzH+2x2X12w2@IMl$uLW!CHoR7I`l)WDLfS%wibZ3{YgXzw1nv80> ze_sM);HRGNHF4JU^S~c7hR5yA@GDS8%lD#6qzorYfw+8C%teiOk!gbc5yj;Fjr9Ea zjdPt@D9J}6ECN@c4z_f0a?% zv`uO|GJRKh7^FQ=ZYEJnCj8^bwN#!d$kIa=_cI9rE^T3p2dnLbJQW@Nyu+^iqU5#5 z=ft5C#W6C#z9jpZhJY-JMwhv(2A~;Z)alwMC`ymN_6;<*KWg|U#XjvPsNlhepI*s@ z7b$2l@H0oL5z$pGrHNYW>}7 z-wFJ5_6(AOC$6HKm!ip3hVTa@PkL9u@e-*)s9tb#*T#h40quKy! zi2j`{hMe495RfCxIeZE!l?n~5Rj9%j`b_6_f>OjRmU;l1e3{j?K6>sHDfy@AElayt z%rT`{K-M5t_9Jmh*#)6X=qgzF4a9w#JObpe%E)R-6V&|?ZeK))6<0L`&HT?39l zfUr`#Ya-`VDThwJG={}+q!rEoJCERsr@SVxMY0* z>W@2ut>@=|LL*bUQ@0HxsHVJ-TEUgB@9wV)o+uy#&3SjPYOd_b=B|8vH;}v6+5Mtl zI{pB3>y`+nbHvopd(@lI%y%4a)hm5ifLkvXImI_(|Il(KX>{B{W^hW8oO2r zpWk2$CB+o@>JB2Cmb?6nnB_imqCuV!NOV~eyfxy(Qs0m7gh}oXPn24_1pB!km~;|p z$4;UDu)lJW4_~YxgI@ylS3rG87Nn58b-HQ!6)3&_ZB<+|V9M#pU|EAHiPrKz%4!Jr zq57jeBt!2A@DB-lru#a5ht)C@x6+RKXd(zBY*^EBc zZ?7e&Nj3Ga>g{7$2W_rQrrl_j)OHftfU7=HvB5uO8EEEw_Vh*&JV~*P>V83Dl~%`T zn%1#lV(R%b0J}x}ChfOG!mvVNoI^w!Xf&6lAcL3%?${v}<9@t#)N_;;$|5<}?0O3% z{QUWfKXed>>vA~%-= z6(7vQ6zp7uGpv(-eOTqU1?#^jKB1Dl3=%qya3NCa!8((n1)?=>NZqe%GjCuge!Ih; zTB|3m`&A#C!=S!1^esF-DGimKCAcCdX$0bdO&Y(W4$zCu(~VInzB0gl1T8Aje9o@k zOa zsb<8C3>`-*4eZS|sg+-P@C2AFUuqgoy;VO+FHBK5s+^Ga;i3#M@m8sCr%~jEmS7Ps z)EPQGwX&b8I#hUqMS%Ikv7i)FS6VH4e=-C2Ug^T{B4O|0pH1>!P_Xr!wshy~y+R?> z|5}F)CguMO#L)s?P}V=_THjb(jcFZ;GaP2lm}6dbqT+!aJX;~n`3a$*@!0FT!?Yas4O(G-0}YI0?<94B1v_Oe zH&hY=&d&}ZsuiYBieQpIup}R;Aj|h7*o;WiZ|;$T%Z)XY%}Sqt9^_O_o-9>sddI8d z1D3m7+#sYSIb_#h=3PjC&DS$=*Z3C(ssyJ(h~4krsCllq)TD~s(PlhBup!(OSIdUP zY5aA5c%aT`QSpZ1WKEzO{C~MW2bofe2O1>PLRQ}6UMa^{F~CF$z%Nk+eLnZmBB71G z#ZL< zHL=CGsiUw2EgV}(5zNN|g!%q^s@BcDX7Py!6+Omk{Z| z_LWJCA0B^$WEy&_h{r*bo;_8g&L|pb(Ru`AFIPI{Sgy^H1D987v=h&dOFEyx0{vjLhwe0zNjox6HcjYtZ zRI4}jmy7 z()x#{;F8D9QhO|{28Y|qQ@3YlG%gZE^mmUewW*)}(nl-r>$Lt=MsAn%rcV~tq}*gw z*dIV}zwxJ!chm4h##JNi@V=D!gWPga-`@1QD+va%z9yjHiiyZ*M^ACA2hWgC@0a(| z3V{_bgB5TFV~+$}J3%td*1tLuFYUltN&QFYHByLM#CXGz675Px#nypq_TZ~ZRyw2( z@B6Yf)D)R6Xr<-Vsl3hf!DNDT0Zbu*)e-@TuVjwURs32Hy#vl!3kE^sY?$t&bcggp za<(b`M7NYqeXigB=MAy5QGl6FYW*obO#-C)x?U%%s3~fb`GLyKd!=8>tkr{d4?YkXX@Ny3A|!V|R+L z@Jjr?y-f~;NIIbSC`#2abBwDDSCX?!_(aT%6?2bK0o>&5;V>uLDE&e&)- zu~{3bS@atT^sja&Zl6t-sLc1;m?yoQm#F^L=Ou!uhUmlM+S<{(pIn7RQxD5zmrri) z-QIlxVuo7Lj3~S?nooh-S-FDj1g3>fWDbvQ&@52+DirWXt{R$vY;?%b&GwNjBp;(qRayxF1F)=K4RG| zQR>7wkA;3bNI{H3bS-P`^gvRXhPGlT9Nr>m6t|PZu$5x5t=`{NY`kO$#n8&z-%YV8 zu3UJ>(C%rdalFhejZK1w`?5F9u+f}FBxa~8M@&&A_?1tw_s*|N+3?hBwV1VUskd>P z-khQf_#mGpxKx0uwK7fFpSP79^j!Mc6}?;*ZlQEW!vn+MQwCvQ;MNTJZOJkg(4S7b z%Hrl%5gMfSaBY#lr~6pJr7IcOD?gWTF0Ne`{qd&emQvRL#B1rM+(Nu_KA>SS{aghxuhSvDUMn(7i#Yk0X}8)%BS3CRLQo8 z0VB~zLE(=Y3M478g72Sz)_!m#%4tF=9{3oyowm>MhZa;-M=9~ZIi@{rYruNRM0f&<&mt95xa(}AASS@l* za<>9n;wa~teCO!k_EDSerniMiQ?cHs1!zHzz{?MNxN54joXBiHT5*ksK0F(}rojtpq zmqhoX4HX%$tO8h4ijq64=yhi+!+_s7q|E){I#lH(@Zt30zLO6K!4(}1ix1%0 z;ek_bZHy0(TgQK=_5Kc?f5q@+<97APIJrW&E-ou*tE4al@Wzw!FA0vDoX&A3@+U-< zu8|bOPT%~4ao!W~YJZCzh)lI`A<^-@suhv|QrQs)=Da&#HU1t{vw#iJuj?XyTN9FX z=^+uk#YcaVW^W;~oOX8+$x*Tcss@E4^)iyqf=>#P{i(XGDaOBYU@3qO>vN?q1gQm9 z0G)L7;oou4IsNW*yhwEIQe%aQv9ipnP8}srL9ufQG~Ym12K$rJV75PosZ!X1{>;P} zNzDgXhVZ8hz1EN{u+Iu zG6)u!MMSmb7-8mVwLc*V5|1n;&HS(EWZ~o9O-X1eUxQs#+8so*y1zXDZFtU`HdM!JX!87j~Y>Fi~LHlBfm+zp`V*sr)mv_Ah{% z+-WIaB@kkEF+SA|cdho|FqQ-o5+I})JG}hl0EdZw*QmYS=A&6T%T9t4AZMJ8PIcap zw0D{j&YpMt%E;A@033}*-G*YHYoNn*nz!(uOLCVl+2d`6v~-{lWC-Ne#h)*qW2avp z*FR0 zUUIkUgQov|4efrCYt@p-3@b_weh$P?p2nSwXS?%FWtqSV; zxda)QeiqxQj@U}eiI=EgpPpH30BRV2tA5CEQqRet27!=qpQFeJFSU##9}$tS5~+WN zE*4T+HbG>R{+JumYZaZc{RS~<7#&{l0&YJ>+C`B6Uza+`%SJjzhIF*&ia20nAU?BN zw}3PEyGsVaID5c+KrsfhBhjh8l@(D>p_ILr!KQCN#)~JLvWgGTh?ka^It8o_AN}?S z2&)4jLi7_`K+-KO1wN2pr3U%H=xgG0@~PPp;q{m;!Hj|n1R1^)n#9mwbHW-<&_T1~SrTAbd~hUYgmZ&MYaej-B%Yv#SD)FJwdHPujHbFRev_ce>V z=9Vx7NR{f?{n!I<7gxg5X#T%Sj$92mso@n*&Ka_M44(9So~4V%gSDHfQ}u>mXzXQPtAzFq=-FJ?EEP1byG{{U6&3-X|(vFYi zzKyVV9B<=%I0VN~5b@C)-YZHFoMv?cu$@*$&|@!y9z6+d+%KKQ&JLNrBJE}oWN)mj zhz33LJ>>ieE(}@Uw$t;?(RLu9_&KQZvT_9Aw<#aOXE!!S?z%{A7wb?#4q8YKp4VKj zew%BTe);HTk?Xe^?g~kDPa!iRyGE!2qnw?Z;Q!`zOt7F?$%-gH#YnwRTDxJicbm~~ zfzjQ&5U%ZrbpAfyyvw3&7YQ`u>)TN=xxXP#O1(=g2Nr^VYBzY&p^&4VNtlshGNY7) za22zgu7%y3d%=sZ*sgh|>W;e(!9bPwn%}I)Sq3nzXDM4(3x!(q5#_Pw z%eyxYEp0zB{k!-tO*|4QzooxocV-#-m6dYAYY0U8RpM%wqcT#NL>VXimF=iO+D&LE zoeqlGmFx_x>G=4n+FOEj!hK2ghs_gvxrs;}|MjhTZY>uE0d`3rL{}!!(@G090DDIv!Zv_7ti^Ey0c+J)Wz% z1n!?Am0(2qT&h)o9;#eT>ERD9Aj(wg3iXkxuFY1i`x_GlvNtWnx;D-GgmuA;=lc>) z@A5xC+8Cw5hlB&xFvAq~3l0<$W1!xFNWrmP2DmgJx&h6Mz`UJNft9X1l~*y9X*fIk zx1LsFCtT5fKSy8Q&6QU9-H9xxrO9`@;tR&3fNIS2xz_|z01Re;XTJN^43vXCUcg5p zHFy{jxgGRVH+RkZX4!V((htH;&t8}x@rT@abOV=-R40?c-T70&mirk5GL&!Rop*3t zFZ_gwRPc6=4l?!8D!S(!q{7^=DmnbL4E`4+0cl_DhGINKt?!*|F)Occzw)8Hr>1#} z`QfB8msh0HBiT{A&q8?j8{#D_t55A{`Z?FY6PawO4&28<;U@P6mG})m@L| zHfHoN@8NVkZM8yS0zSRh=R7u5LF@)Q6`K)Z0`D}UVAT>KQ4do})AxY&@9xYLKhUV! zyztt2w`8M+3_21zaCaw994pJ5xA{4j2?+>#=d~`@Gz>&9Sz&HRmP)pL{O?uh(%Gbm zh6@WmMD0sXw00G<-4YwUa93a0EG3m!2l{iIEZjM78e&~Tr{5i9h^@<^m=2l>V29}k zvfXBkuHE~RtF$_HCqjkgjd zoBW8%=-b`c&!GfxJN(>$PE+v!;ZcvSYyRA0e}$~P6s4?G-jQ9>>*!@~a$qP$yp>iq zQD5DNK z2CI}UZ^eCjEWR&#gX!>e3`x)H4lfS+*kWv@dw_Cl(mO{J6bTe%(`QZ6Qf&=6x2a61 z^v8m#e~bcpVQwOU$i~}73d!FQQM#jWbudAM#+-LyfJ8JKzV17^z{xssxNNL{B zy!FJl{`5VU!R37c?RPxZ#3J`d5^N3|9-iM%7>I9D85B&t^Oo!Jxd*kJ`84eUdEnWR8%p&1NJ5=d^ZQ~7pm->u!{;gbI+6MVk$Q1W z!4ew=upA=66C#XK5`OlWU|<+So-8}0Yw{C8d9XKz07b7*clvhQR;9`vRBaiC28EpMY41D!AYc0=TqIn1B!9vO|de ze8(TFEpTUmm&T&ELKsrr;z&+TI|} z4%T^NDs;0LpgO6uKa(`>2J&-Cp+G#8bCKxlBS4OM% zj?m<7|n0sgOY% z8fndKXU(`=$EjwH`!5WNUk1NCQxLm$?e`?`Ay@s3U_KzV zzIts4E2AmRkcq-0a0UGW8R1*$Ol>S46Eh?yQg$^TahYlU1LYlOBPY#L$Zw2iLE! z_&%|HCn>Qz$o}Xkx--JW7DUF2ft<0HnCNe9L7AH#BN1zVeGjKx(aqFG&BnKG+~@m# zME@PgSp?2u5Iy8oS}i#A!#oQLIkHGr0 zp)0(233&clds$HmlII9f5JKB)3BGDdVAPT#7bN@?*U&@L4TZ}p`XuBR3~_;qA=sly-hg0H@LPI*iG zjr0N6j!X0YWeHlTmb3h8gG#>zxQ;|w=v!AFaUxP_YWlTwj*-t+qRc_0ZWnGA^C~8 zhG1<*zj0VP6d1pxrV0|F?^Z=SHb)Re#umsxO;T&@JQ8PnLoddFSzG3;Bac zJ{1Urb>RBZ_^wSxX)JwSGlYyujnM;WVP7mX4cPwQTc>LA-23fA}a?ja~JmVqh?!KPn(j z66XzbkZEL3$FxFInX|Z$&w0wyo`ig)Q>wl=Pn~E-Cv;Kk&9um_*2n07ZLjm56ws9n zho930_7Vn3A$ygy=^03)Rqs77U44GrJ8f1ZveB_mx_dV84epm-(!|F{FZT{4hAm>1 zK^35|IW+}(#=4VY%M4hg@F91Be;q#1e8>5<&Q^d>Jivi7OftD+L-g>}Nv<&}-0p~< zVcfh^M^g)x^3Y-=d0L2mIJD0~`4$~u&BIyuwQEdvpK0hp%zn8Qr*a5rq>x$;j~qr+ z#pPMmbFPF%yp+G&E1%LYy0&DO?)Z9+KQ(o9cRBeM)Jt{s`?RX3?bc?V;9e})=B5Um z3T_bbPKk5``D^DAej}o-jdVd7YlNDUlM(riAmOy+5zaYc2E>I#IM*HQ2HPH~^d8w+ ztvgF5WdU~+me?hO?ZnaQuY=qeLxaDn4D%rE&J61RXjZKVr0xSe?C}TYiM5bE4`uno zy0-kyCCj0-pnvR;_aaOhg0-O&PHO~Ub1ebEgxMP-N-gXN`F59Udv0e*ytVWV?!XC> zZcCrgGRC!Wdgl>U%y!ntS4Xto!Xq$P7YJF4?F_Hep_i_?5CVWCc+X#X8KKI#n)|(e zNP0=3AuKllFMEI$&$LD0I?y{>><*tsGbiL=vr8r-Gr9{) zxaI2uVi?8_vL~0EE{UYp2PvR#Qy{OBW$KPT7fkQxxsslfAX?oS8v3^tDLX6*0vMl> zTMn%`GUJCP`1#7*HY*0tTWbFsIDssYaR%X(BgYrMVS9gCcgh|3&uE^ZN@gH8^|BbV zcl}!Yx(;D#OkG-yaDTS~_vp@=w1QrwxCi}0| z%?Gpv3OD54jd6S#G(F-=v8m4rZ7D9!LyrgTTR$C;N=t}LqN4sD>Vr)8bAiBo-diMc zH9G(s?3p(wlhO64=jeA9@i+XS4=dxqK5G%Ow;c~+ zG?{__Y~~;X8Pd5w8)>_nZr>PC-dmD7&f6=o^=81Rcc7yt*YQ>be`gth@&Ss$Mghu^ zhmU!0g30mVtCBXPMI|RVbD@KHz>J41?5PWUiz}## z?bCok0K1yfoKV*P1JB08e9XU6y=E$gARcrEh}h#?pLx4QH-xfu=idc5WHR}K+BFsJ z!Qiep@cQ0=&Z=k&e53nVb1;7LA!RnOn$A9?Nk$J3rej|x1xFdm;(lVhWR{?CXMB~k zJH*+~6{;}$sWpmdrNysV#=O|uD-$8^`B-WcZ-f7Nv&bzR#A~dlH?Z<0Vp`S=;gg?k ze-nsL9+>k&!Q1xPpDCmV6(rDv{0b7!jRT?XW~0-70h7dtm$QpSKjy;tee^5xnR3rK z?t*=W)fG%yR=S6qv3H#kVbA7!7dw>!W>EE-J=V9-;k=Ydi24|w*y3osT!-8K{0Lx~ z{i>HOE^#Cv-hVb0zYiI}g!Qv?I402EIn+GXb41HEw+!#Q^pu^RXw`|vj#e%4!e5SW zk2?ObUSkfOFvpVBiCwlB;~DW&*py!sdvfWa-e)oF#)Pc9dlhPUp2rY(DNbl zFr1suvO;xx?%zc5(^JuGtoxRl-_F->`hfm}4)vs@TNSm^($`|dzWH!~&0Wz_O5UH6 zmGHyB;pOhq*do_sb6cc*3)PUgzaQ8khD|uvBD6WfvQsuC-9#o(MUUb$WU4wzD(6SH zPwUGiZ7DVr7q>DUqkhG<>hjR}HfvBWO=J7LrnupnqmTAbF#f3=b@Wtt0WYgtc|{*O zWprKG>4B-TA@CanWLVT|N}tbIpBQF#ko7;I&I=05fa<#N-DsD`vg#F>>!0IcIFT%b zlvk=PGWYAQ#7OBf_EVWEh*W+NwPlbLDVPy>~l-nc>u?PyT+_Zl|*&@3oujhcm^<2_<6M_bxs*=XK#hRe1V+K& z(C;TBs6ygY9f42P^mfb7ZqL>3k@A`qNzS9}k`d0Qcn2)B5}sP8d*tH^sfzb8tXG)| z$<^<$NuCFc0NUCdutA#INtk`_b+y%r%O&Z%0AXXB+T1Zxc^$h*o*&hMTYtk*PNAD^ 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
  • 0=?F~#D^EG-IFK4Z(t+k*JUQh7)rg{Bf*&q{GsuF+lT}z|lWlx(N3DC|`I z`|(0tV^VZ)X@bN0g?iAi_YhznS^1*Q@=JVp6`?75ElijClC!7Hd$f$|WY|dCi1nCi zeqdiI;xU50LSSK{PUKVhpFwQ8$}XBzyT71cKMF!sl}1Er%M!spe6*o2a>=X8f9`H_ z@Pcq2C{VI!=edA;WP|cdO4j9{pD8D{GCNP3;oEO+TRhZ;m?)Qf{=-mf_z$SiRX_Bd zY8boB>0I^F$YvbGalDZ3tX1-^8U=!+;uX0pzvR;rVg3;07@a1Eb%=7P&U+JM{7~+M za-+=Vt$?kip&5LadU`%u)vQOqQ?+%JXL?}>r(m-jZ!Dr{zp-2}dJpVt;kk_4_~?$Z`l-Hh`4s}G`^L@8tKh+l>AbN$f{sT z#8UY8sP{3oV+O?1VPL2U^lO-Y()MkX!o(ldR|>C7NWS*D8Tu9|p@F)VicggEGO{a%SBqE+alb93 z*5LW@3aZlyzBcOB&@(;@TGy8g?{@w4oHb-OgV%e?UO&94a3*B=L6^>n1yL1{pYD4) z`t)-D%<79+9oO6?=vI9IWz;cl7D>bFg24A_KH3!R8l^j@J4-v(A>qr4{GR`o9^Z;1 zN3EXxZ~o43Q#So#ya5=AAjvHuTASqe)K{Bh(kvJ)Z!o`o5?UCp5EEfzsr)nd6x>sv zBz3IgcsP>~Q3EQeqtk*?3t6{Pr33I47?csb%6hu5v=p*HPnrTus?m$Mq7~W9L1c#{ z@f(lTVq`drP$7)2|F{GQ0L2-?T^3+_{Gtr*lVTxuhq|9Xk`7rXeNIF$<8LFX4#3W8 z9oK(<%dSZX_+D=3SM2aJrcbWlQ=OlAl6al{oc&F=T=FNkTLPmAsg6upRNHb%wz=1_ zBnbw0$9xyH{cYDDkPH_CMZ}5f04?f|F?mwu?*J7$&QtE0m#ckhf7E#|!LQg`H@j5D z%byI%cd6gID}re*WuhkXPH9q4?aQPIR+AafIAJ#MzTW+XY#QYK^5&qi8*#izEc*og z1GJ#j-aY=Mk}z6)&XJs-ggPm!1`DP^DzzggL?~=oS8zaf8nUqbti%8T2GAVQ&?}w! z%bj_Mk3WnT3}8+J2HAj)qo;7GYtVhae{;-N1yUO}azt;cv-g^AFe6&FB9hA@+wvCEz(Je^&ZRqZcG!j==Nt+NwiL zI_1E;okX8ZjkFwJJ8*munUMoA@n&VFB6c|XW0uz?%OTZDhFBHtUFSUho>$55vBB_L z=}1G~_k|667IWB7Fx6J3$h-0D>J)9|JsS7ewglEgd>#5084o+*N25C8lSAZ$d^s*% zKf1NuhJ}h@A*&;qo4H8N^vV07{s^6ASH+^oyjs?4v?8u@aejF z8vVG2uMkF>*KDhN^yI~?e#6HKfuAm+2SaUhmZ@kT*mZJGH}$%^oGQylu$lVomXQVdcZJ)oh6a0yzwJO&l` zh_4V?_z!dh{deC9b-znq8Q%!!{IL-)MB}F0m$|p~(OO(=y_aRnP0Z5lnuR}vbiya8 zWG&U=scc!Ob#WWOXJ3ZTT9)A#UpWP8PH=fB#a@L@u9@`wfW_g*nlgDD&tP&qG4UAy zzfO#OY{Dm-f`(pzlYzva>BsT**htF-w&4iaL5!nM&$@FqH>C z-z2-fZxz!5aSl!$ zxL^NLFu=0_oG57nFwzxBI>*HsK&jDgqo$adTd#-6Z}_^~ft=3(P|3gOYvkT{#Aq8R zheTw=AC1Nt7F_D==UAqzR0?pvg7T!@y#E)*BY`ryf1qj$!hZ_XdBd1OcZE*QQ(QqG zWS!8~T#hALd)6>ulCc*|bt`zwvT#x?dYw-?S}Wi~R8TksirstvilHbcdbZP1 z9&pDO<%2{kBq8bY$1uy)o_cBX%Nnil zRB=9I9g7y_Jki=^-+)aKS_7AoENCq-)26osE!||C4X`&o>I(70KSrY;$N^xB%1VhU z5wZyMJE`+iom}!G$Ks>zm1lAf{YndbVADWCQ-%qHXT1v+g1-1Os9f4DRX*C1YG3op z6B7w(*jlZ&00jlWqQ-|z?~ZLwl%*yVt7K*i3;W`N@fKC&d=+4sAc!?ROCODl0F0xI z$pcu^Izs%AuYP37DJO^eOwHpH6Bz%fRSJfg8kU^-!`U>2x&*?=9sX=-H3Xt6S((t_ z2)Tra+u0RjsYQLO*+!( ziHn+dd1>E|>x%uihw892sI{^kSXxiFCI)d9!3-x_$f%Ra@(%oPBO{Pt@c&E1$kL9? zV>bOXdaC8ncW7x{3I(ewbazCMg6kMl8Pv47U0{o<=E;K3Z|hng&(HYXRP>KOWRH}zG-N`a#ED3#T-HYnCpL?*Yxrhe_#)A$^ZMX zC*s7|r&hiH#WoMPHxWvj_%4T{dXye4og3^7@34VSk(6~cz%B@9z}{XMF4mDZtRlg} zm~rpO4}*c+-y?n39QNT<7FMiex;r87Cdtf%=XG2fK|w{*jZOi*e;kXd;}#?fks_&S zh&Ybt>ts5>)oQ6A*|J0Xnvx}}WULTi1TM$PIZc+}-jfu_mwZmUST@<6CD=u4q zi^aB1FN!syCmQA=eTf7%o$r7%4H5#>0nXzT$9fjm{}~EFzIDcAFR0}BV;jVx0I}51 zKmV@=ye;K}^7PB*^x}W0cf)?z|AA)l%3`mU1Ku`Nr~g|v>bxKek07Mpix`Wgf@*Uq z_Brhp-MWwOVs1==pMRG)J5-0X|1rNFB_9!eV}E)S!JHx@%nc=S>K&GMUR2IuG`&xB zX>iB;HBiFPK92>4A|$FDfbaol!1cukIt-=IuLHjSI-RJ2sMU!fx$Ig56uF+!?UL3xiaqy&!_>g!UaIDh)f|uIa2YV|Y?6Usm6tIZ2AKIftyap94Hi z`De)(`UL$Cf?Sgq8hFplW*GYXoMf6nOB;JTiP{=Dm{uh9u~k!*w)VW(SZ9FG30eP5 zE#`Z-%c@m}>nUSvnjK*NoS8KG7PK$B!L61B@UsnDOq=A|p-?}=#igTt<2Yxd5R|c% zW)Qy}vuf-Am!geghMKv7BZeZB3{BPtMZ%w!k?2Lp%M~>4+tbc??&q=x*S1Rj zM1cw?$6beIWRTOcNW*f$2T1*+F{m*0(EHA-YfdtG>3l(pNA{%`NK4JBu&V@KY^sw$ zX%#e$mynwGN8qLUI(tAek>vC#O2J0>!q2n0goviplsSTJt8)$4^`fAaf(~oe6`VT+ zU6eA0lAshM>!D_Hn33QfHDHNgtsfFnGer4fBGKw-+7D<*H8)TvxgguKuWxjIWS*8l zE-ruH-OtrLVh~YMpHv{!P@a+Rf7(KrNLNM%m!Hj--32`X-`fo#Sc+q6azXj^Ef7+a zu-DV*dLxzsC+ojT{UznqL3t44l&Qk!>BYsQ2x=)q}Fzo}xmWb!itx?y)M!jK=u?o+&k%!`cjJOoXobMqp1RU;5Ke zfY80IG<_8Py9ic2?V`s{EBD(u#t&fch?BA=3z`|0H{9a9?GBV1ZeN%zuq;>{NVm1N zpFBsrkCAu*f~jDn>o4_x(X&&#l=@9CdrC@XydMFoAJ`#Sw0b7If-;gH7%->=2eitZ zQA&@Z&w?}7x0I6X>l6*6a-4W(LDwCG$ID4s=`h#&Req)qrz#;}>+Ma++am@n2kx~z zJZ7xScJFOQrt&+lt}h_;e;;)3h`^2Hq7BtaH{%B&9FW}j+$$cKBtmKnP#1sKWQL!5 zf8P%*YM3AY*v+rk5e~8SSp%EBYbQpIU|9a)j{zxok+#$E{h+-)gO{D)pVs1r@8CB1 zt9eK1d_9b9+<@8XmGn2JprosY3Mzfq2) zijE^aj|q$cCP}nbl|1^SBKQd!WJ|kj?Ab%$y~@__J=ChO_t^c3&po_#Ow}=rUVJO% zh#{z{@c6DX(ZGKAR}lMb(M>&9WCqNV3xjRMBhc;0ZVSK#NvTc^CKyuCi|A^h(auQ0 z#v#M^5wSR=3vNxHMG4+{Fu3+$RBMa9P!ZvmKJql9ZY@_N)W#EGzRtViGko8lUw95V z|5y3JSXQ;KLi4uuq_U2D*hrLd`_Rz`*Mr!YYV zF8Z8W7XB}9SL2ny4A^c*zSWq8So+@pk{n^nf97s#8JF|X`a)9h0Q62_eQ;FrKaJ5x}`b z9SlF!Sc+3kq$c@Kd9Cq6^XcvL0-$YQ_bY2!&-w+vr2D7b#RASTo&q-SS=wv!Pa3dx zi3RTEsi;bi#I2<%`LK}Ohz$G$2R4bhYHzz`8xkF#cF+?<80d`Cx#_nFI!Kxom1SS9 z@jrJhDmq46o@Fq7OQd__YONhQhqBNF}RppCuRNp-P#*`6@_v2t{6*a&`_Y19FS*rgYJ4$vib4FRL?j8 zUFmAAqZs$yYb#8(%U{)*{W=nxQ+R2r^cBz3X6xb+T^stgs$N7RxZS@?{FG{1?za|R zvg@+Wbn0S1;qH=NQ%K|jw77Gc#?t>Pt-n92Q8CeHXXYU7F|#j2QAADCO%OCzX;S<8 zq*K%#U}=I7(f24ST=F&n*Smh%#E)ng)1nACOlR0;_(G!(MkFtP?W|(Gytp8e%zDWU zPJ_jlo_t}%^F=(m+K_5l6eKGgk?+j7D$GZe46)u`QbElHJ|{n*iShk2@UOXsUmM0O z6TRMB>ER)h%0$6^)Nd0s_&6N$I@KIxXkYuWxNqvS7-M;kpae>G3@(}BFRQCk=SIe# zF?H}c9bp(4VQY7qWsBnk1E&bmLelUp2>R{cb%(W-Bi7OlhzMfiBt;LKyrKX}7~?Fg z9YCu8h;qz#`Vn;mLpfFSZqso98z%l_Z~&^q{^8$U!-!Ifc5(kCC-BMjB%A(&NGTfI zJZ`}dRQ(L7%0E?iRuJn0^QC}b9JT?Dei}TAu#@eL+rUvf+s{78Oejj zqKtY02&@DN1qdu$R|4Dx3Y56pulYP~k$#lhineo4h^VFQ{Rf5g5-_+v|Dq0TF-1Zw z83M}&{QI!SgQ=J?n9GAvF*?1VYe=+5?H*ZgcdRr=u zq1LMN408@Gzt;`4EqPU6Pp|$5;qSSHJdGLQ)NG-uDBe|BXo z(2sZ08hr``SrUiq&ah;O6>lb)(J=yj$LwF&rb_7EaRDcf*c3Nj$kRXLk6lyD2-y&M zjdN}ZZ7Pi;z}y^ax7t z72J=i(JRto(iie@8p(pMN~c#%vlD}OI#}vDw`Qd8Qeq8@`O|MMoPx#P+JDPZSnog zB7PA2fzhZ~kB^wZpNKDkNkY~Z-=2fo)_H8QS0S9ljn-2D%#AMjUkzBn(RLFOQK1a^ zRBT+OjyZwxa=pXX^<=HUcf;fxCkdHdOl?!b*xpGDrSEEqTDf3>X!Sr$|0Loo&5jxa z?pVu9#v~04i%gN*Q%S%VwAmPep36*9ta)7SErDq>@Crx~~{BEjj!zcRcWWRtVrn~k~osjK_P<`D!`sS7sY zBxLG!3)V^u?hQ*-G(UBj!qC_Gw#hgEpM4l7XLfXk?7L2Z*#%mS+I@oK$w&JR7Y9?5 zXboSUKmvXu*QG#BkPpFdeY?`da&h1r?;Rg3Asu2ib9`s>n@%DKS4M6S)Ec7pgp>pe zMbDjb#llW`<_k$LoD*wM78I#w5`{WHqEMydymRc=;5< zO3lms8tqA0rH{%5Cxt2Md3SG5qhs;HifoLvw&WD|;Mq)cOqr?Z(#Yt6I5J!tgMJqu zlVd?f>U#S0Q8BvH7lnmq-L*qB{PWbF(cUrGY@%w`w&5|GcRq|V^snW)uimtc{=Mtw zm#4(h3iSlBrf%lszD?*@klj7MtufN}EInxUK~)`b? z>QQZLD!ahO=GmlsC5LK<=uQ7-;ll_=m`&jo?3@m7#c#@{>*Spyb$;e%hT>LRIQ@u> z>&M#sk2|KB?VTg52Y=)6m)JG!&HA9(%38Uib@05}=JNxrnB9jHOi;^A8|H+*A1!*v z2*v?w!DMHNaf4s`@?@no4OU!c%UZrM3^0O!|Jo<8nKHnNeeq#4b}&F3ubgkT<>2CQ z>$?gc!1dc~WC~n+*)%(N2P}4SVq{3{Jl9! zv^G39umRm*V4Dg91I6a!BSVjo1(f&&>7bB$8pF7(nLF`(43_ra{`c`mXxW9V+Ag*h%X#ZtFd^It*Djo-!br-U9GoWes)|EeJ@Q^Mw z5_?<^1uO)YRD|Y-n^Gl#Et@A_3Dko^bXC28sMsf#YGJLxx;{w-cVKmKo}R)3B`Roe z4DGkrTL)vgFlpZBzSLmg=R__d=hntV6&hcx@xBY0y#Y8Raivk|pl&v@BNVM;m2e*L zjUAlkNyb@!r8s}eGU{93z9AId;dp%ZhOCt?7rxcN%W@2A#K<>z8W^0ba6ga(p==)g z{cbKA|GziEw=``Jy-Rj?nX2ATa0@cH zVc4Xc#(~JW-(k~nE~3ABrMkCEI0ZEZJ$sy45vrRls@F5I2`=MN&?RWP{5rp>shv}0P%}@YNI>E(SA+C8ekSYe08B_MPAfVTB4j$gO z|E}D1k*=${;@6B&PQ&&eXJ(Ms&7M5>mv?mkyR!SL2WXHm^mcH8{T7qP@sSsE`JJwL z?QsX{YdccWjZm~G|Bsto4>i%%|0MoRJB?ZAUC><;TFaMMFU+NH&76R&2fS(D<-p(+ zJPZIEONP9X{9!~mZQp$oR^Ke4_vs60k*-4KYCk9z@An|u*6wjkCZ+C(*#vuJ!SeG$ z;f>T+LXHacu`S|^*xOIuq@l56f|xkvaE;~~wraGk#$cFa-rDt5e7;p}aJQW5GL(*p zBH4m-E7uC6$e-wMF(B}ndKmE##vssa)V+AJz;B8*>>T4#jg`^AfO>;JPkonxx;~g2y?WP^_{ac5y#a# z@bBPL_X3L+tn7QW2Qdy*arUGzl=-vjh2R3Hn*Wr4^;K>2QKuQ+gxc{7hT~@Hc1M+e z-tvU>8ghy^gT2h(hU1w2J-7IAyho93tMQ_-q-cI>8u`ef{3idqPB}HFA=VDSZo4!W z=fBFUA%5W@mU8FB#+ZL8cTZa%z=QVV%s>B!cxmrkV!Qh(rE^zc-m3YUzpuY*n;jwVpIs%Zx4+{WYI^?M-HXQfeM|f-y)#6}{3Z zHL_6q(6WLNhoZ7aTm<`142d`FOQAnla!b^lL5LrdLu%M%B1Yzv!>rt2 zs$!(f1 zn%Y0gVkY!*!B?a7h*rPcGMSdzW{X_*O+S><^AaWn<`Kbwm93q8Y|5L^DwPSmSG6~# zIEERg^U)e@C2VkM^&mPOYH3i!2F&@m1WT1S%P&WJWMDU&BNux|DtyP}FFbDhKCT#| zYU!Swq-KH)R`9Qp%v8F`kMXK$f~Y64f$N0C1yR=mwA**Bbxr74s$zr$9K`?PLaNId9>B%CN-e% z5vXkrj^B94e70CtKD~LVQWOWJO&fs-M}`2GtyY_m%?T$(55dW>tNH8 zFzBFNqO5waeV;->c0CqkTS;VJKcpsEf!p5TL=R&>_*jcGpn(Da`n8OG2|4DJED$UrjKdg&9-G62=b=oPNI6vFbU~V&f%y#1X3;%D0@Sz8XnFfw!L}prROB zOE0`CYBb66g8`-G`=|M2OQ8CC1dy(IOAoXusVzwJSFcY?Lu>29?dieW*Vj{_%r-Eg zst>6ZV_qw(Oj=J~;OZ!w`S{n=4vSQ$ba8jzJFYC6X>;OIonXj>c|m7qSueA28n?!9HZbgWG`#CGQF&pK@V&TqS33z9fbV@^rC3Dm&gRA zNw)$^Jy1J9%L+-C2dHEVa0u6rN!;Ijxm)ja|7+0kswEg)n4dAB16gu;+2=t<*jqXs zA+}hPem_$dlCOi!-?Kzt&i4>VebQRT5Fc_2BD;=x)PLQGKHUT@(8jn1R_C9#)1N;; zl9%Z49*k$2%CRf*S3a>DC+FWlCnX8*_bBcIvrhD-gF457J zRoFdnomzTnQsAs%mL?m7MUW?(U!=p}$2V7g+*r$nPC*1cLUA{RK>i$5r%u~_`S6wf z5CqFdv;>}GvAbzqFMQwKBf(v>r){x8YgH8Nh@5*B6XS2`8k>S}&{bI5Ja_Le=cy(Y z$=#gNlTC5>&@(06`it8Hb(fK-@eMMAONKk z+|x=3GU8jBz^q zYNS+?&?suOdEjN$aXfU^lg}S2Ssty_)z@4JTU@ zf${|z8oqm%Zw{Gvn7IY_2P8V>eP>AvTHobrBZ|RA4o^rJw}9fYO3N|sdJsf#JE@|+ zuMHl~gF9F;y!zwU)PhwiY#)x#Fvz{mB zviY}D$&8qh<6i^QrRbe&`A<1xKmU#p;hJJXghnS~gYK$G;fhnz7c%t*C7aQ0lIGZl z7!XL-Nz_k+B8~XZ*?8W=JSCKZAdj+BBw+bupZ7071KUZ2!_(D-L5dWziUPL7P~C!_wY%VlCafTJs=>cik#B*vtc&kNO-=r z%K-|iyTDaooErW4O~4OYZCVZm;ok?+ee@Rt$s%Y2w86 z8yalrFh1O)1Q4N4lRE@WoMaZYpQqnL5^ztigK1or3UMS2ZcQ*~O&fls20)C@32HT1 zFs{-ej_bLfj|DYZKUr0>@9LTdj$1jRa!OZ?4G~VzJZ%G z`iuU|_d(hD2H7q}ffRCZrVNho)bt&M2X^59yFE-0Cmi6xULzzXu`XG&vb@5LTPspZ zP0csHOdPoCs^_h=+Yiw5~j8 zjhX1I6K>qgT{Yg0Y=={ghzCy;+4Ix#eO}KOD|zm^>TLW+T=NZhf1g=S43~B*7Yk() zH@O;Pa=!luShn_kQ&%?#!}z&O1`6 zrIE8LvAQ0FW=Ak$1M|;3v-|jRQ{>~m25ksgVKJy$P1_A?I#*8bd3U4|+ijPCTQpfVo&?HCi{$op1#m6VlLxshmVpA9k|O%HXNbW(&RYEZWOta@!l z=X4Y&=`YT+omUhUM#0!s^TcUFYTiBJNs4#;$+SXT-nuw~rm#sba2V1#SJT2vRsZbe z+<$L&=!;J=I(#sw@aB6q%YTE9G!F{ElvgGKz~i0K%e zo64&|k&J^vL;4ZRci7>uDhet3Ht-Al4)N%Qphk0G5{{NiuGSFIE4`SryL9))hZsQd z@2LvQ7>ePnjC$J~tTuB|Vq}eRT6>Cn@K2$j;&W(k8nU#Hru+tF3xi%pk>C+zC-m@r z66dytVl;zv(Ai_3su*lV4B>~y1JtNQVQj*h9Nwn)<6Om5;?+UF+fa`DL!qrY-e#MZ zWd$p*66ur_BovCI|NBY}1+1Z%Gvspi>e(HSAiH+q_O)J_==y<1!+(@_so!SE9=-Qc zt)n@=Ix5QUdmkQ3Qc}A6 zAq27M77z&uQIG~vy1PR{Iu(VXlm_V(P^7z&p@;4vhJl%Z_wf0y_5S_STO_) z?DM|QL{`3{lu3@@->;Gn7m3#`Yd6%s^If3A!OHys>S1PVW=tda<#S4(3_ff45!Ab$7${K`~1wsGhR{F z{?aN|t;JzayEG&l~%TDji8=}Y| z%cduOt6;iUYChPxbnWz^?B@)nKK22FK_6Is`V_J}wEETlQ)NE?iyAMl&U$ZEJ&{px zW}ClT&)pyv+7La7RxE-UZ=hTBXP)H!@M9XJ9+(*WZ2WQ1_j(&spIRyB?a5FF55j@; z&YoI^KcD9fN-p>>Ue83%yEw29=aw_y0}d{|E>#kgz}Z#}il!fl zWkr!Jx@8f6c&k$CBWSwKC$x|pEQ{)U<$sh?K4-gCAF$S^8pJ(5^au0+Pr;4LZI-zV zOl{CvoHlj}3=H|{bQDwzb!F=BSx2Z1_4Taz==|zH4-O1GNFVb4!zI})Izs_@$BuVj z_}J)i!Jzz{UWBEdC;5gy)}R8u;I*s0FQ%h1E)FUUtd-djT*STpiC5EZr_u4G&^U~W z)N}b}u5aeN@6F8I{oscU{*LI1=wSj92*Xnv=}W$Rl_e{)wGi+85xqtvpjul0V(+b^!7(*($i2W z-bI7U&3Az-Z~U!__JV6jGiI}K8jymLW;sX_NwdV8SO5Pn4yQxy5Tx33THdvgq7+gM z6S(6SE1#feddUw3PWs|tfm=_l)i?-=*SjuRpyPrBjLOo~RF#Mv6j%oSlEaz}roOfJ@!@$kW2DLQF@q*1 zyvLF4<7mBc@1?9P4n%LJ0pE4$X8kDWy4`CTO%7C#QM5hOBH-fL(l{bPxrE|O9^xj! zeuwdkeemZi5uzhKMi(Jz-=-u*dwjL^Ps;gr@WSJ;wSwxX9>@2CcB>vVdtX`)YO??9 z|NXKL9!M{L$SSDKX6RhdBtPp=J+Awg^mOuW%F$N!?R${Vvi|f8FjlR-+C5Ry=QDHm z($zzq0|LKCP)eZ?mcED!)SIrf`nTDE-TbpsQeV9I34U#^uQUF+#qgy-ZKsBc-AueM zw(c^?A<^1;0CB1=^tbLJ0_H_z5eA3v<{Zln37X{IPKcVir7AdLEmS_Dp7E@2D8YCd z&>HJlM&qp`zn!#5kHT)^kKDk6?9s&au{X`$c$<8RLhx4*kahl~@*IlfPrT3=NO`?U zAb1(;9d?{y`W%dgqoqM8OI8nQ#IdvWN4n5@lfD5d(m%u$2zo3f37k@ui%JtxYw#@J;%7vjhmGl&M19v?o z&8W&i$J*t%^N7aV!i_Tl%4N4b zu4AUc8r)oz@@Z{8FEh1tm)RjavTFM8J0+bT8ZFYyrBC!oM8|Hd<;@pz!bOhv?cUQh zEX9&tM#u5zPWi;Aa!gAPuS?pf2qwa<)J6S$rhLqG?+O{Q&7khD_9Z?5aoa{&tu5a0 zn=ei+HqnA=U424H9MlDv3>M%nMEie6UzJsi4-es5333$F>`+?0OZ+Y-Xif0?LavFs zCv|0Phw|5bzfT2=Ec5Esz}Iy6ebg$U)E+paAY!t6OE$Y0xb(~MWXp9lOMg7J1-KTq zltZ_R!<I9=iRUc(7cQoJ)aZt3qV(S$dwsC<0EP zWud*K9qDo{g)4O%bgFlaBJuHVRtpN0QnpmKgb^3G*Y|4Cx)CYyw&R%Y$Gw}iBpv8a zhyMz@9Xb#3ka^MepRkZoJoq}IkUh4qh+RQvp(=6jUn)(~;<=Ralq)WyRlp~on;Te8 z6TpP3QbLgG>;E9TElZzfAVpbvy`3j!;oqzUjxu9g%2*2B7bkr6i(Yt_C=m+^2Ug&U z{`y6}#E=^2r3p(2u+)BRa+xo4C|nn0Hzi^Ax4Z*A{+p@+w-jmq%>X?^XSjLgQ(S|! zBbA299w8+PZnK9j<@b3Cm(Ng21$#+VUjNI;e%7$~;m@h^*0kj95kP>Sp9lG|eq0F5 zfHQnhTtjByy_}-al3lO22wb)6>d=Ik>aw#ZFTS)Npyn_mNIvoZEZ@Vwb)R<>HGkr! zX3M=L?1NDXQ>7G@j6U?X`?_CaA0|0-ObnTQ4(UU$TLw?uYW!9GXXB&hqZKRfe-MwK zIzewfG5fesSz(ld{eDiXgCmX4g_DGaANRY*;XfJrdoU=Fn+aU~0zKBxpWg~lY}Z__ zr?E|7Dt%uW0|eL+QL@Od6^<0U68b>bAf)t7;*#yHgVs;gnByPMdKHWB*FB_k!utuP z`B(x+dECb*D=^aL`lL0#{53{dN(wFQ-x7xJuvUn`|L&W-8_4vpYN$eF{|I~W`drse zto5MKmzm={D2gCsj?hjNq@MdQ+^t(FgamiqJ@|6hs+W3Mk!h7!;;LXzn8i_?`>I_2*$^96}Xl5hhv;I2PxUy4FIvhHyFP|7K@7tb_!gM*B7 zxWqq2U-{p`YnwBwO`_uE435(7zKxZLc3YUEq3TCjwr^j}DejlK?QHqYA@N19W2;&bf76WfjXH<<0>uhVVdHQ2?n$6mT2%_gWFClk%ZaxI ztVUVd$K8(a9J<9YkuylnxQmK@Ho7$Pu(LaHm3}Bx{>l3+v*e0aT*Vku`wXQ`_iJW@ zZJ}HmB=+JzHuMZ{URH@{hijrZ)&?y(w_fUytwZlLLQDV=ygE;p+jn9@8^fx+9=9K; z`3HZmTN!7k93oQW0U5MAz_vJY9K+EVZ?B!^L%gmIxyi-nO3w^xvzVDwfYnsl&G zuW-`w2M#&SsGv_Xf_C`aCC%7>2p7ef7NLl zY3%w6Pm*R1VUb!DeYeb#wDKzVEfSzan9cU#QEGE+TL9`x>s3AM5jyEFR^-)MTd0Vu zh&%dqEoHNeN5J;*%#eVOk56~8bY-S7;nIi3EV!5Ec%4_vJ5lFiv<`Y1^+!W4!-Jy-TIuhE=_?3RV-;feoykaVpuJLCU}S z+IsYfy~zY$_Bz58)9ZC4NZ6huibl!zw1p#;{n|zWwO{P2_+i11IKX^;^K;Lsi#~9Q3A>1|Q4a_01SvcrOAVPQ(Ew9#}#CAhs}-sjd%uW|pe``;z|ZGw zX8@;{WPRUI^T6cPs>Kyu_fpL+1$`R6D6#}&ksxYHN)e{EHo$Xu;#(Dl9MWxa5HK}Y zm+WyUz4K0?$GSymYK5DUv)e7}8-|D;RDNI7_RK0^%ZT>+1wOAHD`yep1O(Jdd?}`* zeNxk#(<2sIUgYPkyv${S``kX0m9jo0Li}fA*`+&6q8G*)*`YS3z7oz@?I%T--*+2X zoHaLs-H!QVv5UgG!_UV7t{kQ7SAWU@Arck2avgn~rP!zqKiQ*|lHz&^CrsnOc2wSh z9|w2y5)d#3xo=oOp0QG67q;yZ0R zA+b!Pe|CH!Uq{70)rJdc}#kd-+J?fqnRz8nbp!X5W`LYa`)= zq?iBRe%AkdzZH*7_~(4T$Rw)uj*f@9XG`2j?v5nU*6$OY{bNG+{v-0w-sNY(6<|^W z=lCr!V_#Abr3uImdtZuTQJSd99?1zA$YnZ$$x-_nQgnAy3CL>rCKR|GZigkTUYUakDJJ z5MPTIC-l;)>pS-MzxwP7`xl|^-!;;&Ht6&CC-y9^K8X2=6J470{FTocscMs)xN6=i zhg#(3eypcA(No8agI

    M14p+y?@_3kZjQTvM!I>PE_?yZCft6W&4wXf)RNhg##uw zfy+{T(^0&b@m^eriWot_-*XQ;XcPhsaBi@oP-Bn6#40|>F53E11mH0Ay^?b;_>pyp z@JM+foMM+(KrKrnkYuKQT9bRhY_A5vrzO9L`^OC5EQ;?<8_BA8Aja zRheb*K|Da(7xOC0RZb|^;GL7TW2;iER>^P#jDz>gVF~fUV@SX7ZJO_OLXh<(r+jtI zk$(O2DIlE}662DuV#N_6-!sbE_QJ?WKTsZO{x}gCvbJkBirnsml=YpbmnI(}|GhI! z5iu=;O!G)0<|;y_nrb02v;8ff6V4L+|IhkCFo@J_UV+s}?8bh!!U|zKOyP4D)3i_0Id`wFOs$ z{-vw}+4#!|)^2Vq!j(ipoZbA@x&-g0pG^8Bb39QUSWafhnh~mLXxyZ!+!u^Ws5j8u31i&N z+mREcCcA%i*MN6r`v`iJ-;0>hcj6DZ9uKmr>ab;lsxBq3wo|al)&eIeEzugz_7uug`fC{ zOx~Jcfb~3qsz3b-hHBXB z->mmn{FE869kqOmeO2)s`%dlBSr-IUg7hacxKW;xv_pjJAdrK^mmPa zPrt*E;En)3y${ONS5KHm6LT-M*$mhha$?~z_`nw)U}ahS+e=i-$uwe$^B?WvTR3yU1NCU|yy`!T32 zUMPuS4hTqcA5^fQ8SXOMdz z{C|k{O%420Mv4@i8s2|@CIl;P(s)Vm#`ZSTd(EDALz(8E-_7<)x%AfZTr0LsCBU;$ zPWD%}GLW3}AMY?)@0|A1C!y8}(4IRiUDrAIjkv4-M$k#dwXr-}OcOYWf%@)rsS0R=>3K;O!-Mv{qVdErn56JOUJyETS=a`1nBs1|r7%(=2_|LJYs=4NVI`Mnd+cRhIMw5v~x4Z8f}B1%PQ zbsFi~A#-6wQ*Wr8{MespT$gYqZmH~#!};rIm!_CXfERUk>XN<-LmM#$`B_Ks3*dGv zn=d_HPbB_=X;u9Re2H{^JN?PsGjND9v>dU*n&!Dvzgf^Z!f4BDD;P{G&YmqR%Y48L z+4vbw{mfkKoc)3I-rhCEfnav>rMwu3zD+){MH>QHsLM8 z%#U47J=~I9Sck=L6lMvqBSWB`Qrf@1Id`P=Xv<|&ANxnC)|TshFQGHDLUXTj*KKB< z7!YqCf^b;dxN4S@K*YG2Oi98j<-1KvJ-|Znrg+wro*h-+)%p6rGgsCQ{q=RzwIYwl zemDm6<~jA+2%m!&AmzcS9`QJ=S9sN6d3Iy-rICJn_&`=lJ1bzq{}k=9q}~~+F)4~- z4GDbVip+7NcZ40-S#Y$-0{~(5_c+z95WgdTsvcPo%r>8SBERd@9237)4iqc{j>e5O zQgvRbH!czxte29R!J+y0JXSsA!89w?eiZ)63F+TQMLb&nZmA{;885l&Q9Q_D5SmZ5mrXH+y z`_NT$43p}NB+C)xY=19QllM7PYcAR+$myyxmAz1nAW7TTE&k~vt->h#Upq^C7a1AL zFC9u|>5R9>PhYv+$x>12tL&U+M9E*Qcd+j4PDuMn{JG5Nf#R4Y!AS9bKsx&xALCjE z)!+Hh843A`!2!#Z6Wh~%ziBPksBE;wU`e2_-ZULj{5bbH$>0c-*W%^oovRn(nqUL4 zytnNFh~jU0mnu0MBLF8q>ZM67u|aA!)cY0UT?=OkHEg!g;KNPz9?VbgYyKHv8ix1ViRWC?va<9%l*Trrs4(a=`E@!a`Q9_ZsohV3nb^2zfzu!-byJd-z-QOp~&A z!yB0r4}ObYIp2mTMcGosp10v~JP)mHe4Da>qbmd&vlhb!gk%#AO6_kJ$K&G%PAF+- zyrWOD?leoLXM5X3q)|oho~T4=>5Q$aQAcW;ovmsszbXZ*i`h?Wa|9ClKhi6n ztt<9zeRI*Z(yHD6Hg!!8cqv3&`*knkm-t#gZoS>N%cUP-C?fyscb~`v@I&QXLR~T6 z-{PH>5K%3P2c?}=RONX8Ind1-^D|^i*Bk&;2jd@eA@pr&$#3`{*s;ixL&r>W%QsW& z8^CEde?uEi{~uP_imI&UE;8FwG+ndB;9&a64=rd&+}9`YKIpY%@cR&Rk@Bt*+^I9k zfJ-vW<;=joOYj}%r#Gm!lur0&P}3|Y4z6<|*GO%09i&S66 z&7X?XrB}DWvf8?;DVoqIr78D+i%bBetu;d4>uX-X(wD# zJ&Y1B9T9jSBCU6C$OUU{ZT$}UpcLmJPE<+Ygf5}Es;>%!{bIWLze=~E2C|L_d}7NM zQtHX3?b5x3VT%JUw+jgHFRrR%hxqN8*k$AX^KGX?s~WE75s%8 zx3194lgZr88I2cE8NAY0<*~&}+Y>g+TIGH@JLfa)CXQ;oT3EC%%}>5-JdN_tC#qC{ z_oO8D5ugk6GjtWxX7@u;k&xGX7 zW0lFrc8zSPr5Fm8#WcXzRZme>a{L!BSB)=QosDYaU{<|-2^P4;-V^8EiZlsjQm!;x4e{rh68OU)|tPS*Begw=fy^E!IDdf`4Vm zr=XXQc-#Y6p^Sik#NCG|rNoC7W#em`gFXdBMKS4B{|qgQ@p_g}tf$*w1m^l}wX@c` zeorM8d|EPHBI@VvQ+xlLy(BeYi*f{I%OE2BUXcC0dm;1K# zEbE1O5B5~?(RC;n9W@U#Q%Q4YuZG&|yNc~tfDt@2@FdttF&Cc8nneVh+5x0xN_nEH zVVi|6wcA9QXFBjkDs1Y_ZYv`dG9TkX%(|r24j?}_3WvYP&C>T=NoXY6pn(GCyO;Hr z-tIH-|2-fTkPV&mk?)>4^ApeU#OI8%q$WOQdV~0rQ1Y^#*mYZ5lV>ou8n1sm$JT#w zDdfkidD(55-0?M~ZkOuPXsLEvkag>h&g@blN#-ArkPup(5rs+f@dSb zo0lJiKTWi|gS6t)3PS%;-Fg{DttO2c8umu^(cCk5_@`GR+USfJQWB_NalFxAA@`i9 z2r_t~cr!hp5wzHn?jVmb_W}xr;F-mRs2)pev zvl9{e*d5m%E;xfpB{QU2oZrG4Tz>r!zGm@+JL2)hC7OiF z!vC{}`zH($CFzl}-f<&pi7-6q^}5B)zIxZ$lO7(~_VmUKT5%!n?LdTtRrI1&BWQ^< zP4Wbzb?cja%;)z16~$XAK_ALYOm%N7OGPu7uHR+?%$eL7hUa-)HL8hZ?Q+tyC|gmK zD4FY?lfs4dxsf5L#L661Ktxp?kxK+ogpo7m<>fPhDOK;Zq^8>BtCPx49_U4rGbU{F&!g?Vt z!RjjmVNaHP!YW5NPLCLqDd7UDIzQGCBaraI1$dUp9M<85ZGAFCtL1t*OJ0uERE$gM zmBhtzvh!=|Q$pMzo_4U2d3GYOsZRRZBr=bUBUlaVSI@lS>?g=>%Ga(G$IjzNIx_#~ z1j;A4x6*uiN9DuUh^~`h2hZ}(&jL;LsqX^CJa-E_-amWwRcjeYeqV;72FV<;u4UIt zOO_V>UU^n^6phzky>jte;7m*9rt#dSzi7Ad^4$Ic_y=|A;RRt9{J$G<88#LQkMZB^ zOSzL}EcjArpPRhBnG{4jY-F|KWo+3Fa`mbv41R?LljePQlifw7tCHZ2!(}ZKw#|*E ze!48q4ovd?=KgP12I1bFvy%+?dwCgcDbZoX85TFjH#q+RKk0`;a6-(B2hlzi^U+uZ z!WFarxK{)={icMkyI4Ow^0Y-!-19?GqzYEj&%BbnY;|%?_w>JTYlWv+#$-HyMcB?$ z7=yP46pm`@zAS>0S+)_(6l=>~Ew+~VZC{Ei(?D3ZVAi`i!!?4<0&Md$WQO=0KkenM@oo#iOoo@Zn%_Oe^_&2;{bWx$vTzWAoqQCj7>}0BPA8je@ zI?9TTzY=wxdV-inkDWZua;na{em;Qn)xDv0ID2ELSK##K!A%S|q@(QmR$JH$n8!yO zSqsT)Gq~JWcNGtA;)Da=d4qN&;v6EL{+AwC+lg7$-bouaz_;*n`>w)9v|`((2j%i~ zW}RG|a`;zIj7*+I?fu((b4>)D&th?wY3ZChp2-Af#V#)5ICz}a*Z6L)D8yP^ty zv>&?V+l6eIONgqz>@r4(Hv2_s@l0kfVy127)OHbOwLfvUky`x9DgA1AENCclS|-a) zkE`c;`0#pSterzT;`xIyIDNZU+9X;mXI~J~GbuQPpU_^&wIJSMZU?Pcw94@f4hMwD znDga5uvELgsZ`YOnO&Pf8!_PoMWe2b#0gRt%=Z8ES!a~oIeQGKa%WKTYMK#e5AKV( zSjQ3FPUQUq#_eF)Z%!%rAugw%w0|WM73DqSQ1big@>vf`y2ZoO{v<$xGWSNBux!5d z!_DXUeI@FgqeI~SZIv?or00tpsTKdzOJjP%5B*22j2~gNa6fsAdZF?VLBBuE)V+;QC{MFe!lCMRz!HT-p0_5SiSa|$^Q+Fy|FUU#+hNa4 zMek<;GpagEjAMrzcp4Jj9lof!Ekv|2!my6=;_R7Ox$%F%aW!_tBx`c4z5~idhm%wS zOzm@Hb+^mg;RiS20`TZ*OU(s?3NANqk+`1sJE>*ANj24CyWUVcUj{#bdM}1ok{9%2 zx^wIc3d#RiKB1UM=gAus`^w&;wwE8PC}j-mR|`l?%MLv*IRR)8Qs2XbE%M-ObyG0W zsEWKjpq&bw^4f;y*{B(i8UX@MA(lVgFZymv(P_15!cxZvfZ*Is`LtoV>&wMs*@U^0 z%iB^{nB04t6lZMEtc+d+yXa?oBeU)9%}ric46S&I{U`PX6s9$N@jAu=9OK#WlM}E+ zbUW#mi_J-;dj9uV=D~;MIwB8n3lr;<0#Qpi==tbYv=hK0Zer>7SwKkW!2|wv#z(t> z<~ty%yzk9yb*Z7xo<#yXelx<-V_kM}?j3qiAF5$QXE&9j?B=F4_jFN9n>ew7dwin! zB|yp|0PDm>8f)v%@%lBMwd0$h<2!s7qRzgRDDvZgN3n^0yR^ysS|Yazlv2!Y=+2^; za(k+OXT7&RyRXwi%+$$Vpo`uWlpN&K&+nx7Wq)n9>JX&RnhC^a^B0TP!G$Js!BLk@ z;|?#~h*ydgRYx}?^mj(X=Y!OSiho^`c)aK8&Y1f4zl-2@skjHcbTT*l3^XlErZ5w$ zG`hS;yQYv}T8qGPWFtH{&XzA3zW^7Y)<)SJ=FSrJJW%SN$k~I!BYv?st+gI$bq`=B zYdkSI%RbUj(JKSU*kK28cvLbGg+3w9>%IzrYx0j5;k=Aalu{^W_$m0No?f^U%L9|q z@4L$-Te;dV*f@3ffeD*H{lZQz;skTL>xYRcBAN8SkQA0Yq=KJNvNj;}bHVuy?Fnd( ztBj%0=*3?Ddv5x_FHh!t&Yjs5dGKNqbu#iSs{=^9H!rql#Bh$1c?CajnAY_iA0Nkx zbyg1=qz}zxPk?RvB_*&d%UcAAGKqT9=OBzNNral3aYOH}3)#~`LQT~3dJ@)|*6dzd zV+t|Ztqg+2pY$Vwh+RX>+SRIV;2?v=*mvxL0@*6-@9fPvQ`y}|M_=Zl#M1TmW^y)ap&zny8JGI#ST-5SG9_v&FpD&oP0QVpZTu11o$6DycW~>Mbqb-U~M+>ir%p;?7j{NlYg0pPylN zXS{firIGddsoxN$MaTHpVHI4xa9tcpunmpra-3(m`}Wn6Hosu<=K9d-L>!*p%G;^R zlGpp+5u$O|*Dw?@wAOYS`v*UVhoi*)ZMzfu|7l0eP4*C?E7TSdWmg$Ose};~zcdG2 zKVa11*Vm5&-|~!_)a8r(mTfC)$DzPM{U|bns(}51fm(|I5_My7=R719XdeDhaFbIryB&or~S< zUq}{%$s;^7G6u#8{GYpf=VE&$*Rk6YmW-ej%R6t+*>wM>wfXCzT7j;zRk7{B!=yr1 zyPUlHI`I*T+!(QW9bJgC99Mqt`4ZWr3}7M6>aDfrbw9@s(nR9cv1f@h!rPMxAl@t9 z;_)n%#GY8aEro8$@bWBZhEc&1M_|vM|76vTM1yyphXUw)FKa)}*3r+HUYF`I;_8Euj)q60s z7hV~M_f@6z?*VR{SJLgI7qGeR${n`%7-`z=SMl9Mw#|hXj_U2)1dnIjwG_QIp8i-P z08yh|bKwf0VWprH5}Ma~?T34Rc;ipp_lKY(&b3cS9nThS#-`%eoDevdF#K)r{ZgUL zkLz92?bwV*z%nnG=ua*Kfnpo1-P9YJAMiVe8Dn})vE)(vq~o|pMdJ@gw2415K6qn0cZ%Qpj!PP9RbkIx710&RiI$%g9v{VGVFkBL6M z8hQ{q0?9PGyL}i}J`IjmqaG5+GkdMH0WmZK^3D%SE%W9^inZ0l>1>@h@z>AkOrDy= z)5mAPud-i-*c!fWG`a4tcx7>tnwWO&p-X+Q?Vki4v5SkHmf`PH9K4^%IKi@je3BHW znqvyxs2C&kIq6~NC#Qq%j=iMM=&c7gKi&t$k&xFsTRvEzAf9cRPrl0b8NWOq)hf4q z;}ee*^9#{Qi)xdW=t?Ub5!GY-yWnhm*%{KqaX6M>Yx)}~0C<&tJrkW*sjG|jRu(BX`40_pQ;X~!tHD!))x|Q>Ol>agHT3Vxc6h^1zw2sdaBD*tA zZ&b*p;H|-c`u&Iq&K>?^$01Y6AOC<{mYns7ZWx|kS{AP(vL{I9qJ0>Jzcjn^&wpfvoZ;VSM95!(V01)Yg zVxHOXnUJKS)wNjH(9jABQA&AU1w*(F`=Mm^)zb?^ttANFZaKT~$bZ4Cjo%B;NzN(T zxtUSWPx$IfJxq~HYJA=d?Zs&(WVK5Jwi-M3NCMWTBHMZpDn$X%ko#IJ)N3`32hYW# z@jCKKFYPMBdK2oIHQDRQG0RM7Qv#6eDAHWgez@!2LjDBMev-^&2tWX#IApN za2|h?A$v0-%r=W3!q=t-fACAoQ@$WUPRNE$MRnXvScjB~{fv=9Z*2xh9$B0mXp&7~ zUlPWeCZ_21sP&ReH=eY>RDS~TkW$49*<=n4O+A-R(Z+|fU=ig7_^E~O6Ek1v6Qs6z ze!JyZ)_GpR7`_ys7uhAL$uG00h6f;@lMyz`@LDkVJGU?KKkZhyJE*Mn;1%CUY_?*U zq%K!HP%~?~-lv_rN0U#^C9|2CXtoZEP#PQp&MXpUSO4(lY<@em2?$KHQ9GB-mZt zRth~nk#{$VV_Ak66shlECmydWL4w>B67O3f@fa&g1j0d-`bD@EM+!8yK&a9=F$Y$c zC`j`&C6oU0tc4DwK>r0~p~Gg%&g4GhQ8PtJvY?{_wPt+`&rHegOYwVu>}^ANug$U%LMe|ED#78%#b$1OeEmZ>~0Ny}+p1 zyTy}idDt6q z$2hYu4x>uYKLuq0wt2s_MCyDlS;)>!|D!+I&&nOEW1(_C z3YuhLEq&H)s;!0$P_Pq*UghitAo)}8qXHx&(BNdw{#b)UMuBc+|G|F#$=1{T30hHP zT**O)v(q0pJhhNdUf<%&@wn!H4RA|_+Q2^pg6U_AwEvZ;cQf9->#`FmuuyKI+cj$k zCQWuaoxxSFMY%DJ26Kd@Q-@rPXRAxY3x$^#B}T@Au?yn|0I#va}ULZO139rgY8 zZ~K;>p}A@gREfEtjN+>*c^UhXEc#0Nwrc6vzNpUt$%FOYY@(n8MTnqx@gu)ejd=A- zUGdf;y_{fW&jMTmGZ->Va6f0L{ONJ{zOx72G( zZk{XD_VcZb=-s=p0U*vYk6bC0nEL@Qp}k3rcaYVS&j%_8IHPy{L&G<+qU zZ?jBu0Q`y#(Zo4 zWFghd0NYAaiIFEbneS#B-L3>_ARuLiJD>w1mOH_t_FdINzec;Gm_#L$SzAX+t5I!0 zzu`hmFoUym2WGpeUl~Z7jI~1D5LZbKwT~t_%CRM> zvFuyD2}GY$IEod;K^hd$BedkKFqbSP?T~cG2y{y30Nt7Je7#VG9Uf&;M>AR{K=37$ zMeRkFz1RCAV)%Mey1Gv|2DdJ*74NOza)!S?ngZh~ba`#|kR1H2(9NO@F?9$gnct4s zplgbM3o^A~K9BDeg2a}`n+&&BPF?@}l9o*f`(}cgFR~pOsR@zhu9&IxNk=*DPiI4W z$Ncu|X#(4j)9_DdLuD3)(#}tb$5*jM~Tw zYKK0@U0cRi+pJjBF6L?9(6#wHTg_9X6L~!TpFd8`cmIe)d=N5w_#^$uWwp++jrdQj zy$Ox_cxi#=2{w$!u|v~+V_UlixHV{!UI^n9h;kBa@EA!Vak{yJfKvRC2c#qG5WI11!OGkV+oHmYrb2U#OtG{qG=@-2sc^=uK^whj)DV*!%qpnsgj)Q@TWk4 zHe)p(u@lp^il*un+X6g>i$=Gx;naH|%LdD-M2-|MZ789>;h>@mPLP7|{%!RTDq)#| z!aNUR@!Lswe_g()9Sz>THSvI^QY14TU@%pMS5fbUQrJ~aiXVjHTW@OtZTju%vEJ~m zPNS_FTPU8wI=tuHo~kb^8%(`^soLYgY=Z*NmCsgF@4dW5_iYeVQ)pE1Hc$S6+X_H08@9Z%*46xm6Z7xk5vjB-U_vg>AD6G{B}cgs0B&r7tuGKs=$C1f4s?l@KhmQ zUMX9!PqgS%Wwclh)Uf#8u@8zr+|By(X8dkTRejv^h!WdM-CPsfAeT8p*U*b&Ej0Z?7vKVv=?;eg>ocb!|m}a;ZrM*`dy9J&8K`0S)H$YGVIiKOi{Z= z9pgH}M#RF#B!~>;$?kGMVtS;VUvJB|-jSiJYipeqV_SApKdk^6jS{JrhIssFOcYs> zgK)}Kv&JKDUpNOrq&~HN>wefN)gcNY z=e2J#lf0GbcH>0M`8^NLs;uU7<$^%w)Z+F0mB=QiMZGuZNdh+oqAV6RsB@ru_rU=L zP{c>p9}b2uN`ntb|2~%0+)>eoajdD(vVjO>tV9}MP?)mn1p@*unS%@8+#Dv+MZ0@L zKdXS+Mt7b3@K&0iKUe6`$?@^ufZKEI8b|as*skaOY(ir@F|{DfZ&+ANfdErMpwX{n zU*bxSd73pMeJ3o`-dAc`XnOzkDq(al%I4zxbcq_R!>?|*ImOyu-Z66RZ@1K*eSp4! zaCgUAe1EKTV8xBuHs5s%JMimb#vBqjPPoA6Nv)VeGVsEqDlPW=0WbuX^7=)H?VkwQ z9z|$S)MmvNyRKjxa0ubf1B{?tETgVpNzuLQJ)EU|<$05W5`_RoR-hOQ`SUgu*|{WH zNy#INy(9>lvDDacDaO*b|Ki7SZGpZBzi+jgf@l6q4%q~7og}E~a@5%;THdY`C8+%U ze*7lHom=t_p|u{RM?gYt+Yi*Lxk&b_U~RQtI-}lmyq79$vNO5;N8{O}cUjz*DISO# z<gBcHC7DB%;4^kSGOETQv3+t z1Z(?cm-^Ug{2Y7>!kM9O@9*2@TX-!a=lyBiao#a-rr<8( z11P7%1z+$fFn&V?FaI;Q5*13DP~Uwigoj%`xIW?!g^J;ZeJ`4Wxr-cGRfHK8;We~R z%bXI%3PA}vGX2%|%V6wQyvmE&^DA8xz&Y@D9?d-UJ=J*JLf$shxlY*NSlEhgZdv1{OG$O*iVD7(#bVYOEP6CyOZ@Ec?SIMw{sqO#}p4m z9?glFa6lC)wRy!j%bYZO&TU{P0@Ibd&isyI^&r6jUKJ9tlF zqp-5_&kgHQza&aLjdTNjkNkiR-4@4FMz8R zs5uAG2|0P|A6^l5_z-34Bl(}zaf^sF0Z3d=5HS)#N;li%-E-!vP`}O`T4erYsP}an z?-e6!N52a(gr>4iCmxgtu!X(!2+i^6VY|dAO1XWZJzQ%LPL9VAnb1)2%Q8Ch6d6t) zq1y3-s>n@ai=cr75&;A`+1dK6nCW z9eAB}2v1ALdwta}w8$@Xud$KszwPxm%8HSHn1@#Z5jH4Z#rXrtutfIoV@S-}=S;0O zho?K|`<-@&z8Ts&E7_PsbEowdZ^Y07c>B@vq*nQP_Z!^NTX%8B70df$^8EU&R`W*? zMfrN-a=XksN3tGi^#NW(*tFwTQ5sbesY&-qDov08U>fc%(-ZV)q@%R#VRS2$1|B+I z#~}T%bBaxU&G=P4i;vIm6gI*L&GqLaENaw%-^_XM7(bL1uv#L!vYb*3$yREI8n!o_ zF>akt+$w`+a}8$!N_*NsTN31%e|f5R);1d$jSQ03WjrqlH6Xwb-C_0FI-!7b$=;WB z_DGG#w?58SsF$lvO=MR~jMCz31wePI($+`ka*rNG#`ET@chv!lCAZ9VIW4Z;=*y4K2FABQ+=hGq=6ed_brd6?D=I<^u6&6e&UinH^7G2U&uydtSBZ7ve8K# z@(ryyReEVh`Ssia0w(Z%#Ps7EUyi$6SqR(H(VL^@GI>^P=qJoyP<{XZW9clzqU!!G zJd~t#DLsH7f(RlFLwC0*4T4hAJ+yQS2ogi5phyc0AWDaXbc1wvzk8nl`+@6;3r9FJ zXP>=)Ypr`JS6wc@wY?&PSXoW>_#JpVIK9_p8=QG=W)~yozijX*Gdel{;M?q<%Ip_T z45FUH2`5GBiDUkMW@yK)6S(t*Pc|#T!YR>K?CBORsvYiv%FK*>amt!N8eiFH#^EW zRx?{d{_)3bsnU_M=q#%3;CA}Og4Hr?uG;Z@uki{0qZohOK|@;!R2!Aa|nr~h~;^}a?5DDrE1O(K;7!R1JP z5H=t#FC_jpX!5b5e*lHEq_K5V%sh|fduUmOL3DIPXt9w=bl>v2i^=B>S1S%?EB$zQ5Za zUJ8+S-HMoDU~-RD1F1hVsG&jTE!0ONYqnzLM{jY{|kU zw^PXl)fb|ekoo6>)rdMgyF#l8uj&#!O-}yV(N?fYtlh165wY#5fRTVjn4H3Jt3+8!;Zg2_)&~CMI0X7re0qzAA3I zr?lLkTr7SVhS#JOR>9zX3lfW(MxSDg)0$-i7a3bH56)>jg42S_WyX8O21X5$veHl6-c(^cJE`dUa)V>>)@>G;O9!7RhzV6l#X3RoB>zpsB* z_${QdiYxMRf_BG(w-#;RJs7(@{zJ5N%YD-yjQCkrVOl<80;3UQ8$h7x>PfT4PlH^m zV^)!ul-=G={pg=k{FskF`QYcCG6_Bjx&qDt$vNh^LcxnD>SpctmfO$G{Q;B${nx;l zXvz57KL_pH^pY?%CJP@>}kXR8E0#WF_r8Y5Y`>1pQ=G-=Sx$x=LUH zj=E<RbmJACtU7A zta5KI`JV2BTyC zj(yBD`-o`(p7keJ9B496=pbs)m5FIrHAP=Orz96y4I0Mm>Uuow)nA1o|6Y8ctlS)EG?wx=>@VC?O(evSu z91b23XX7FJY87mZF@~&8l8dW@s2NXQb0WkV#LI@1m*hfdK`MbEZ98^C3kDrfm;fus0lPw+u`#ni=;bksZcpq= z(MJLDBCM5qG;D@)R@(`--u${H0;_dXaebYT8; zsT>xEXT9oX3oDRNyoIg(A$X}&Bf&T;l zk3IYj<$z3Qg}GOQ4~t6Jap%G4S1d>XSecfy8axE21{<$6!;YIT7g z9_A^5?`-=X;wNI=n0FH&{DXFwp))c=5yH7QWJWaTWPI0kOSm!Ue)Cbu@d%gm$7+BL zgJ*mA3DyBV?4${@hDmJuL&jJ;w-dxV;J;&PQuLt2gB%&Vy`iNq)|JdBg^Du&&QsY8a)4!1cDX<8-}KV#=^`m0UX+?vTO%Eo z4+h~+#P(fQFE)m+Jk1h{6XhhINY>MN2<~Auvx{qhr-CR-yScJ+k)mh6SeiADoIw=J zK8n5QXD5VUr-O($3jebm_qu-!q=@?E+D&TRKIgt|x@7Y>61z>s+G&O~hL|oqCLp`` z9RIn2$J7#WCjVjHHg`|bI3Elh!R%VU;VEB=&3h zfq!2#e2_eE5FA#-xFxN*+#vhf@D!i<6d;jnZ)TE`_Rch;`dnC*zbORB`d)3(fb52R z+Gd3LK1(Nd((epDak7s~QJ1b!7MHwjDBs8`J|ti$`U*KT+?Go5O~I&?*MK*OI04M4 z!4Vg(#G^?wsTlj~>m^5LzH?R5mVHmLqc~TS%;S`=Ekc`(K8TXB!)Ici!&$Ft>6~~d z!+melkHS~KIP&{O1M#os?aH>bxWz!fSnpUKt`do4$0 zncEQm#1`-Asq{nMCQ^-aMHO!A3|uLAV|+H_d=V-&OzVISv7Cp~a0oQzhyenQ+}(-; z^phV*#xIaAf{=me(e=ZGmDVSEpIY!wcHF)+o`N?i@OT8r$mueOWDqPKQcKB;DfoN| z;}YEuA;r>O*N9rGcr&4s_gQ}eabo>bSS7|90&#}E7*i9|;0_1Nb;#4}y*}yI&5==B z87ttJU)GI^{++zz?Q718n>1A#xsAfo>V2*<{CG?FP*~|TQG%^Z(EV%1haYs`3MC5Y zyd0KGeH&OycDZk2dYJbsE~7t;s?}cIrU|~S=l@zf zWPhhIF2fF296L_^lDk=(5-IVN=E}T|^MT1GE}jyEbL`o2^1oBYbhdCT;`S=K}FurR_7-0N#s@ zr+r)&4TLN=39m#4H>KWbXt5?9vo(261d~=%rg40RlqiHxK-eyvO5#SJTH=qgD*Q{d z5=EQ~fgLvZ(1Nq{ltO$}wKmicnVdGuIGRm@PEhHaV>E_17F{2nNSK-~>j9N@7@Hx> z0lK?bUv~v|@&px(iKiTM-@n9C(3QJZu*XyiQH#h~wV&r0LSx3@e(HH^0&PVI1->E_ z_$9LhE>7{kWn0HFA)QQkH#g8b(pkzHwUqeh&x{|zB!g_lrEE%(p_q!!gLlK;gh4jZ zgu2afKms}N;WN{gu9<*=frdilm*BVQDRf-dLSOw6Zae$(bEUHL!Sma8WqtJIK7<|` zDRqZG7?W6G6uu;gNFZ(t6S_lb!w4lLNLSoNfXaqAcd9esVRWEKC)13w^Y>$}P*&GW zWF(8oy_hPmKTx@ z@RQX;>)z8Z4>3K%?J-Wb9C>;DI`r!q@kL2hH(M2Dno1DFPR0{aLP1fv(*aZs{`~egzb$`CMd@#3+49?AB9MeD zJ8a_H?T6}$`;$b|<-9UJsTf2zqhR5xNiMps=xTXXA1#{X`SB1n!*V zUWLAj0U7(2hs?tmoEvfer}*9nIId)1EtsgPE;CJUvrXt;)`anaQr=c5cOzjYUeaFb zU~>21UZhS-3y^^Oz?V#{b~3p_nX9o$JelAF79JXTKI2e%aixcgM zBQu(N3}PW5%Zq|*(!O=rXOV1_KlGHOLLV6%!1hLy&_cMAQ%V{mKH`tYH0dNVBrF7D z-3$pWKN8h*qX!a_*3_K+%2}H@1Y_I3vS?7RAX+101Um<)EYZjV5fJUUCm%a*s`9Ra z5m~(`{dFT1=_tVMyy$f?9mk1H4grmkK3AHicM|%q3KfRMDIssr2Sp>WJ?^xRsTs8{ zOY8z)SB)4k1J_Z6^uWbYuwU%Xkj@iqdrwsZC*$xN1`I)b?KU|`U^mf_`fC!cLpyZ= z3-Fs1@UicmJ)Z;q{IF`d2DS#SM2Y;2afKMi~gbk zu!-b(dQudBs|1hO@1e4@^!Vz;*#5+%70AC#qE{q?rlST5`0M_z$wuPo)?O+IMcZWa&)|*oTO_YBEm3=Yxse4dO*XuZ5 zC(kA+C49)NF=J;Nvh6t*A%=wG1z4?BI2Mzg8K&kaxcQqW1np6$t$57}YZ!#gU&6sX zDFq;w$PH9FIz>)u4IUW3;jtnC7)#N91Iz+H*^nK4YExcS-GsrrY_dRtyQ z!k0VU_5l)h`JIcpx#2jgU+TtA>Tz`V^ecoO?TyFCLj_Arac?e-fV-WXJ_kL45ylW8 z-DpqrDs6@7op#(KyK?;XlWxg@`{bLs%%U(g!ie8g?D(Spx2MGgrP(vK>@{mSh zd-+yj0E5NG)z!AWFqHvmN^=9QL)Lh0`yae+$F94V(fw)7f2yr`vOG=GRPpjzmU2p- zqtQxu-p{q{yps#()-msem#h$E=QT zWPQLx7ue&TX^xxdv@otwU0z*Y^zs0yap&l#7%Yqvv)%R~blSaA!vXu46|J-@uC+T( zIY<(r?5{N?j#aOh+Qr~aYQc#UQ=`D2q}mJkg^9M>!rI7{-23~|nF z|CzL33e69}8)Q=;(0ETPyJtoI$_;lNuu7S$^L|0w=)#pMzQ?^>!A8;L*UrHY#RZI! z$m2cwEe2-T>We<$`&aOi398ISzK&?G|2 z;Q4f3FVtC873_t8sR6iieg&V2bGAc^%kgFjbVU(_jum%Ao#J?fz(&jkuV_#C6Kc$9 z9GzU-Ko{RM2uu)6r`kxsP8V{HO4Mns?A$v`=#FEotewrr>%F(&YQ7lDO|C7oo@zcO zu)L`uEI*wZmPcT;45olmezIxsb)f{sXJT&gpPE)fa8@Yy#_{)o$wrLM7~)Yx?KMoF zF^3I&G&qVH?kNcgsj1dOm_8no=4AC-mrxp8pr`aMuC6Lf=B4JX5j+&e(=Hl3(h=CR z7q(9FMngr>LF#|mYZmbBpjz2ZO^r6fz_pD9EIkEWAC!(he9lX&pk$go0$Mp(kgy+& z?8+T}f|h5a@!7xRtewBBgtEjr{gqDc?R-gUMsAGNrkDr_UT?YhSQPgZ8nT*J#LM@{ zrq6Sl(pqCR@&iB*%!BT|a|f4iuNX>Cj|Ln4u^VDc6^WxJgZ3iu+az~%ZWEy+H3x7Vhq$t|`wAqQEradH29;rZ6qhY|VJL%rR6()Md z;W!GstR#&HkcXk9(^hXXB3hJq-rFaW3%La@f4e(try1%n0rx@jn66xuB#N8=0;x)VbWBEg zWe7oljpA2@T8eSukVYkrz42_aGu^+5Lr0<@ZS^7FL+A7-8`S$R&Px0$KM7Det^tD@ zoR%W>lHvkRjgp*F51UuXkONM!Y(qmv(z&HQ9fkmDK8LSGvTPp9;K=Z;THWRa4ivfP zeqL6rP!5Hq%xftI$pk>ES-NH`Exr&@edH{fc}}&8^iop}5RFxrHRXVQjEIxi@yh1d zP=4CfV|#;k$}%lltNuu0jtv$^Yk^a0I{`CGJ87nt`~z3BbEtP%=9K*C3|pLxTL2O( zE84J&L`MnwG+&g&k*h=b{Eo(T z4c^iPT=-$rV!{)G#9Py`W+O#oknOiis9`tCK{cOx^AIv5=tKZPoHv(2AfaU1(CobV zE6skfm*5lpSxtu3r~+*viZH9s9fePFmli(!6Am{ zwh&RVA&Zrp$lQSFt(A!d&$jb^mr7jorFV~@{5_Dv^%+`5^JV5RYR1w>t1li1DK^Hm z9qczZbWJxKeeTkGBs#VGSEN73d~W1B!#xIA@wWV$qTuGG4iheEL_?sm7rD38j(K;8 zIrXVjPl9=0;1k^V`wS3@FQ=)!RsZSV%Yu}kc?baY#EvvkSK&tMH21u@n4|d_mg%Y0 zJZ{e0D{}>-nKXicO6$ca2oyQ+KmZMbLhmH^e#8m(Dc5hR1(WdD$KMxyA534Vg+5A} z2lx@N=S&}pqpfTMXTcy$#|93AP3TM366XTl2JR6rU#Zasp&v1wl0rm6P6zhr2@gCH z6ENO;xqmWn4(M6=^}PwArY@2!&#oR^=z~^&#pic#JBfJK0@@ZqmSQ##asNO4-GLc4 zX5L{>0PPFg>!%o#aCc1@DV?+rpcSTJWP?HV=sZiG^&p^YXDeq$74KWYE?4^b>jE(& zLVfQDp`gFqp##3K;zMui}z#3J_znaQ=jT zom5zw4N^sbxyP>Y0=res7ZavP;OZx*P;8_-&v7WCXJO^+1w3^rd%5@}F``SEzkNd36 zQ8a^L0J#=2xtDGzdH}Rguc+wIl5SyCzXxN#_<7wGc_Bvx3cFq)`b2;D6qQTAOF8)$>26ZIq|8pwEB6(Rb=m*V{h5^e7~sd7(^ zy=js2ndtpr+%my&tNRbeJig}tY7SHwxi6_0FJ%Vof4b=p%mcHBMGpdC(;4SM)kWxY z9Q#@>r7EwTuK;FB0knugBtZTd%OTsxhB;+?2My9k%SSEymJGdyZLx3b(oZpf<8Y+8 zJOdNW@rnVVr+E3|L#H{PevG_8d@KIsz|+@DjFJ_nD`#&2JU19P$|#=bto%}p$B9GW zg(CO^@1;o0WlMaVkh4~+&9H+0bOd|?03Mi*)qVxr-@+>I#l)Dor?g_BiIP#oB&x3VD}@uHU)^>ht}AwE zxynVD9%Imaw)Lx_TG6-WN=d=^|5PZhV)+DcaMjh|pu@F>xjU|GhWLRHT zVdzcLeh()pch@&7@MHuqlISllY`@jK;o|o*i~)*8)Szod-9a$$Q~(fvd)+rUKx$6I zT8*nG0P{=iOdPc*M<73PO3EV~&f>QNXY&5umw`KH!{KaDhABck5MJu#*;zdDZv&sQ z0euF*BgQ*C`mCKOB1JJbKL)K>OyMus|L|RkVw36@x50}3b^Bv-q=&9bvK$JxYH6Tl z3B(1H!Bj9t@3FW9Ht})u7Kg{P=LT@#VXC=syGHq0A-T9sLhIiv#Ir~f$USQ<|E6R9 zU^Qzooe#bt(=t}MEt!=+yj$XWCtoTv%5hhZ13bl*G(S!t0!4H@} zdrw1owhYOUHG*NgMRuLX&L0yqqjfrOq}=myr-%}W+A5E&)6JNH?p<&nWSOQ7f82iB~TVh6stvG1_$KB zIzD}#KvC?g+s{Wva84fK7!_7fPG&={nrZ=Y86YIdRr58+#{R+* z80f~0!iqDPIQV7WooP~pr7jv81;>(Hob+tphkOdk3ktufW;^_Ru^a}0^!gt}AJNvG zeoe~WrELv`NQ)TSNL4-L%`CMmW*d?j9LzMT$7CXk=vBrlJi5n9Gz9d2bLVBuLVVxT zJm+PQ0Gp)(yBd^>Y3XA7m-9~GVKowX2+T}$gzPXwx05Ly-;j(cOJ-#UoMZ}q0~sv~ z5z5CCk7Gx8U|CI=iI{J{F_&>R!?%F=8Jo;!#iv=b7(U(`r&GbgdZ;B6Q1>o5`W&2h zak}HevAdt?XFNCOhpaZ= znT#_oNrzz+M?fsh7q)m)-Mt#<>KZ8gsUa!BYqWqjNxn7L*7X|ya=v=db=%3-3AXGJrk?cqMu0*l z>oPVUOz*oHg}w@)i{RyC;!ScT`Dv45LMid9JSd1f7!?z;r8^bYDw5n$T^}2%dWcth zeAV<~EI3JLM6GhZ4#=8}cI6X-b*X2bBxVq$Dl8W3Wj+%PGTOP=bTU7K)HfFbMA$xn(Qr zVvZ*p0y_%SaU{igubdH9mnc`!CHSFjJ@nyvrdd<_)28saO9Tsg^?Ct;-1K}^maR}8 z;p`Cr1Op@;UgBl!7;R0-b1t`BR#lWNCYj>;9|~w|0jszJ+iOC*Ve%Nopi8-uzZaTHbxp zNzBWhH>_LF3B|_hIoe{B0!QP=q7bxRe2rDYN{qPfQAJY*UQ4m@P~<&5>cb zxd0<-EP6PD!rKcqv}>PvXM94ygE%z&w53msZkKis&ci*5fPUQnT+9vJdF zd7y?66m4DO2YPr18b9<&k%B^X!d?-7+x}8bfDs)S5PU})7PleQziK_Nw0s+PafpsJ zYMi~2yXU?OLT~Em`4QSyR7X__4T`CUJcg?!kKSck^1o369Tm*PUe1Tg`NwQ!+pgcN zB=>c9{=?*ZUob*fm5HpmR-X622s&#hFR+XDE^pA{rHC? znBV4AsH5^p38@0l4SCt5d|hDQtBk}vWc`z-Atj{P#AC7D{>|+Mzz)fI{?lK67g=*2 zueduo9E^G_0djxvJ_jqeb|R$^@Of~|ufDHhIwX6iUPMOVPrq`?HZ5MK^`KpAF-1SK zv%7ZCug>E;+U2`Ji50do*^=fIh>+rbfCF-&>;?B{n%+Of)yws5JHHAonqb^+oY<=Q zRo*(WJc}rP77yB%Y5E)!l-IMC>VZs<-u!LESJ0W_4mrQ)omXz!pnCW(Uq(jZESXJe zVHjFhC+6$;l$a?Ctd)iy?wKrIdq1-0)2F&tN|<4-S@=3wuuX2p(yTQZ>S`FEC&<9} zsOGRC)LPfMm7(`lJ4!<-cSfu%a=$T`zUbt6xmpMYxuyke%V|MUtZ`8;t`cK zY7es?ZwI;FI7IvcmQ#@Y>-7cKkuXjTS{FLKefFoa$ol1^voAWLoRbDZ@hv8?P9o%5 zh8hz}y3l(%;(0q<2@b)a_{o^pveX*XdFcl@(%)UkdRViiB1|w*HObtEC`#Ie`pHTrj zU@0sy3K&}Yd3lBV{@Awlk2)H};@}0MlMNywAA9d>oxTOX$oO|ZjQFFm-9I~fT=!b) z1Pc$Yn6V-I#98mF^+^#&o!1Ii1(v?cdwFY@7vC=O>wv?c|8&{{FKQ#q>iEIf{{A`(!P!SepLO7#)DUAu(tQYCOA|91{N z=)>!M+)T3W5$>1s5y}A)qjFEk7)-evR@}veNxP?;XU83HzWzINy4v-vy6RU}kJ|Cs z^`kzU!S73dAwABwZ@@9+c)hVz_7xECP#66GkO5(O4eyEC2aJ+9s-(YT3)X|C_#^X?t~JK zG|-jNJ<`M1eRnaLO+EuZVU43s#F6eeopR}KWaw$&j;yh)z;cNqWp$||=ljnY*U|IF z6fqV%gWRN=Z+`E&opb3uR1dX9hKEL*+tU!4f3eAAKmQU!SUi8gxZ~zme?k!=0a?2_ z=porI3Tn(2{TU%Kbn$a*YBp;FftKYl9PdKWjJ_EY_DCifGaLAdDM z)6=ttkO`(c_@QIzWsJo|zlA+ne&%!oRU`q~i8#yBth1-g!5~(!Lu+_-F_X_)js^P{ zAN5I1;Yn8yYs&6)8Va^&pyMk0%aMO3f^ke&13*{$m#(@9QS zF=yM4vEtTk?-O99om;NqO6a)!7Y3vJUxBSJ6$Cq1QPIY(lHb_k{aE$q zpE~7?Y%QKqQeXs15XQw;1Wf#&u1NVMl>D#^0tW!%fH+%uYwr74@00Y;7B1#a&&}nB zOR<#R(QKtg6@B5>F{+=Su9GmTWSrxELRzC0y_U6~ZvKt2_>2$R&mYee75HyNbVv)a zc`4F0idSlhP~kb3GbZ!q*+ZsuVzp?q&!2wG2++Eejh&u46n{&vn~+`VFU${yw5R2d z|GcTxGJ0YX?iKp-{J~G|iwi$)w{cR(U30J+k|pML|6`7*weY@uT15DG_X7~f0ZB0e zjV)$yR8Mb>h|XTSFdopMTHuzA6(Eh(>Y{&4biKOt_DUARBm+Xs4eEOS&dq~vW?(=5 z2A>t#5k~9LrI_L1DvoWivOmB;CUdxkheE8DdV3x_XZ+MQMB4%JQ!$_bk|JyB2~)PJ z#5&K8ZftneUWlzC8!sZ0lHRpR^F%tg=@OFS)U&XkX#>Ra3Lv#A>v5}PatSy!>unwZ zwOI2-2fl+v{E-?Qjs~2h9e(-=ITaeu{0f6+jOTw5VRzv_g(5HijVy^mB^fWDo^P0J zUzet$-EXyGT2jMkB(L?9PG(L)76l&dbuJo0scr7 zlVnz1M(ic5)bE#jh3_^1**^`J@htyW%(Xf^&(TCG#6k*0Dic67+rYR7(MV$0sRR)S zupAZ7*AamL=h)N1dT={&$}ItrS<20P0&Y&WJ{c)CcBAZKx?WoiJYCo`*r&-*obR>8AqSn7@O#p>? z7Y_f|GLfLzQJjbqY?;p+ZIf1|V6QZI1OVBRHDV2;XB(4o_R}T}o9~=5!sDkJ#RQbl zuXnCu&fDV2JH?F`hVXeOFZyNBCU8~U2;TqpQF)lXalZKYeT|snS20Fq-*L;81yt;L z{qd99jgA2utE2HjlUSaFooe~8MQ}l;bfNjUkChG4u97#oC5fO&gMHwA-;oOXXqP5_ zRL%_9Z$-k)cd$v-fW z98^;V)mpUxzr!5Cg$It-$zpF1V&LgcU>9cojDHSe8KO{>7Yj6|E`v+74+%*5sfx>x zG3ovbbg~UZg`xIMq)>F#uIlo~QixzVW5pBWP7x zd9X@aL#s^6!w8-G|B?AQ2?|wPRa6qZ}Qt|fX!A_`%Vtgo8ccQ$WbM3H<_+_&V;AX zrSMHuUCMrAP>Aj^l7#~=?=qm3wI*X$DyvKWdEJb8Zpwm{sg~L4N4c`quv*Fjq5MN~ z;S@uyD_V3kCq7;7`@vNTgF8;<%BBS@t;{$v%BgivFWFu(tVF1GOf@7 zj1%zj{RZeo1S-4iqkAAvZRR*41pY(8%Lzm5=e4-Y$r^yySlqsJvsaoNI7=?8_`Thi z!(K8OlbAjmbgZ*(vLDYbB`)GptP1_O6O74(X#IEGzpt2_j6J;!x^}v;h5w!8aH1&h|63;BOnD^5)5kEy1Q>;Gy9U&{}1w^mi)! z)ZASK_M~2Sy6!B!Xm37!#nSSk7b1W3cMI$jOZJ)+G&mEB|+eodylC^iw02m#iYH#f#o?!SS{|R*bsMhiI%DGBR@h*cLXN`r z+C3*X-v1mUK3wTwW1_(IJ{bfjsQT+wrd$E#!}l}+7ecb0TRU#;Ejb(~&r;AeS9FcEvFJBL~@Rl|8(p&JPANA(t3PRWNyeP`;*q|C z#xi6rysNjVKzS1U?_E^Lvk8UwU}mgg(M2Sps&gnP2M!#)WS=v2<2Dwzr}N0b^jg;K z*HRbWV_~5klmd=klZeRm7muy*7Sey>2#W8tBb;bROfWTMF%!`(SS6EZlW|h+POIZm zmlQ)bYj*lNYX=pLM1)Sg=#HMm;A}YBd6;h9`}ESQVo}_fJ^eFA15DsCF@*BVOzg$; zpyWC90N_VK7a9VVAl*KE;+Lc`3SRt`=5>M+P$b|#GbJK~hMogN*&7vVk-w7O*W8(G z!E;2sf4cme^Sz*tya?00Oej;32KOOKhs^sH&-Z%Ue_yzp;K3I0z>qI~v?eL0UdIfE zVRFNDI(LBqA(kn&Md7!=&-fTuSr1E_pV|kr-i=;pnD%kqKMdqb=UBG!V9;B`lV=f_ z*4Bg+{Nh0aA-~s9xsF9u8Qh~K^3liPabXApVFCTO!y}U+zfi{`a@4^xXLy1Rk<<2T0&?FtseC1&VB(iDO5^$($ z+}L$H!O)H*%dSOXe>LIR!PB7~ci^6ZlaL-7|1ml6Oq@#BBAIu6L@`h1}|y?HkeW$Ek3Rz_z-itS{?fA&xO?_8iStFYPn5! z!p)r9G7Lq3;26-~?YpW9pyKk$j>YVz6g+C-glG=F7T%S|S)cs!obUzRueKhOC_j7a zL9_SX41ciuOTfkdQZ)#EK?`7}c*RgXkMGd72O4>ofOU*g%aijzazX~sVY=TiVMC7y z``t$Waw*5|1=S13bJ@rauxyLE_9f%Y(i^uvxJAW%rtD@VS$bqbq-S_|amxf`#8%!TUSS|vlfHZkBBF*TEB`4NAh9bNmx@wu!v@Ya2lm2i{jAtepb_2q0(E+ zA-uGq3y!i7YLXm6V1HdYOVvFD8@Gv|)f;bStuATQ@KWXbCdus;1~NMKK?07Kf1|ML zw<*l-Zly<(=`dHUPiV?+rAd%r@1UMNN|NbAsxms334nuLs-MAbE`y`^Vzn12?;Id3 z;L?|K+fG>enCN*&=EWJrgL*15i12AW>6)RqQzjCP?XmOcoVV%b3=3HcO+XDfR^Pq% z@<}Z?bn^Fw;Kd(d`2({#3LK-_DXvlLM2rw6`H_?FNw2puVPVT26&;Ji7EK3UQ+JUl zUpODzq{zKSmqTBu71K46X#+U5q1k zx4UZK+dyGsm#~hi9(N~ZZ_>hUHij-rW9tF!`t&@?Rz#Rm3UyhtRE-#$@v1J9L^AI?sc*@IH}q0tD1zG+femaljwAnpn>jISe+l zS?#MB9OQRmFrsfX^e6I}OJ?&3u$(o{ZBHyKsbq?CFZmD~ePnR7|DNz}deUXxS66;o zyoxF@^I$i8FFF-dVR@7ZKhDbJD=_2*fZy}xfvVDEBh-2SW= zV+U?4!Ei@#e&jz1pdx8(lMJ%R8w&?ndeCpThV#xXM7Ha+7PAB0kf?t3VN+dqx{jjO z1~4}lbN1ielLb{%gfCpmr_6!xrOGNC zj|n^$5QeTzVke4g@v6_9Ute(!wSRFqbC<8bpTLli5qk5~3XUy|kMjbLkch9sWD0XccqMX$N=*l@ww-?5W2%P1yz*fr^*QmR$uB5UERM;N%T|g_n^kAZZ84p$BMxODit3 z>>v_)-%h+1Yj>8;QNU*18Jncr>rzRpF4B2mT3_`7EmgGq5-@|tYVtvU;h%k>j@^VudqBSqeXvj^Gf>qz6u5R7}W!FcKu>PQOuyFI~*3V z((Po-i^-&AG&ji;S{XR_ab&WqER4aspLa3(p!2F3+~9(8me&i-M9ZMWn_uA0A#Kek z6|4@=f#uaUV_EGB#cVLvAn@qp6mbsW=#SQd#;muuE((GC=qq%^dZZcGmP=%FFG&jZ zNOCGZY7wuGX2;$~HDdu*Ez_SJm8Lo%F=$Mo2)Sj2#>gxU$ zYU5%z+ESu7=3WQs6a$S$sdz*rqwf2pTVUXq)H@K>p?V|2(hR6&jAiv&Uj32<5>Obl z5U!rKIc=~fs zMj^!jV~V9!Vw~N{ZT--9HQ!iT5cs@M0%$x?e0Q!TUG#vW8H*)MVx66@12|DZsm>|e zF%I~C-r3=pxUYls120u}t@J~Mbr8Nw+6BBLB-#7C$BgYVpldf06(=>&O_Glo1Y2@o zKqs;69D8^yHH4|^E(MiJBi6kss|Z&1$80$)1)i2P3YpZWQ4&e!8jm$tZ%7pI^6eiS zC`Ra|0F2YhJzbPxAnXw}H9J&u}ms#3ZzC(ws`|QE4Y!{#u zr3!DmbFZE`-bU41s#h#f_r>@-Yvf<=z59dqPfwg(cQP@Ff~H$(TYJU zLu2_;PZ!=iR6Ow(vL!nav~c>A0{EiZ0M_tZRq5|Xt7s{avEkrI)&8*(9tqs!MC#;*kOK9 z|4KRG^Lc>DNU4ii*;kl?o$XI)%zeOzFDq|{$OMmDz1;yu@2^gD<<~C=(brRN;vgAJ z0;1bFE=6TEXa|knzAS-g8l@L`QOZ~1bh|fUg9pP5++=VXaEPWQrItrMT72M8rxnlp z!t@lI8XuFB(|VrajNwVwrJo&gu9Rw;oFV~|avw*tf%xxY>a8sK`s~Fp@|;bQs%tZ` z=e{Ej>2|L|2(4*u_7{uS?Ha0$2Zbe($z9hKmTsGa;L*=NC|QUh{=ry?arFc7>qRtCvLGi=Te!xjf_oAA_=!NVYTM~knTg9UIcj3fha59pT zJ{jB|2=JHMi1?_9ih!fS{$)=#GgpHEVby6^dMuQyp-wPvYW-3tP$!#1aqnCA;|U)> zs>M_d&||Q#yI@Iu@(F23Y=&A2?lUamC?XC9YJAN{%7=Jv;j&7qk1I{YACX2pQ;qpQ zlCCl;s_yF#osuHbLzjf8bTf1}NC~2JgY*C+NO!4pNl8jeD1wv%(w)OYcf$bh;s1VM zEk3|n_nv#s-e>Rq3)TlC=QMc@Xk`C@ZTK>-ScK5#At)7Yy+;0Ak3L`?@yi>(er~wo z?$to++?gbwws_on$>(<_cgFoDP9euFLNs4BROL5c(^YaNNmJP~E-VEn7z-X42N8g_ z3%0@gBdCwD*)+H^%9b%RVL}RtFi2P>MH|6AMaAn7Y;LDBv#P_jK16oVZGN`HW!KpV z`UEDeX8@c|MhV~&*%IkUnU*pgjfG`R?Y5MXF!Dz%#uRLCc;|dS#3g$dEY>)YJ>9`8 zXxs4@4~TFmMSa;a(Q0`VPpM|`pLJ@a#yUjK<9?*t{`{4I@8+O3-DLgYD7zvk8}i(k z?DqX9z1=d4YhQQ}BPSPj-xI%-!f~bc|L*y-?QWP<%ETaMA#ju~(2at%O%c4#jQ9#C z(HH@MCM>>{ACR_0SiKHR-WcnD5^+UE%c7@@R(WN&kvOr&N4}Q1 zVk&X>I$BLR`5ZC)0I*~a#ye&QikU^36fT?6tvMLZlY*^>Z_=`$!nW?rU7tfuSZ@OT zeb{cb^vPp!Vo0(G=_%{rn*|NG*0SUC7~>ZyxgX_#x6P|><6FNc|Ho;4_c)L2ZgaNt z+b>)@fg5(}!rK%HvCEZkX@Y{>uAV$5H>Rhx$J!lV>?i`UPS~gsb7@y>Vsv3VC4Y$A zTXRfMi(r-V`5H&W3+;vz$F?4%wu=jIn(D`}F(`&fe7}9=xt;ZvY!i0(GESzjll_QU ze=TPJjG{p!2^(-#hhFWitgxtxKY8!en0(E`2IP#650f`2|yoW5GHa#@X8%JZI;EnB$mn zJ*Se{fy0*#v9?~cM+JxB^BpUGyzz4JavMG-$C}2*75?_qHJs{J#GrS}zZ(_iyHc}L z0bT%uy_N_++r#B*pNX6>dj8(SAxRB%Jwm`0;H2$5=btE>A*uk@rF{}sN ziuiZW9D4{}oYjXtHofD(o|M{ZmFA4odUW&6J!;3EOnxrU;SS=wbyPDoq3l_gQyX~j zl>xr}?6iYL{`sVr^pHeZa2k0a9*zf#}#2UK~X1>i7O-r<%d z@g5(sO|1~TrV0YkGe_`PAd5!(Ja4Dlzku);|7V!JjwvBUx}`}~d(NlqTl-6msn-S6 z!^2YO)7UnYyftk@rcU@U!y8mHQlG>&2C$+4{|l5K7mB65_Y1t6EH$t`{A>)Eo0SCV zm-2l|iEC_VR&jvmZ7H%DQPnAd+jcE<6bLVoj%-TZY`s8@R+-BkW~zZZK}bj+9UXPj zy_ZZinUX~^A zW+Sh0rkZ%dM)1us@%qaiFiHJLi+M@QeuObboLnfUWk!#E696siO#Veg<^|7}Ccn5!E_S5P-F*?aqy0zswiG%`6uHBJ zYrdu?hxc*wS$f^QLrm8NK;GT!PXQU$Ff$iWdZ>MupaB8#5lnGi$KoEyZ8aX6`O(CC zQj|-o7kMhPz5YYLjp^(Kc6YnPsUod)qn9^N?TBuG1b5*eOR3%I2bH;}BlJN5K#WMn zv(`+@;2Kam3G^RhlHB}--*z1%>Uy!KK{wCHI_^_a`M7veMHQ&@BVPHz@M^#>_lw=I zD7j}nC4+b}-_P!LJpndlu=lzN4iLM3YC6ZQY4A7gp-Ip^3zD&gWll(hpz3C7YdtPe znaD-Gqk&&P$wVlDpxy!y;&3F(U_h4kW5BE{k2dLL;N5t~x81uTvH9p?_mL;uCiELK z!uKTI&fYTr{sYHE{9VAmv%HR!zv=5!WECmRjrxU=FZ0V8DHq3aa*ac^ScU(*_W~tJ z^63(f>c9h@Pe5=SMI4-k`I<8bDM(ax*CX@PURtj#xhJOkSU*$-+M>ipLthGuMEO|7 z10lBD=lOn_@B9UUIs*B-4xl_a`)IC(KVs`j0e}-jhKZtc^>k(c?uegDOfkS4&Y+ho zsnik^w`}o|@kk6%F7<@Z7vY{b5N;|t&-U?h2|V+k2La2#C?ps#J##@#gq3&-Yz!MN z+o0j;69wU2r|v^K()*;q;`ZvFCtmSd|GqQD!kQ876}NxLNN9lPqyr=$*6YFrQG|Z0 zB*d*RXgE1=J33}YBjZGKWu>HO!eqBe)eb>ltBOg;brzR_W9;65Rb0Cm5*sh`l}uWUnwt?6n*gqdqzXo9j>-y0s|30y>5<%tx<@Pdwrn__R{9erqmTn|#ZB zg;EZ7UO#>r2U^wG20`weQ4t}}A+<=w9N>WMWL_GY8)^;EWgsd%g_DSxw=N0t5tZSI zGIIV(8!xNdlTcIY{{b>i9PH6pe1Bq;G}nTJgGy+H*;^{PQYS7=D%LXmg|=@ zFU&a-?#ix(S)h7zmpuIzia|^U$C{bUp6mY9{XFx}5XD2$pSPvTewvob<6UTpp06($fr8*36*$#mWSc*G0GfS}FGx}R zlaa?|4heXO*}stOPewHjWYT*01s_?Hel*#K&hT)~Zm5=>Jd+&yyH$k#KvZ&AQiEUb zRobIQn1*vG%j__i5j&oN;vwRs34>5M{PGe@P%I;dOjw`^_In%sD6BE($~_YO=3PtF z0V>nzU}bFD>iYfr2iOqPMLvDhBXOx>^P_LcOs8_6A(9_xI9%98xpYJaXMlIsT4gaqyG#HG!>%7xh3|#q&ta zkP?=XsQvubAWSBytsZVlj&$@k*P!?;pS*5~%_>5v5eBngCZE%zXHlN6V(WXebGkoC zt&bSdFV7CtzysTrUp)|Jzw{pvH zM+VmD<%(9~ed{t7>9dA2W3fA`2*tHLRMu)(eW1(`^4*z^)H^{6T(8*Jcb&H3%yE6k z>Wlt&RD)CiMVrRb*z7wZ(FA^ahxoMqvwCAmC-`C$2Zx3bKo3BwaINefX0u|yAEEVF zMm4~HyJDQaU!X-c8tz9emW-g}dE`k?E$M zEV3^*X>+wpIJ?QSO8qF!p(~1$ev6F!An8$?+>`I5U#X#ifM|78>5O5d$RK-)B%2wk zOmhQBAsgh>9S0NeSGiK?DUn0b0UOkN?M@GY>JPEv=OJM@pFURw=yf#w;b%FVAFfLN zyZ4yoc9`eGpei~6b4?C5T5Z%Rjb5GMxQKq%aqTQ zsH7<6tZTk8wiEogv!c)ZXWaz&RytR@q?v{t@c6#Tk!xz{)Ux{X7q{1k9%0hsiT&(Sp>IhQ3Q-M%_wCD;a=u5X_P74{I{zq@yd<0RmG9Vb z81}rXBsOV+X}>c2w0o%{C6OzLTBf%zim7_{AB!facs>ih4nlE%146evQv8?UkhI{{ z;uCH0;c3YG&UcBOnUOtKm6>CV#zp20iJOsI$XwgCY`4^A<*ICam4{Qu z$Ma<}vS_2ARe~Ew)0p);7YfQ1bGUI(6?BpgIoGrb;loCjVFAT5-u`&|$Bf^;_)`PR zla^Pj0POReJ8Hbg9ls-mxRDZ-QX9FBB5+f$32rs(ah#6id984v0h4;GQfZ6PmGdJz zm&wrY_Ojh*PdUM-+sKNpO|K6=6pQ1$3gp@9tWI9e?9#=(iSc=)ch$fK89nz#p3>bs zf!t&haNzR)3;8BMmiWjH2-HvcuM=0l`GX5OSWFnFSXrn@6feshP*C|3wbEfs79;%l z!cVY|Dz8oY=Mtpab++;yYv)swcfZHel=#huyJW!^Mn_$y$910&x{Hy$s`6G`Hf*sf zDQm!NL@xu)tzVY@*r{3@0v6;vcRT9=^TJWWKSDcx)x37(f)lP<(@wc*wn>7y!nzw(9%%Fv6cQ_J6VHhPE?-ZZih^+>pB7 z+ZgEjZ{58Q4Xeg|>{nO|7K%PNz^H)bYPoqztH9i;Z7j6FSj3~Tvdy^^Km^IRL-+y7yI zW>Re7uTNHfhCMEj$UX8K|NFw6%3Zk5r57N3TMskzn|8A|eO86iR3)7j-wk=DJb}-> zi(z2@!}~HgsXIP;*9aQa2eAEd6mZZwBqEFPW@1xLes7SJQeo-3cr5+<=_^HCai`>b zGt(}$q?|-u+uf4ca!I#gX-JLgJ#n40VBlL3P9O#EniE<%uD$R0WhglS&vUj%^0-d( z`B`^yjB_4Z5J&$+4g~=vT|u%KEYN(Dzg6tN_<7gDx;$Ke zn%wk$&jgHwh&Xxv0iz@JPXsAF8}&U*Te2~UN(VOL5?&+?h6b+yo7IQ%f+>_w66w+A zBdr?jf_j^Z8-PSh02&s;asNVt3Y&j2^+XhU7dA8cnFnX)VKOl?(O;2?fA|8L-sIId z%;Z+7`1<5(pxIsXc_%p~s(VNu3c&VLq+~^+8#s9$mjjgLdjDzpPwa*reoO850A^be z&NwVGOj1Nrf#+C&B z35#eW!VuR??)Bu<9xXB`J1_6Q$W_u2^0L1XDLt&x#_S9aVem3Z9|)&DN}uu3c!^p| z@cakq!gqzuGRP*3ugc-YYrtjChWV$_P6}5>4tQhMB{Jjl@r4p6Y#m9gv z8rc?Im1=NjQF*RYsYH1CvC8WsPHWVf%B2fK6^n z%Ul|-`k|1i2#!FKcri;+ovd-ng#;Xvy<=msU4iM0G zVmWYb_b=KNV>gJ}g_8D;7^BExfPMgzAK4k`=5Nq_e;Z|!FvA)Z5Q#a@*5K1yrK!WE zV#@NPbd=|BlFH}N`XWI%V>0v=du`0}G$b?GAGAUr16e-%axS{S-zxAEQ&3cGLtB9) z3&iO3_(D)By_Y|Gaq(~3?*WRw+?EP>uDiKg=JV^v2Wn-);SM57*K8~j?gVUV=Noy`u1nV#BHHc*d{LH%;4o^j5Lca0G%r!^tK{YqcA^V>UI6VOC-+=kN~ZT z?qlZnNut*waU7~q>z18H^~?__tg%n<#yL-u`>{8|jDV$E^TyP#m*Xv^!kj#&;?qxY z%fe(x5YgR4RWC1&y59~r)JV%CYOi#Jnn!(GvuG~0*{B&^VUM;Ujs)~cR}Aj-&*JgwO6uEiF)fk)Io;YazBZdW~?;d*K*G zPG&Pa8ou5J8FYQs0~4WmrFf+ZP{h^GgxwQ*D03R4vF0XsZ z(><3-J&?yfx;|Ei=#ok;T$TY7tn=k}k zZat{0Cb|#|p2_0hoKs}Fj=%*AA6e%m)3?8Hcg+b|Vr6q1Ie+J{PRXT683#0Kd9t0h z(xrmdUoKG2QVj*rl!d02Jr!q_)-W$zN!blDU&!^0W9XIHJ9_$~l4#c4n9*G8nGHuw z)O_4K;2g9PN5Mjdd9qA9r_A=q2jCOg@j5l&aUKClOQ0ci;J7J6g9c`e+=5c?k}FOU z<976}^+n|7&pd_)`q&E_7tGhSBn|^XxOWQu2n-cmU*)c=7!)Lqv6ItRxhRl9HBlAJ zqRo0*`CP?04wtZPJ1Xl=xA*=30TH;}_pKjyBVB;gC|4RNM7*TyqVAiAG$9 zGyRvA2ANi!H|zLJ&u=AcrAX-^vuB{UUlbK6UN%qNHqz&L*!n7wugYOQ!)>Umg=CW>k;z{ z8x>u{!r1DuPox=N42skUM}5Cvl!GRj{i4g7bTbSbZM> z5%0}rp)_KLu=qQrz~!5|F`BoF=5N8&PxeNna@Gf`V`$7KYwV60Y@txt0Tu-f0*+to z4E^SR%*+aC`oO{ih|q|$3Cz|nr~YsfRl2lDWyop%+UaJHrQC+KsWojhXF#T;k76+toG&<@Cv(c zSj>FGfZ+fBGydsX%0W(4w`u|N5sx-K_&+-ved zv~rqEJlZ&gibdD&x|mk^h=1-?_RGM{^_cWj!%UbEQ|HwG1mvhoUVV;4*jeRNFiFhr zW6igv_C-r>v&ia8nRl3g9Q}Bo_M6gf*6RShi0S_}I(rf4PfabsgFS!q0Al*HBH8uIP20>1G}nUDn1fvp zYK^6#$E3!fK87+a4d>r?RF}_X1|>YzoL7NOL=v+ixX$H~6@>(sq!>P*EK4m)!bJ0y za3y)nt|5w`ZeGYTC%nuwBCT4DnM=38WR*f#fUO1aKD5^c8e6L~3T*9zhF*1n|G`Rh zBgvY!OyuFK&YzG=UKW;`f{-xsg=ECO8gN?TxlP97&~WtI4ECfjS*$LqPSX zZqBCZhgIAp3q@{kdQ)UI9Aw4B7)g^h!vnzS_P1szM7KF7)&uI4`pguk>`sZAsWD4Oo4qP(i1 z0!@K&5z)y|3Eh(?uFOJC1D|;HU|Tpac&#pBA_KASa>Bl4s|G)Sdy&G1@RZ>HDUZvM zM=Ul0x+`0N5T*o!ma3bIZJft5^mAsd?m)kv+hX5$ljHyGBfa=IzJ@Rt6fN+(Y`ysc zwZBuftIaO>jnqwx<(Gw%%UNK2ZpZ#*ORBSMLaMB_=Y3z2j82+X^}KTm+ce0S?x`;3 zr`vcVRmpq<)!^qMNz{Hzd9+X%7~41TJ$2+^Ec$Rg+8BYdA^T(fC%IeC?rM)}V9LRv zAQ4X!W}dua6~Oo%rWe>>Ez-#UJ)8Y9`p^vMI6k5cBsjf(Wj{*2Tec{8D*t5@HXKvmN=cNWV&Dyq0WCe{<= z5YbZwpbD@-g6l}-5H5SzDb8=%>^96sY!qe1TFraw!w$#w_gLwA6WGz_z znocevZwUTq1>F1QX9Q}z0r;9zMb9Uw+QICRZ~k!q5Ms-zJsL*04V6bYJLz!%SM_=> zEgiIevMjFl_}Z=meu$1fD;aW2E%z44%2Hgnos7Vti_eALJ3Lu$W|FlEmZ<;4erYz^ zJ+Uy6rc>;z6aq(YRjwD=^7D>tU)z6TSIJ5y<#^Kmb7sn{JVt0NBze-rrRo=u-b1Tq z3t?V+5$9BiuAf+vPH78*mICo#=~-j$CkWC!ydUp&Pf%{PCrq8W3Ex^SB!aZ!r@oQ) zy)*dS>v=Z0zG%kOia9^%5>J}~gS!mg2|bk8%Lewe^2$%O{-@F=BCOMd$&rl%x^93Y zC2cqFA1B%5ixZL6b@M~>Ef*8=zO1?#-1PwkDC4f>`a4DOTwijvI_J)&p8?p51=XZJo4wL1K@gN63BRSIRq1(I+CXUkEjxkOt?(9ciS^rXIve{Dp7 z{YMgeCt~MgAYm+PaO`lAU|9`>k_M{m{t%nd@WawNL_?7(3ANIP{YwU^NT01ofgbT6 z{JF=6{7NR^SEN^tG$P%Gk(Drn&5SC9QXhe_xRkm-pH~Smiv&>6WGuVm7@mf4f$0kn zv}G3Qvs|0jV$Qfr+5Yf+C6;=eIH9U$1i%w8VFHNEhdOmkW&1u-ySD1%;ind>TC~u_ zdnZ_@9?pk|$~J&@kh>}8ro!yf2!_FBI;m|}mKqMB@1)z^i_e`wSI)8O>yLpRjivCm zmgo*h^|}#`5epKng4fqi{~$R@L!KJ2lVX#aMMyg{s8X+v-sXRGY!(JG8PNuK zA<2ncH`Bo7Hq4NH8vRWIrrknaU!mm92d!SEJ+HQ1?Iim!KyKsm<*EXZ8ThV;0qe^A%Stti9r_^`Z?#id9Er55|hUvI_oP&RLU z@`LgPTF|8r!hyn*uU^g7J>O9>uHl^#%xu%Qjpb5)W~vi9B_hKQ>=vIqaW2H10?cUQ zN6xxAs%7e_QRGT$@(8d*2_}}xp5n*xs3&fbt4bd4edvK#s3k!0F0v?1=8V0#%8I~k zwk~Ftq*=bMBi(}H6yO{dO1ihQeTMmgqpVm+e6atM(wUDzEaaXflpddTZ}59~v`h{O z{wZ?m(~Q0{#hiF9N0f5LjMjgPh3VeAnvi7{Trw8E&K2By>FfI}FgeF0dlVMD7h?CB z>A?*6cgxIba)!jktAm^;=v)5uKda{n@?W2lCUV-gA&zb$KxUu%oa zVqiF~x1I8dB_3r}MM!QM8?xGKb?aP(rTuXZ)kSY5m5$W4KN-mc(qNl>>`(nj)&kPY zJbXBFeIm8w;dM-=KvnlW<|TnTIm}0^Lq@~0jn?Udr%x}nX`v)uON^b# z$M4a#DV?BYD``#^;(VO!o%aamtm8JPTFS|f1y2bR@+;X;VmVK$?2$Crum~C_dk2h&(V*}#u>qrP+MWc3vy{ zglRIvcO{_~pD6w>0sf~yRzx`Nb_FcbdrH!7l$hCxa%{MlbD$t{(~oFi%wI_9i*Ja; zylk#Pn49Xm8&nPB!uPFda$VRV*{AXi>zAQWHF*o?gCqzZ%u`hB4|(HxZ2#b)lV*{= ze`_8`t0-RXIXWxN63}N|p2mmu?E{EeLlCrVW<^8mNU)8s#h#q&0D7E@$Eri$Mo;ID zX^$@5ao~T0S~Czg>bllY@@KgurSdyj#WvG6<@%u7paxQ<(8;zn+4S1l+EjKb*g;G* zxPVNGXu^l_A6fj!n2TVUzghxzhl&4m;z4B{c>;-Ol7vXR1I>0i&A7e%j~x;l!Kc;e zD~XN(nM9xX)ls$3!4Y*+{AfBA2Je|pJa6rKIY(Go-^s{-{TMsiBMwcs;H=T4Ql(Sa z6KJpDbhQHz;eQVQ@{*>$A}4NlmRMfs&{VaXJ^M+b2U|a%gZ&hC8>y!yP0Tf+!0T8d z%Xm_cnP}bS7#TwH{`opqD)mG>CazH``9)NGL+RIqEioLWCgS1 zD!{*l09ek&-r(*8%SSZE-RTC)8+8Udp0m9cuh0sY%Wp(2`Aq^B-y9w@>cWLMV`p6; zgtCTU#)1@yYyguMP^P~!-6rW-gyPQNB+{|AV?(}mE06rA-li6X<>=SL^fYOK`dVfA zAt|4>Nw!uPzJA@^P4SP8{b-dV2)3f5!-+4jl%Hs)u_R?6NhBk_moV|HkV3d^1OuT# z?%>;t*vZ(W`?4-#^}p;qlsB_`Id|lsL|Tu{bK=T51xlJq7HQuj9rd?m!cU|EyD_Am zn!*PUx%!@SiS<~1XZD#UyTI3eqZ&g2&w6dOl|eP3PX;ZGEisK2_IAhT7g6ExuDw3d z`uTje%U|e4^v-v&nb=^|teX=$X@H!o6&% zBk^Eq&&nd#nJiZg z-MOsQ2=Teulda#W1`CJOI#4d_^$SHl40i3L7Q{@>=1i$Z#@_c0xS@!4)1qIbUgS@8 z`C=}8m@Bskve<=hOlS-Z>vHPb7tE@h#xF!nos$$uN^YclbpI`&tbS`=^I$n`B9zvn z20#zX|JH|UQyHUvW1Fx{72B{K9oyI`YhmeZZug%-wsOy*xsX%0#32FFBM&8f7Oe@& zTlkTlU2u`?IM$q$)a%lsE6km(zciN0K9kITv=L>n>+JX)V$Q5sy>~Jch|o*dBLFqb zvhc{Tq0Kck7o(1_k;mD=WKaJZPYGxFZZxR>^Dnm2!8gdkXgpcUz_;cXDh5gTdSa4N z@iRIWlDXf|*tl{EErz36di>BQ2%yD!$#~l1yd21V)jUj7zcu@|?*vd5BoKyq+E+C) z`b7n^`_~)2X%(M;CR8mg{?9q@PZTU+3GA5YA->wzkx(gpOOtWgU!b|H6F;Dqy@mxj zI&zP#t))l`4M;wjL|7bQ>}<|^l8e$s+q5$)Yv~U^s_uNup~%55)_>Kh96u8wo)=YT zE8QhIIWsWlA^iD>@LRmRUWPsU(}-VzwJOw~?y;S13~mt4>wQx>K}eIdPD1)~N&80=C& zzs-47Os~jv#v>7R56Ef#AX-Sw5IX%UC|DO_j?Vx6fT&_79lxuLgupV1ox#Z>Jv-m@ zk9AS8Fk*9UM*ygID**6no(ObPr%~8%cmD0r_VINf$fGt2S7LlexN-gTcA2GsRJ0gxnGUOWkLg><6$Bp?IknQh>zHze9t#>ZofeSt{ zTtYRyODt^VhIT|_VHybu(4Jpc4WRDI(?CxgiZ#5_Rd0v4En7vl=_J}D!W`j`Ai)y4 zco1pJ9td=<;h3XNMn=!Hep9er2aD^pap!FM$L=>L4a_=wk8&3_IrzspdUL6zGL`uT zA^}DnQAtHRUUduik!>I7tco2&X@dUi#8Fkab(re8xsaQY2KKuRTB46gcE@iry_|e} zL-&QC2wux_UhvI8f+~~OhwsQ2cRL|XxarVx^S%Yepc~$$wFBbzT?2VD>>@GpX)~tr zWi%rZX=Z3-La_>YDkHjVp%D$_Bi}C;eRc*1{=ip*0{4<8pGL+TeBVFfF;{+!RH1LE zvnA|$CUAM^WJV&+t|^)Q9s*|W;sGwsdSR|EyxDL&EPuv=r-DsFlQk6*hLRQ`AOzmq z7B!8#pW$P_WA5R#aFPRpG8?q75K~d866u>W#mR5LK&r??&b)i?qh9WSbIt=CmKElb z+Qo7uS3q>h#H#izHOoSJ{UJC>YPDcEohzjMW}XUbe-_AiZ-zH3X+I!^@gw0RuAfpz z<3Bp$2>uAnwLW8^N2G-rjVs`edXRBasZ#6VAjj=V-E-F%*>EU_I83qtTgQmuHkkwA z4?2sJX|nlY3QWC2>SYgFB8VTJZ)0Tk+Izp`>^;lHpuWx~!>p4;72C#XLCnc=s@#Hb z@7p=`>_>4WHns|?Z6U4V_h9#-l*)#zGp(*op5Fb{@GehqDSE@fD(#C%VSg(`+z(yf z`duW+(a4}UY{a3_={>-Nsz{0M9~?E&47gB|_$P;Bhx^Xv^%lkh%K?CxuQkIQ}5^ zBn~1;w!ZP`VJ1rW-(iD+#npB?_s<>zCc^QL&aeAAuv}Eh;S3w<5CJMc$iJ8-_xS2h z%`W1b_^K7DsB^#z>A;i@!YXtnYRUG=Q3jplv@D^;V$6$#_-gVFMn(b0Lw`JIGjw(Q zOi4)IaV1vzH^G^a?Cqa{>-RC7$sa9Nk{fSM+)U{OKPGrj}0~D2@CXI+SIq zt+;N^CI~aCWX(=djr>8md27aj;t8;6^!~Gd9#tO?i^=MRBTjO97c-?4cWbhG9av0D zY;L2E;#jw?Ei|&UoqK?w@g!gGG1F03GXfwJUWz7{bATM+Sfa1es#a&%bQb zKVucLoIONjdvopUzdX<0z12{vRq=FktaPGOPL3G5sHfpd1=JMN(Z zc=rI#7ZHichx0YsqRA=!5=domG1ZkG+amsQRX+6kM}{To%WxgE)8-#QG2SeBt5#Pm zags~XOvMnu?YM?-F{a~ce!d0xD?z1giJ0suNk6N7Rv*j7oF$56E)YMVO=7s@_=gIME`D?0j zi_#wN{kFf4V_E2yx^R5j-^nY*c{x*3=63fhGj;OwbYe|Q1i)-D_DCc-*5izBqD;ce zOdr0mDBJZQxpd3vpQS%H?b=?tk)#oFBH`7HZ00QTcGc3bK-u;Yqh0hQ^snn7JcKnq zh)Hr28`}h`AbV1@=eN4~XmV1+rGidyTFXFO35nxCHnP3je46$1ved{DA6y_GK-!M{U;o__f?1P6LN*vS zJEJI16Gi{4Smd}8sId`}L2#R^@j`5OxXAR2#`6B4Z^l$6Z5W*vo{at zjYI#yr@^yGIAaVql*^lrDur`u_HL@h(HNq?%Oq@ke$JH0kbH;DDN|P%`SaqdxG52g zNd~Blw%xcOHiB6$|Jke;S4c9k*bQU5!S4#sFrkG~KawFP@i!EJYMvVp;p~2(9101Z z6_>N-B^?R<>^zM8%N`#o@f|CF*Bf(!_Jlp6uwknofB5tZMLr)&QsW9H4S_9|ic1My zZXr@A2}HXB;dT9S&+LZ#4F+*anSYizeTo>0*fV=d83}>J;F52R)P0Rx!wTOD8Yjpe zkRHQ3m>u2MYOs@oeGy%0pp#!qx4#w;=j@<%a`9WVoW>$=(C)oRStsx8%af4k0z!brcDx_C!`C5=drWz3Wn`ZL?p}kD>;G zfgl7&!g%)SJ_Bx@49jDEGD4+bOs*$1?ygKb5s{f}E+cljrYcO?+zQBL;1!%$D?TgD zhVxb{ZMAnDa>#p*7iL!3{q#m zwQ~iDGp4&6Db{^76wGM$;Y@@2Vu=OI;U<(kC-$T~BiQLYW1_7*OkLv40@bh?)UUr{Zw}{T$&QRh*j{e$~`u(M_H7OapJ$dt->^4l^1=&%#1@GP>8Sv3vI}*db z42W4Sd3$&Io{>R*%!-{Y@6uhPpN_P%vKx;-)5uTJo6J#B|Q>GtrVi!_RvIzoE^JvYK0WHf22c0ZUS>y z@%onF$pg+8W&`Z(vVCU==;YToF7j~N0{oJHuNCW$<3W`J9zIJ=T#DxscQ0o+HHI)S z-xUO@r^zJYj^^E&8vCQm7l=~z5i4l~XtVwhiHanuX3nV=)jN1Y+PlRNQA#6ErzEqe zf7+!Tl#KOeFXG=yYA>_i*ahQ=DnpOXu~xzKxl%d15^Z}{&* z%%YB&NfL5#tQe$~mbgU}Kn&v=tGqsKToU)k!g_QiJYrmOls%FeD@nyF=`eac55=F#;gwn+`h&>8spAHK&Hzf*`cv^AFQBpfd zox;bvDsIyrG@ZybtoJR&R6I95p&BW&J!%s~B%J^$KqOaPdugJxEtcTDoy3}_j@|_-sIv%{xhY+lk z;ZYA=ny>F%TP*FT*mj#|)KH&E*>yK)%PI#_?Xl7P;y>Ruw=)frTsdq`) z16jo~>D7d7a1`)fln~yEU4uRGqj>0+RxD&rFTnbDwql^7BZ0D}M0rX!MsFuF zC_9LjYRbT+bp$Y4yKw@AxE(ZeZ+GGkuT{r&pt~MNQWT8;L|*nLe2?4=daSI|#>J!} z1U8y6X@$m{{%4s7j@%)C*cnf|u#AHSO*%*$CE)B)dulTfT{2S|hc{I8o63Oh{5ni8 zW6MS-U>whs7i&@HVk(vzPdwaGB~&wATDgE{kOH@#P@{OEP}}Ux{$@W}##(W(fk!h9CbVx$H}-;QjeziTx!F*%RtbU6j3F9kWF%R@amI&Yx+z=RX1dOaW7{sHcS zy*a7~%&eb;3D6(Oq`}V#4P$zL5ux-0{<|Ourn@NDaTh2x_nJf=ub*$MFh9&_hbWUB zCFjyxl3MHC)V2xj9TU9g>h$+HLA}Dyt-g_B5N-}r3O>!b`M!ZXS0^bDnsd_J!Fr!hP{=lJhv5qB4~2iiXQ>-^7O&^0?)l44ES$O`>bwE~~w6Q*1zW?h2lWDo%dDn_CL2 zdyMV$01^**BgE&7`K#Vi7R&xv9$X^_*cUvF;APT@#{U_&7;h*+2~+CEK0F+Gsu6`x zu1Ka^U$w0}wywB@M$+{9R5`xLE&&qQg#)WSd#3zq+kp31Os)JB!O~z>Y{=J9(O!6> zWlv~z-@e`lSqudCwuh9*l(z)?Ku5ahbwgy_s&&)Rr7*M+;{1p8Je;tyX_;ak=K^nT zVuP(Xh&SP&K#vFV-=8O4;M;U{aa}L}dqKAu&-wXn-OBvMrD`&c7;1n|10kKH)TGa` z>_B-&A(QX4m9}i>L#>VKQc%luYNdeiyPds;K#D8L_R|8%DcKs-gb$~Km7>U-Rmj12 z3jX1uE2&7p=F2U;Ky+jrq9Cs*|2*-ZHjKb0`Sw9kW0*<@D{E1n_0iTB>>|H}vtb_+ zG@2JyEw8Row)JXA#lb&ieSRCg1EwkhzH70%2dm*7$&yKWU~Ah15iY%EJv}>5^WsQ82y}VyWDMzc= z&-w2siwW2&1h5mwLs9fJn}Y^d`t^#OxxylkC@HVeF~|?KbKPbI*UmN`OXm_F+03r@ z^avF=lEP63S%?eI-n|!dfg3-2h5qZ^s{o#GiTnctS--EXDwS1 zb2~GM(tY+8v{IO6dd^-bCB3_c=95fa`n-o7h3W){N-=+j&Om{uh2IJ`!X?FV8Nij- z%ll{ZiRAVp2hpU}b!CA%J6(A=D8dv^XX?>9WT}pPqZ0ehCDd7jIf|>^<*)fGgJ6HZ zXsy=^MAp`sXb_+CHoB$*1X{npzE)|0?=ZyKsBWo-OD)5ggQ>ZsGo}x!=w7C3*hu&( z)Hd!YLd#{Thf={Z?m*BWS6WBCk5Z~3VIX14h$8Plwb6mn0Xxbs?kwk_)tR10(Y-v+ z@WemXMY&$qXsAym5^a|$@iTpngatIO@=5C%CiDM#45wYcBsFcEZ{{!lW@6kt=ABLR z&H9{rZ}8(Y%8o#%7w|e{xNw~}j^D`{{KBF=fb5ZE`){+>C3xM=>{q&+@%C_;apf*W znLhnP_2S9}a$y|E0Q>1v!2!9Z7tS+K7HP8_oV63ImzEUh_cv|_po7kDwQIg)Df2FR zz$Vh8!D~wTT%y_e`!5WJWU11<)(3h>9G{Vqi<;NTzj^RGWXFBYe|t-QV3suelxQ!= zyh?cZXS2E3eq)t)_5rHK9L4^J!z9!$5{sz*C%ebhALf!?0v5A*T2ZS9*KO|l>=F!F z>XCoxp@zC&xNgwij!2N>QhV-5d5#HvQkV`e(6X}hJwg7#(?%%kGH6n|9-k#8=_Ja$ z&-Ai8s(dY}+E6{86LW>q!}b4%6VsyAYRbY&iZ|k`N!MbWvTQFn>D4V_=HGEQL=cep z%CpM`@mB(PpBpUwi=x>0=O6so@c#Dv86Rf*R^>rjO&C|qV@B`>t&{FbNXme!wS;(- z;}$LkkJY6JxaDnJv!rK%Dk%@#Z!Fi-?@(GAzOEFub1{U)8= z+G$aN?x6Ex_zttT=Yg~>>U9g>u($fWwEItuEN*AC%&@FH)Oj3-8)4Cy)%L}uvPt4IQ$Df_zmmTR@Y0pr_=rnK7vsNU==QV*E zDSw%F#FpcJGVkK0BY4c{EK6)rSptL9Rlgi{ohZZR%)+P_-%ULMnD za?_M{PdmR@;JNq_ue%?JtGzzbQ)4aZ*gi@oi^(Wt zhBiwn+(qK9T|+QYX#0F^k36^yu;6NQ`1-bFWXZ;QrMz68mD07#I7>qA)i3NL^U+yL z#sXW3`cIy^+$cEBi>Bt`XQGgOnP$(*sz=uZMqRFgFe2BVB~#z%G-zPgP~o*s*uo`29k2BYB+R+Z_)B0lB>@ldvy?aaxSc zor&b5x0f2qPCl;l?`&R<+wafQyFUxIK0E(!g1FVgE0td6Wl8KC=8v9MOLT_OL+Vli z|E@mc*`VKsR%(096n$3Qw_c$3Hej*&_+q<*w{9AY@m4SJIe!4Sy@Wji^YpVUJ33Q|E zv8L&p>df{MhXo#`1ih@e!^;wTg(C>R+RXFLNIA$rJq_=hq-A(vqUKiS+us|ihg zQSSe-^pycob>G)RcX!v2QW6qM=g={fw8BG4gET{@(kU%NH_|N~3P?(~ba%g(-~au< z2m0P~_Sv!4+WUOUzA+N}flonUb(3v}Ko1>1Yj3bek2G#+C~{}zt!P!Z7hzpP8hUMG z)bZS^TP*5se-bh*Dnz;Bl>S_urf}RvzNlj7jd~citgx$cehD9JL{egnuh6 zJ*WoA(FER1_QUiWz8a1kefE;*>6caX;B_FGdD?^6>CEf|Nq?HVX}P+aN!jQ>yV&TU zS;l)?+M>Npr7ut_X((@{JLYWlRbg1|xZ^MXm8P@*YFD;ob5RT=6&bE&3IHCFeOo_z zKSWQNpA&9dpdAULA{VxEGX5MH8zoFf`(#cOgQu8~qeMgTZ!fo1ZIeAQ_tPRg+GKfUz6;$4<(AQ^vc0S*6)}U4unT{-_BUVqm0@<@tcc7&XgZrlY1pZsNcx6sV zf0!z}TLffK03M~|_mEcg00a$+`(#5S1356$FV;A)WS0Aupy}0p<)zvI4R;o`k^Xpd z75$}tedw&wm%_r}nicH^Xb(;u^noI7x2?ltG&2(Nu1RF+lY z*KFF6)9JQLvi_nyG+9_7N2007C8KP68YF?^KejuHE)1p}6JLK-U1;NEl`tTrO`6n; z%Pqw-swnN7DH>n=_WsitFNTJP-^MmiAJD0)$uX*N!|^8ByYx5k5NQJ3rszn-I1!Z! zC2yG(Jn6-}E+$A+=0ggUUpW~=Y&MCN_`ctf6B5q7k^Wt^alvo=g1Q)CzLN9dasiVk zf}4QQ{Hw$M1Dj1aBp_fVU38dn;GZ~6sfi~QXneQq8nlmvG;70fBloFq_=J2>H^q%Q zyk7;WRM(K=V=;>vt}%@$BE9xqhv|J-t?{?PGAq(`02kmcIAG*pyeJW)h<8TBSQy)! zwLDvQCr$c|Rm@sKGwsSW6iuYO{p&}-|gytmuF?T8rs7nWEj0^>pTX+5_&M1f6P7mu(LyR;V)<-JP>YhO!&ck)Q;nTp(k&m6$wzhM94_FecBa0~GQQe7mNkc_3X z8-K`w+siO9;Ay6tcql*gs_swN`?B|eKS25NfuVVvH8?T0s?o6~# z_g)-EzhRBGHj=NetXuEk3XJiY3zAqRyZ(*{oB7*wVAOxyh`_(Szp%5 zg(G0089@Pzv5(}-Z|i__Oj_Iij!|OnZ&+fb(Z2ya*uc-8p%(W)zh6+GyE$cEC%f0Y zoBs)qnGlMInWRNc!ckT!ah{Bab#wVB68@=lgpcL7w2UD?5Xuq@&fki)^p55i1*!7x zP7Xb*qh)lh(-4@6PH#81do}WSqsGd=w)!tGt!WlG;b%jk1cnA<-OTd4A zj=t4CNz`$l7ats*V&%u(?Ftloo%%tU11ve&Eqm$r=J?YW;?ZBS@6Rr2>W`x!S<(}7 z6~Xjy9(mu7QH2n!E19I0ORBnKy&4z(-}aZ#myzWo2Z&Sr zh3&A#_$NVEXdZWjE6L--1<_*3ucx8aUyN~wB{@B9^ z=8QeYCOe*4&hlLr)9FmR}Pjv*W_a_caAJvK)AWP%sx9OB90_*LOni zgNp`1IYdc`q*Q!x8-oKwr}3Fox3dzDk7C$81Dc!J7H%IZ^c3tRmB1O6{a#cn_eGq^t2 z9ZcWh{pbFcRm+$L;;$)%VcsXM-mMoY9lRvar%m?`$(pFQ^kpk=`X1Ol*D7>RC9q$f zc|jiyl>5v|REL+wJ=l?0*lzrd-aU-yp^d{(j@&tIlt_g`cUeN)pqVBed-Du3G(RHj z?7(=3mi6rC`3{%)r7nOR4&B{)O^X%!{pBTLe2mJrNlC#T8+#PGkg7Qnp<-2n9GQBMz zvIxJ2&MPWNAlz>&@Q7LZ!2a#ZksE770B~Q>4d_{!r~qbh(v4&4z}EhoObl!c3}8ge z00E=F^3Pg!-?v~B3%{iP?QSkEL5i{|@oVks;eEYT`>{fSv}zr&HgUP7H|`qP`d;fo z1;Oh?&2&RakZqQEh`-u06OqPW9}NS8-KQrQS2;Pw=;JT*{cGh8_4?4C7=D0V2dXf% z^bLj*rVn^+Z^W4yo#hwvg4)I~g5OO#W}}b7*Rg{kk1FE^USY@&y_K&C>T`fdLyNElq|!kTpl9Tkyux8D99_{l+wO^G@S=vdVYok@^PXCQB;l@- zp5-K+f2_l^@GvrEJuYktMvn0&Ir1I%&09+OkfcW5X*o7O78zp0;v?08A9trcD>YX= zUlYH5$v$NTrI@&rfC6B+OcG0CZzgi~8{TgF|Es=t_|d3%1msRHpBxL3rzDG)JMjKS zvO$fCj;2|OhH>CCQ?*z6ir#+=vX@YQ^QUnCHguZE(x|27$%K^Qxpz0xts{TedJOg1 zcl(fDVxP@55wq}&vDf^<;fZKBU}){(m_pNUMNQZExp$~XVz1RtlwJi>Wy@gTG+#_- z#lB^^CW&V4IdaD-6Fc?$Ac*n%FUXJ2Q zN*KJh{Wmc1$zzlD;X*MJRg5tBb7@@6DZHh7b8F*WW3j~MBnk)O51MG(56VK;-w(#+ zMbX~?=+Ln$M>Osdb@own)-p~}waS8?f2@5g#qN#~^-1{hpR$fg9N-ki&yH&D9~@6v2-<);*!xm%(L(`3sL1EA2pxUitpG8gqJ z>_{lv;f56LtKl>Zv^arr3QdnXR-KjC7x9Me(li_fADM`Mo#3*5${){ZMz3S}UdBbr^#fPd2t90Ox5~EhK63l>57=XEA>0P@!}$w`!FIBksA9xMMI#J=wC&wc>G|sfeHt! zUbGnfA9?fi_d#(Bkb&L@7^qM#@_rS{h0v_C)umizyAPqN(O={Ts)ng#60_yIaYMPq zMXoWITJT0wfro7QJZ_@)uRk0y?#n8Pr#@wCqX&)D7qJ>JH!XxT5`Jb#uCB z^Ed0RB_1p|?ge)5H0gPqa1WQ(wD0HR@R+zjCCUM9ZBh6LH*nOz9=c*ysn5$Lo(4R( z6f8q*3Ax(!k?60ko?*m)6ZBi410_LarwGa9A*SjwJ_z0xzbeI*Nq=^=2S^6V@ zj|9jt$w&A8Q5SDsY~M;L=|4_RoLS`Nrj|`zjQFyfmH&}BucO*Pdt^CcdotQBZbbqc zgN2mc+$WHAK~M@U8~pAQfr9SB3l5t0-G+^w9Vf(usg~(XyGbg-PIDd|pPm(0OLf`Q z+x|VqW{XcY>7F`hkm4PA59T&J-xkDbg&luKnD7BJ;4fC@-yc*n)bCt|!9VL(qd_y( z&yrxmq1~K}BtV0a#VN}y(XFcepSe0?14k|{$UaEv5TZqdU-^4g3vQv3uUoP#y4>O@ zZq1V67Bu*3`WfayFUSg6)13P0Rt5P=5mrunCuWA^Ne*!4jM7U!`#{=qNyPoRD#z(H zX!Q<*?EZU`lMbt%-`$?sW|7v{y?Nmh|A0Eo0x>DZ67x{k-ewrob=Ty!y{5|Fk$#sq zuhL8CsC7zNP7dtJSCfCW1WdjfrYZ_i`cLH1^>kt^TTR(VlcCc`%o{HP-tV^bdHZ|d zc2k$88;vJ!>pG2|uDIni-gK1L+W2l-7J8MEtfGDCow|D*GGw5%g(}+<33RegWVN0h zyDanQh17ehlO;}Yy+!wzp%NiL^l*O#Pn40_U|w=F@hx((r-+wHL1oIH_OfeJg%7M0 z#FIbZaA<2l;zre-fAp6@lw0SIoB)$Wm~@4pV~<~lte7wvcQD$a_*4=U5mP1wdkw?n z9z0^GEWn}>L^T{&YSZ&~1W7J$QjJ%yZwKwDu!)`Nq#3y0EX>;GwWR1n zpl+!%JOB(} zDsCnzQ}M&;gFD~CgX*I8{9wEFjIX?m;6B*9(!lG19u_?uEDte=zwT|`!)oKzqDMM@ zgx^28;$xKNGD>J0v%vXi4MH(w^*$C-&32q3{__~?%S;ayN8CWg`zW!4(ZzofzrrA@ ztD5aK>$}{ldz#HV+H!B_*LT^9AWZVMx4z9zJSQzen>vYEc+Fkl_7p-nuKZUt?Sa}| zJWKaIPr@GIb8q=gtZI_WONv9m&c=G-&> z`_)EG_byRIv#!dYCoH-13qSxOuXVnGOH}i*?f$7zLpg@F{kqz6?5*w=5s%dJP(^8U zLp)KF=91GIf=G&j<&w7;jkOQAs>;O}u9_lNcPKr?^0q5=axxZag$XCJTr}|+Z$q2q z{@%FU9mTpe3XPR4w~v1&1hZj(8>9)cqaf7E;q})d$0~s?Dfl0=Cn4 z%+7Aa8GGo6Q{44eg?=*MZGjJVNl+raWCDHfYXZhcP^YmdzC@|DsMq6u%Evafnbb`U zOb~$dHiJSwvg50ti7tP}&f*`#%$%K;^LruK=5p9J)&Ll)Xup$I@Tt=N`gFb9eSxOP zHc@#~=*HFb!uZ&G64UqOm&HNZN;KdCPJi+z{<$nPfYc^A^^ZfWt+aAnNV3y}`R^_5 z?k!tLC3W#SMeg42YKMP|D}}!lNB{z943hTy#An8I_I7cVtD$Av7`T>ju)4CGzC(Ar zK=08%g>rY)gR4wIi^RGWEiLNj7lhr0T_-FB&m*A%qJ(4peTHLd(@(pIB8q@hZAbRa zu?6&4>_iDlgj0tj1^E>*bHhlb><%jGA!ywG9tb8pu3DEf|H4>ng;ISGFxh(N5 zmlnM`nF#Ep@g|Z%TP|pu0rWx3;x6_?QS$CeajWfv#uwi_kRIu>ZuA<^HwI$*;H3{5 z19uI^T#(vCFy^EnQwQ%RJl?D{*Gq}@&>8>M{r4k>xb*`wAivsXlDbouwaJ88l&On) zY>_N)FERw7t0sJFN_pFRzacv=1uhDPYpMC!u}YnY6Cx*UTD_;X&eaJl)PBF-d%e@1 zSbzPe-pyV%M=6pA+xV;lnI01Iu=Q83^E&AOX}CAeSsV2(^LQot_nHpGO7)`8aIsJgx{X>`$Ly%>%;pn%Ocb>sR1Ck=~=}OSF>+pRslC3lRygU&ice z3a=yqN!ii_2Kl{|dfUu~Y7TN*>yDtnXv?Cb(rDs-YfuUVTB_gQe3VTL{ril7&(4aO{#lLpA^1SoGF83GO*Uk%?b2jmr zxC(K1LKSG48gNgU8Off{6Z_HQZin(y$8W>V*J9tAdRsT0_WzP^qLHJ=!Ha~ml9|OQ z1t_|WUNiETCAsuPylZPIky=b-OLUp&f%eC9Byc3h)Ax|oqBG;q{fV^%{N3q9rb>y< zvf~S8qAy0s$2WRnu-5@_0*Zzff)GnZE{OY({1jJ<5A!4nn8y^b zIx(Bl;gY;=+wT)OQn&|ji=v_x6`GJS- zzVa5nf&3u5^V@2MVfQ^AJM){ObxTXLTNxjZT<6KKznW&0Cywhs4xR`7-efo>k>D0ih*ukE6sSwks;=K^q8Fx+^_S!mz5=-UNKyIi>n|!18$Zr^OE)Z}{b^}$z5Q~h?>f9=@!b<> z39d>ox8-|l05lHNl|7RMcoHl!i|ekSfzs+C_agdiz-fjA4g%4FTw8$4jmK#zExHDN zWvueNk#oxbTdWON%cp-gR>j|Zm4c>pw(@J{5X1DDviL@PPSh_DI-en+l3L-WiKrB+ z!1oDYAr$aq0+OZ(xgCHT<}G)^-76)HpeH#KTuBN0>PX4(Pl*P!cu=%z7JrlZCva{t z;z6+;0%Sl63zej%^myXicK+~UegW2v+wyaSl8|EA%AXZiL9U3}?Gr0v{! zA}{0N6q+{<>NLj&nbPDq+-9cWyYu`RJQxEFzGa`FW97Ju=kzScbp4NXJ&K?W&zA3> z7F}FYL}Ub^`)6{BJ#;(ueKqH=cil?}gNQX=R{0T~Hb3w@t&eftM&Ds6&&TBb_(!WF z=6pxg$ICkHChu}fm(z~2!Y9|HC#m2|P4WClPm6qFrakdqpxo%_`)u_gp5xt@4{+E{dg-x?Ap zq31YpPEQDhM7ir=5o+bZp0EWYymob-E!3l<%W0*VZIeK)9+#<*2aitP-cKanznx5% zdwFlp1kc)qakQ50tR6pOj%dJ^L7Q|Z*-}8>8>h}N!Pr6e9uW#r7nn_uXX?djH?dR%Q-yWL-r%lbQfysCSBFnyDfR7vaL$<~ADx0BqY%d*h&N&a zN6-tIlla-)4k_kYuHAq~**^p@#kF6>*tkye1qsAJArMvbb#De7Z{+`(^r+PhPG1xg z_rRvMv=+8~^5P_mYv)-{piFNNkxN5g!POHw4BVx@f1^Xb_7BJB|21>lHYJYtQdUeV^Bj`Q)+ z0h2J0pxMno6I%~7NR-wT=PFrQv^Z${AE1dP?gn#q<{)Dro}gC(nUmQg#b?$228p&v z9n+TnLa&OkoV|A|L{VoF9Kxre@uo=!yDzK?;(WTG_IdpDZzidy)M+k?Z5gXiA6IG&b!h1&7ErWyXz2+Cfhd9z>FBFV zTbjP9m6evZYm&IhiYk~-c(nfEbPl-^cgtSmzRKY&;_i3wG1l~s9bG*pqWUZ?y=A)f zas!U~yQg<=J}vKR>x@?D7ch6e$d?~zjjPxDC|78uUxMk2GeB%c6!|ZSt9$XxAkEi3 zQ1}{vkw2IUnpekZwMlsa7gj~;1CnG^u!)(L{V-gnx5438-@4H@>{gGV`H$FsztIh$=3n7Fv(@CY>)+;7PO(MikFoDTjS71Cq^!dYr$Okrzj2f{nl80llrD$!(w)jX zt4d|DJ%4ieTDH6Tj8e+PuJGT-br*L`ZbpSUj+Dfly;ki~q?I|!qoUN40s*A}4w&+s zBBY*m@EY4ajQ`B5&#w-oQ8Jlx^Aiz}xb+^>a{Ls{q;*it1N1#B@I5di;yXS}CJ9FI zr5a4xpf)a=!4r8}8Kd#xEO5tTc+7{36AOLLT3cp2SzM`zaDU2@-!LjSod2*}Sn&O$ zvF$*}5ho9g?}3Yr>9gMp6u~Oh&(=yJ2j{Y6+#P`U?L56eg_uq(j8RGDT4QYmd?m2` zE%L21zGkTwQRwA>04b3c#Oh)rcIHDK^l5;uqOVb$GOABk5bTFAG#2@`is*D`_p2f$ zwXTb}3t4+ut;fpAw3mH1o|C^WcgHj)r~FL^PO5`-9!q%7elb+3W!y|$!4btxOPYMp zHa_Uh$P)~}D3ut&gh|IJ51X?-E;VyE`JZ__v*otCr0OIlaakEEyz-XbZ7@&L0-zH_ z^T@Jk`%*w60G%{H&;=U^E6JN^pvL8NPc`Fk5ITX9KuVts9pAR>IhQk6d15`XVlRQ^ zGv}9wrYP-{y9i_*RK5^4Fgp19wKlWF{C4Y8$}Pf15(&=?`AA}CI(;{pU7ama7gI-I zaKhH$piC(69pvmjb=~RPE3`=)@DD&%5!*(H+#}&iJ>M!*w#P`A^n+`>UNQsYY{Mr& z^PUK$HRqZA>GMpH@AhYe7yWhF8Byu=$2Tb;P+{j5#B37bK%CSbVH4WM$+DhY&)PO7 z>%v(Y)X8H<;nQ6caIkL@I>N1_>@{xE@?Tw3RGdaQ>1d5SvS$(6ZxXMprJ^@p`?kBvxPu&AhLzH?c*AD?8 zn+c)YapxYQu9zDOBr*@@8hYuc^dmvbsN5@I0$oR2bVdAH66+*iqYG-b6W+jIX_0Og zXZwlMD+<1bfFgoWEkv}0+g60;lu(iK0O;zuZ0eZ`WBHiChTL;~d$V2ao_pug= zN&V)RWxVl)x%D$^m&3PLQLPe{^d{FDcTgXX>fJK zTfA>zDM0rHNJxf~m>SPH4=je*2T+*Zc2k%>gq)4J7@J@A{sdsse&A!q#1S~37Ow@1 zEAIG>w`^j+s#m+ndvG5{-s?__atCmEn1tm?cpBdtmk#n2$W~~|XzU(oL;SVcYmsw< zK53SNC3dM-o;Qeu?3o1|7g+w0=Q9^U0olf^*M6P{4Aka4bA+R44YoW(iP1z9NFo9Y zE3IY7CVcE0`5S*zQNmXT7$mBdW&4{=O1-SI%4k1H6n~dV>}QN!pQy*jA0CPhJqiJv zd%OS(VM$&$D{f0ds$OPN+UI`#j>Z7EKaSNf@XXF!i+&Bjp|37&9QrsIFaTnn*mUaR z+u}17$+Bdx zU-H=$?D|I+buK#!FZBzg7zj~yW2tA*lXDr=n$CW_^sL&#{|2a&Cz^cK<(gMu>VSTt zSL8{gj#hG!YKCr7AA0{9pa7taZ<>HA6A`YnG>^|ASn%Eil~v@9bCh{-6cBzS@41d- zr5f0Yt``rZu{WP4(n#g z`pf!ia*}z4xf#D``#7pNoSjMDimbm+N=mwe{~9h+($K0OVndh^>u@>$ce{rIGSc~e z$PXKpI?#C1wbXC}aLtle82_K6n0R30;Z@==iMf2#o6tvCEhPm0Oi-hykrANNQ6zdi z?esmsio^0uU$BSZpBz6rN5;Zp7;#+AHvAY7b2|p+kdlIRT~EpnIoLUW*~Uq`%LQ^! zymGwn-}T6Cy7>?E^eC$}J&#Na`eiGVAx@MoC`d#62P)izhyP44X*Cxirx&XVTQ8Q3 z?1gU2L=_ga9Y5*R55e=xY!O03Xq$LY6$>avIG1M7`<-&=K{!gKZxF&Ix=tH9(J>^2 z@@N6e$$ahvz2h5~cKr>2dzjo(5i-8iZ?>S?^(2`3MP5_WU*}BhSug_O+VGZ& zeXB#OHn3bgp6-1k@{s8H(|D}=U-`&?Olkp!wlP)h3f5ULR4y5l$S~-r@<-rhS?>;o zDI7A7bF#xLzYY&8>EY8uU{r=}-LmAwgQ59rCZ5@R0$GZE(dce-xa8U6 zD#H3ivU~6(=`&i@5W(H+2!=L@EJLA347G5(eYi`D%H~vqimxm-Aloo^=;KrAXaNC+ z{ne5B3vN2i?xoX@IRt6l2P>Y-pnJm0+^H{yC z;lQjIt^gR(`zw3YE4f!zlccM$b2f%7(>{Q2YWDB$jmDQ^6n7v|;e;s5)=kW8RPWOT>Y9e}Mt{dSm z;Lv%BNO^zjz67s*Fw=L*2NyD6Kpw)(nc4J=95ttLD?}@Gmso3ECAuO6Ve;?|$ z#U+@>R50q6qDCa>9HF(Rqi9pqNQoVtW4gmALw zpDC1KAz9k4pu$PFO1v!w6Y}gAsBB9^+>j3mL`=NUVv72;vQH z(q5W%6N51zOqk3SpZ*&Xis48atngZRL&r{7Gqml3iWg%+V!KcTEQ_4|rP@d9x^HBr zwWT9?XBAZ;RxMJfW^TVW5AsgmuA|MG=@;!WO2VvWOn zP`Q=;Q&GNYu^126^teSfE~Ba*Y}xMh@u5lF(gyrOhf49Sl>fyXg)gK$U;%-|+P=Q1 zRGT0#b5z{H`#xDhfA_6Jxj!CA!_7)_v*pvh>;|R`6u2KxVy<0E+@#SZ{dFx?oC@13 znJrN%`|TKV8hR;4aaw0)8V-%&Uy?aGs~FBYKA*pTiXbVr7i)QXU@DdT!8e94Yb}Gl z+uae|^^a@$+|K@YQz ziq03ZM!1^Fle5Why;hxUc9)q`)s|YO0EznE;B!Hni^GEo#+ZOB6_Tlut$tfA;qa&) zlhTObD-A!Q(iZr=-O@GP@W4;;duOlaFxG+7W<<>ov#X%1r4})#-eopJ*KII632;sZ z=~hj3o=iR9m}9XsnY^EX=1{_g4r-yc$@(_awaA50;?6$%{!tyNC(8NgI`08iw}t~( z3X*=*&DgPvn#cgG;iz`WsqpeKoc<@2S<#yo6i|=$(n1*kpW4Rm=;iTa6=$vTk=^xw zvHQ2w{-|u|s^#Ew}aoeSdZ73Y3Rcq83#UQYqVE@d(*e*aqdA_l@<5 zBqA%)4~=bt#-v_ziC~mo^;k^5N=3eXO#uF?I;tqi(#>+xE~0%wa@*0bO4Tcp$fJ?u zZBcyp@pX1*#!%ScnpLMaLa@u7?QwpwT+guGgjxu&XTQ=7cDMl_=vR9;*+B;~yL@%o ztz$X*t6Lwy^UgqyH6m5Mq0nx+zugAH#G^kZ+sEAh{o*rrL|m*Ii^%#ajbHx(F(%(c zwN&Ch`^--;1`unm3AuxiZ!0e0qT6%I345dS=c_9FSU~?A%5XE#H8;Adyvn_B$fQKJ zY_)_a!;WzFE`SdMRr-Lfi&;3aSMQq-0VwzTsYl0ow{zAs*?-vid#O-) z{ErMR6E})Dn2=$u#B25Kw$VI( z=oV<{u4Kan%dP0u;Fw!cXLNV4&R@~ky z?&JcluzRw#qduaQc@iyZURD4=8(F|@cwQU7sIP(aqyRIq_KzE~!N}$|5={Oh$(Y@N zSJ#gN69`vSJz5gD7~BO&^T{FO{mn*l{-PhzaQ(*s*xV0Xj3no?R;rQyz!uEEs?Ng{ zj4gLHecab^m&4?EhOa5zJqMt! zE@$dRr!DJ(-rltqhhceMO|bCvqvl9>ahaRv_#hRn<&L}dz+7TGT-sBb)*p>GzV5F#|8tjdPZpj(L0z1a?EkT6 z2#wR06d7Y-#&T8{v4gSddn|8Nn!6dy6H=s0l}w6pXEzN)uDACtJ~4-|L$smu_$!Nis{L(z zO-y*ZI><(F4};$%{pKQPRq?u@4@FkWUmSde7XL=HRwP1bJCis#c%MDHX0{K6ygcI5iD9%v(Jv4Z)1{}fg{QpZ}XkgugWI4OWuo-W( z9&b`O=>y5Znt;T@^JuFvc`ZXrCveXf#~qcQZ-T3)U_Pgl^+o!Ud9(E(iJ2V(7DLq2 zCcJg-W)h+iCDS>>PCR>Q)+b<&t~g}z_o0R(;>Zw_u&JJH`#(=QfnJlHz^9N!6|ObX zc_F-`wDgzJ%I&*O$LRbffL01^M&*{1MGWiY9*WB4e2w4yGn)S$f?ts|2`c z(rh1w0D@EimEn_KI&cSCVlJn>Jpd^)%w-{XPD~Edl@rebh#cZsXE4PxY39_*?M;MY zfC|MThR@Y3+He9`-_0sM?Ph4sm^pb5EHUkmgr-OIS)`Rej9vDL+sXqsb0ZOCFcN=$ z4}|Ox;+HP6FcKE&U}nbBMB;&C0uD`i|27;FPhlpVDWpV90Tn(b!A~5D?sytuB@%Bo zM2z#^hlX!u|0v-ZMTQXKgNV&}qU1@;ws^Mh!5WNKx0yH?Ee@^x88>BvhqBe)5H7|eS+>Xn#XsLQaGWP zB8V5!&Q>%c5NX=rACOoH=&|dR1DoIx23^HI+GqV)Gvqx6ZMQhXjJ`s~;IN5Kq|vWS%9(EFy|ZL=$Op3z~bliD$w$nQ|N& zd5BalKlBero?DmQAjOzdthdY&ze>u8)t-uJ8MF6U@jx{k6J|qvTewN{kVn z7fGj0r*ysf~XpL0c${KSx7y= zuWOJEBM-#3D%$T1y8t7EHAD{MaRF#A?fl_S2yt0IQLMzVa+povg%4 zT6w^7q4&2&`$^HTvQ=S|0cNt& zWAR_HvOz|78yc2MYqxwQIlFJV*W$=9vN10R%brPeD3JBM6$G-3INV> zxNgl?@4ikROIAtkpI%Ik^obZyMrZU%hn3Q1ZCXjEp|Gj{R~F12SBuvkJRrDQ-@dSLxBNF&Mg7Q1PPc^ z#tl>oR7Y6Pbl(wi;!F{F9vTQ{edi3joEbNJue%-RzS|G}c0$Mj7b70J5@^N~E99Qb z2Gx#%15NXNEZs|fUkf{#sTU9{>ULhN03$l^??YJzCrS>sg=$o3>^b<-WW*frRhp3s z+a>AQ?f>{20x3CA)3Y(RWpVx9dEj}D%Hl$+7#b_&j9v!02Z$Z`X5ATiGbxS{Kd6?_s+h;*;;;R@V=w{vPmfrf z?m^YC-PYP#a@F@%ERh^Km#oJ~9%W{i*%)B1G;2J2;0W5+CGoz}h~T#YL37KGplrqpmCa$vdo zFJ~Xj=YEUZ616D0dt0cE#oTH7D<=r}jgHr)!*J!LVn$j@Lny{LRFC{Ad#cE&uYR@W zt<#YeZnPay&J)p9$7Xu#b;rc$lXNKkT4poAndk^PpgQDl9FS#sAvUr>Ep~ii$+I`v z$u^%PefNJ)S54h3o&&>1)?L&3*j6FYL^P; zhgaK)AENWgvamluXWh7op_MIyySzMxfm%5_2|2ipi+s~wW_NnM%4Yz{BP;p-m8e<} zpSk;3>vChx4qd)bJQ2ajhF&}!4Nx}OgC)HG0K;a&_Z`z?&wU14%cVZ~o{B`X65|p{ zz3_1h%F|_rh(Zn!IVI&;&nYJXqR5Q1j^XAUk%N&B?ZEl|)B5WindJi(($W}g=N-hB z7)%y5giX!RiKk!`3TVCoTkflqV}{;MSp>+8MG`UOE(hz}vLI=2)9&0i z==dT2x34?tXS5fMr4|&>$XYzi-3`N%Jj+V`8EjjIZ9AHz7k06pu#(fp%4QfCR>J03 z0Yl~=rXNf$Z)7OfM9@pAygzwE`+#wbeX9N;mz~7 zhXcUBUeSpv9ib`N#3?!fZ4lNA(~P5&Rs<_kE)Q*-&*e-Kr{7tx?nhx|B#(S!7+-$F z`If|-`A_6>j}O*{KPHSe)qnfc+>lqOL{T3)mGd$Upfs&oRK;)AJ^U-H4*u?t#b3=_ zx@Ox1kL-5YSMj~S{iVhd?i<1&sAqnfzn*Q@3s(Xv=;-4vI`enfK!|(4Dj5zfsn#$`9t zV}$Kmnf1=24j|+A!y@T8W@}Xr;cAOOcHc49rP2po^&8p}svKPJmP5vnSGAjq9o7?a zhu5`GvR(y8p$q?<@M8f?$0Y|Kvn`5SgO9N28GYJ0c6b_#YbnF2vSofp^St1}xcCgo ze%nZnRXCuV?G-`4Vk7jE(=i}LjYiETVpGnsM9e=v0QyaHSNC4M-p|fq8}Qk4t) z)BI+!(PnmHiE!_vr4uEP_TX)99RL`YACgwgS{DN}Jn!6f1*3<2WjzQlme+cu0E-W( zhEocVSXgEU4(XBIT;&6^V**Hc<_-N3mwn{m-OQ31zA0`iKx!kaLgVmReY3IZ6;sZu z2ic3C{QnWUk>aBCKcP{V<2w*_3^HH@r!4EK;o+Mfzbf+SWrg^U{zyeHIa}-;MIxm| zXVw(Qb7ka@&k^bv5+~f;LhymTs}yCONF0h?85oKsy`p=^Php&n$@j}jLq`aIu}mkP zZdJ^R1S70j^X3ZFEb0cR9H5QetQd$=uQX`fDzO8|l)j)ssm&rYjKY zi%#X50P*-}l3k?+H)^)$gV(3OZIeZ$C<#2Nkrvs$F3nVLo?cc`2^x@d1Hf1PS$K~s zvi*O)4ncFiPFtLh%9|#{&n}EY3Jt5)4sQy5`v1 ztzMmz^#_Jj-DY0cOAaMjo`}7ZRQE?F!8pr3bjbkll^YC=BHS$>yEFfcQ7!GQVW$_x z8Z=RqFmB}Amrv*%B}tCG8B^IDM!LdsyGV-k^*cbi#uj5$T;k|_`g?7IXGXR*9A>Hi ze_|gorqo7k;3(;5`>*M2h`p(FQfFt9rJ{)ZB7#3Oo+{WFE1lUCg0g(WP^-}GphTK=u1__wr-H~m%nVRdYy1~gTwd;W`&2lrAH;MZ8ekzx10noE zXv1;~YcV~;I<=#^G3N2~pOne&JOY|7PfbP`UepMCHBym^sABmqD~1oKebS&OyCYU2&}i`}IY7od#f6Y{ndbbkDEM zJy^pa95I_CNzn-q--X0uM|Retkga;SuTJ0vCW2BCbwUOf3=Djv@##vey_PfqQ^UtN z(mFsJ22x7VPyeTIit>|Yl+{X>C-1D@1b62@w)>}VvrRj4giy2(j*DdDk-Ia1)KP{a zAy3$zvfgcnX|Vw}HLB7J)uKRaOWtA6PEfaof;VL>P0;3c%b~bLHDI#gTS)x9&Y~~N zI(RpsiYjs)F%G8$)U`4eb{C+7~@?wS{pe7>M ze9ATsq3DCD`I{`kFza@ODY#jq1FO6~I<_n_B^ATLD?AbPdkn|0Nfi~!R618Yqb1sS zZjg}xss5w!y}!@(p+EvX7p?Wv>O<~2rVhP5W2Z$1Dk4xqVTzY)MItU^sUTZ0%1&>p z(-Y?U2%EcfZyXNFa~o|z5@n6fnD8+W1BQ9!QRZ2}(qIyUq|;{$ovi9jc*`eez@N*m zRA9Y+Q5_B}#N@daN?>aOp6OyoOcFo-p&4-MfQW%fk{3zdm|Vkf4@wS_-sioPV!qw& zPsH@TRFQus?;hkajx)kH0;rNt%O3%`FhAeJz1f*F@y?air;+(wK%Z}#U_-OXYt|z$ zQ&H=N4QAft9k=+!ECm`;7Ix&rU*RzlBuKdy`8E$BY;Az`hI6@@L1_{xWA~a37 zX(PLGva9%P@?{?#FO3;Wm0YStIHmX-5VRv+p-EsVZZ&NVkTJYRM1J6q@!C@CXMU$g zFU7(^zmsD24b-gEE9+_gs5r2PdJ-;MecK@FLlA=Z$rx0Kt+jup|Y(K2N?@{r-OS^H&(y5@u%s^REX^{bl2l- zxGLvjnoRz4)x+IT0CBsU4N8<0J9Tcs=iFMggDA1-;^*0t8*w3mQ#PJun z@+~M~MGf2cFvJ^A11(u8NjZdt5%FOHj}FBH|u19iW z^()h1fs}Mhf0azB7F}Rshze-~LZQc0NA#2Nz4MAMU&114AoRKgak1FHO&kRY&Ojt?8b(y7b{;+ALHD_53K^%YAFPT zKw;NG$aXHFP(-lb5cJ-IWAGa2!8uF3M<9>TSY~=SQZw7vj%OC9`Qn9(6LY$VB8@vN z=Ga~+-ndl4Y3&wm=R%ZDcaUB4`ymgpUejPa;{Va~mT^&i@Avo63?0%9LrW^%-941F zfPADu5TsMOK|s1oC8R-GDG3SbknZlhH{aj?ekSu$nX}K{`<#7UYrWTs%`BB2SPQsg zI!(wiR)VVR&=L}Seo7Cx03${_WJceK0 z{aoAM`7u^8htCqsjoq$s26fH+KBgtB5NNAsdSp&D^(N*5^Rm$VtKIh_Cl&d%2swEd zO}zU8E@>AK&==hnYnnC@o;jRW?*+sdT9qJ(zy|ukQW;*OgzU+Sa};j8Jg2y$yyS>D z^MTb8*XW$-_r#Pi7_e?UOU(IZI{9LXE*4_~ZM!90Hh{857G3f!UwM!+3VKIldjY-Z z;zd790>_YkFUGlyd-y64w!I+8`=cjS{Yh!H*MM(D{|fZdTyT>I`rO?zA9FYx>u7kd z*Cp=AA-NCV2J@JubQZEhSrTFfmf~P-ZiagZ7lpF>1F-+r)#LwT{t^R(lU1&q33 zm&aBQZB5|qff;*NvP}Z#y8j;G%sb?1La0$oEZwK~azl4$w?jVc4xOLaI3^;mmP#Th zomh@A^CM`NTvx~9t(Q`qAfuNuKaM9Hxh;pt-i8DygtMD|IbN_6@l*G7rJxGrer&E% z#ra7w_1!Dc>gVqH{-2{8f}E%*m0EW^gpY5M6-8CXJ&jX6`&}yR#Q!V`v~}D@l=eAY zb@)L7?!wG4<7w#%9se;&J^0N}#W7^9krZ+25<>wWl*xk4&ggM~=%F?A2Qx{|*ivI0 za=}KCH0@?TUE>p!{c zY}KV;2eA?rDpN5=3m6K9KU31u29r}Fw7{q+K=)|GX<+*ZCdlve=ZQyJ00sL`!Sp8~v)m0X2qYgjZP) z$0&2}aO@2h70<9g{S(oyWkbNo_=aZvwCvzkLY&g$5J5lU2bwX7^ZYH>tw+PdH+JI= zmoVJD!$tp@_LcyKg97i5;3vdbBmXI)mF%i!jq@#p!~44@PT5lPF8;2^fmMo-;j*ua z$7BA4+U3W(LqW1{w@MyU_k}H!Kd5+^9#RjybT@TAyl?gzr|F_cJ_+6}Mf)K98dR(7 zofcz&74WP0BOx=cXl*(c=d~8r)IX%#P8Z&gGc?a*6Yx#Kz%3jnN8S_p&yk%?ctwEl zf`U(t`%&M2ZX2S3Dpvg8=Zls}u}An$G%)k_rHZ_Eo88eZQYkp)KlTM~;U`*}wLg4Q zhc_q!13Y!tx0pl|#UZWDN{4&5mss?*KzsZu^M&uj`>yuG96_PwyrC-_2m*)@yGeg8 z3vG4u%ftXxG>)Mk=tME?DuzTqnNzDWVCERvo@=43 zmx!>FRWhvib-pY?!i4zReZ}J`$g4X)0G{k;ww}o8G3Xg?H#eMIBC0F$3iX4Ob6?48 za;kB6orSXe^Jy~#i2j;cl>V-M(OC;H#zwgxg-4!<>^uxsaU_jPOkMfyGBw2dRf4U@ z5G;L_zccmwGkZcmzZ#)Uo{ErRVj7+#C6JmaALhQL1SZu4%j(gw$v>^%dE!&g3QHx0 zuAi(4pox)knFSmN!-s!R0P}JeZ&JM+002A;|G|Slk$ayx5dGVo5q zNQ#a))IWLyQ)c`lI0QQb2LO0+f+JgdDcH12D0(jxI}(YOaiS+C!V}kkG`qH3 zLMN+!nSk8GuE48F!*u>oS>!*7V=7jb$;)c{(eEw#w zok-^W5$uc83>_FKV&PQRct(gpF|~Q;b9Ok(#rQU!X}apM?9;zoxs&-w-NyE_S1#Eb zVcHclb*8e6U<-rZPRZab(KO#J>wmXpI^T|8o~QVs^dRo!R!xpz z?JxoqY0GKJTy9=loj0v8 zDh~p@ zkV>~pxGj(!p@eIF>QnXogZ~@YyjMQk#_j2c-G}sHo2t6cO8cQQVM88=SCxZgHD&!o z$>H$-Nk>PuP=0M`A|@BL1Cv3@<@ul}8YnnvDF>E#(Qm>SWEA*oCYSNeHQ3asN!KSgf$+Ya5*-h@U^^I4?ad{73=`K2Lf+Xx9koE#6O}uUY`B{ zzxV9v$O+mp?-3wRS1-O&a0))@+4^T{Q1z$#HmU|p{-{E6&^c|muQaK<92}d{Z{A$N z%rbqkXlW!6rfS>VtZS=ga@#Dd7S49vA8tvd{F#Qny-^7f;-sYr>)YMvgQ$Olg2oV| zXNuYTM09KE=t#F{C8qS7%Otwkn&F#g5WX3#fo=9L!rPD8dR)%?Ko|nssk&BOZ^Gbn zY=4ND=}S4D5~+{R$cj-*)=J7 z4hu0E{Neq6|27-YYQ^jQoZYy}EOp%ncHU056eityF8gU9I$&j{N_o4Se7J5|4#{A< zR&uzVeR2gOr(f=mR$%ds@g2JoAk#kJ0?TosR2N^W)xXe&SL0)jY?iM7hpr=mJdymS z?T`{THo@Ux#Z)H)+?IR|J^wSIB?eQWpM>}{Cd^%`Htp(+s)WH9yIoF7?BQ#zxqlxz z+A_Dmalc53Rw+JpX1;dNz=?9yO3tux9Gc}4w$mEB23{}$*Lcu|r*BEhgyI&L>L;K^ zfnA30HBEe^YS(q&Jz!)FFXWJZ zCV+NrYLZ1M>*-cmjzi(j5|gmOgJ^BPyq|WHjq`LgE}y6MLGH_{h6cMHD3%=q!8t|^ z13}?P05ifEH64DQYIqqfmE~uxdUO)<=k04WbtQ=BO9~;x#pA`hCj*9Zl(CTEMb#EVWA;9=jmU09Kbu)0ixnLdxHdJXm`6bxA=5SvIo^U9Cqu|WFphDUs zcAIC@`DS!(0-74jFJ3=A`bL~(tbek|v?=J8;MBuNNWg@qnA1!UO-fy+5?ku_4m#?L z2pMhK=kD%1}*4_V!R(%kxlQQ*iaWYbS??#gu`SWsE8bF`*9EHHt zmIW?09{?pdE1{QHcVr_fjl6@GYi6Hp16D=w1EEsMj#V}{DI#RlpK6S(j?p$tn6JY2 zPy@AHoXWv!3=K=DBMXr4D5?9;`6G$8Z3H+GBcl~+^&w=#ozkDw7tr%yjfVesN#{% z3!x%nRFKToxlH}jk+zz?%t)Ts{;Qmjji%qvyTJ85DN~d}sueZ)j#D;FLn6IXyM3K) zt+q#eo!Qt9Ok&68qon5$@VG-(FCdi0J33TI=!*XQW4XM#K$TZaPgK;M%9kQMwyna> z^=kb`Th%WA@)$cliGX>YN0=WH+gFsIh$c_o<$#m6zISnPknR`Z*?d!Atoj9>Z z)G&lQmlh!-Vf>uuojndBwyJ8nzHDzJ(Lb6M-0A`*evu}M9N zLVsximDkZcaYxeH9-FNga>>d%U?Fr4kC{7D6f<%u&~|a*?jWp<8{0NJLm1S zs;^4)pK`O}YB!kG+gL(s$X<3M*@r`8;w#n50rxDnv?2jzn+YDF`!$b9|I4TM3R{;~ zXLwR$w=~w(z`Ro+2A+^&4C^Nm95{rc@1_U|VCq1A7~Ox+J?%vKdt{74OuUHaprEj_7R zBx83#VoYS@ucbWTIL%z03SYMWwmqBYJ61qL)%zf$@G~d&3wW6i2Uv=yP7t{K4)8X} z+NAT;UIh==kPM`()mwmqDkDjHxxlPKE}WLFMyefiNcNY1>9#=PprThw{QaG2idim{ z-w|&_G;3bn3-HqdEy-MI*4of6Ai8aDk>}vzyr}DE*ou~|R0kBjgLrF13d!~B^=t2e znvLYVf2VRmXSHx>E^g<@@zl_7&5Kf|0*ONFt#6-B9(Yd*5!Kzf zFPeG{_*ZU1MpWT6=*7=@$$XvM~em40{v}-mNX|{XSn_iZsIMt*sEWZm>-3A&1Ge_Oler4?zob9?f7jE|a z^|)|`^iFRsiS^0SX+-wOkwW{0)F<&ZUS2wCKr3v{TriXk*2;TmMd*{LlDXTQuKG|yt3|Yy zEC;xk0mcmIz=AEgT8!Oha|qB7;91Z{=_^ZKi!1M*K1LVX#8S$AvS%jWETL>*A^3#xFTRy`#geKP`Ve+G8j}04at^ z(QlC{{5xCjsgs!z2iyY)WZCBOPu+5!4`B~(vzv0y)jRyMLQ0Y=+93}O%$M*3`N=h1 zN(Op@P+&jd25CxQT`^{@6Bho`?Pdy2E%g7(Ky2eswMvs873Y4|_<95f+3{=nCP z#WGZ{e!Tyx!CnLS2RS_gK!VQ{Ge{zA5D_);F7stU&(BtHFalNlk^Yf?Q#!g_ zyWwM?7sGjvAZZfh?1uacR7m542PXLr|0;KhS|>#GTn7dJqOPyB$-sFF-ro(buJ`5p zmE4Ei+SRg{rsHV>6}cUaYK|#$(85)pPW^6Dd4dwnxp+e&6iB!67R0%dve0-vG4SKh z5c`|o39#BiCZ%kGeD)yQW|J4kfb$^$*6~ zFB(t+n3ATWLMY39q#a%|TO;{|o&(wWLo6!jx2!495=65@2jscVj7Xo5ugd`Sz|E3} zZ+NdP=65?_E1In-a$Hy|sV$};YX}C%-AvJzPALXGkjY1PhlZAq-LgERM23DeJ7<8+ z4G1FF1a6rd?vO;dpO;k9swbWGO5LX-NhLi)_H5_jL>cq=mBW{csG_Va)=S z-}}rk)L+lA;#YN;=JkF5yK)jtBFF=kW#k!(lk~-VSmULL+1nNFqaTy`K{?0kBh|2_PV9JZLYZ>Mv-DzX(uWyHIWaFi4 zd`dufPfT3(B%^kFIz{i<-r_yg1@S4CmD~*%hNX5B3aeH08s7DY0U_zimO`)ARO?*H zugUXn*_Hl7%LLDCS9rFdy8<@iAEDFd=Ke?T%FhYb{^Knd^CPmFVl-8FwpAl_ghG8^ za&5xo4aNdRD!^wcieZ7!#@JtQ7Aan7G{h~26*ztWc6|Is2xObuH&*!9_-j}=Ry@5* znw(tzomw~6QL)3+)j+oQULv3uV-LLtN>WTOF@WAFh00SFPb<_sn8bE@p8?3etrVaC zE(MP~}yg7Ghd@(xvbMG^6m5z8DOaDH9?=x@i@p|vH1k97Ubl41<} zjAzXipOh2Xx+bP-lG8*H;;6z10#$LAeR!qVqDx_i&-uk*U>Bp(>mnpv<%wydvXVd48n3(<}gA5@wYKJK8z!Bt0jp(3z^BzgsS-d!@z<~v$|fc@sBd31~h4HzLFzn{OaWLKTmhi@JwpCM z9-^C&MK0jb0WmK9k}93&0^Yf1kWV-ET?r@yFwgTw;s08;MB`t6TYl5`EHo>ap407F zUtC!DsBDmhcBUm}nhbP< zPvqCtJ{+#xdsU5I#gg?dVA)fE9pEO@py}nb*3PKlM+wpADfatsgV?N|0l{j=ZD7%k zqCc;B!LNA$v+^}+eKb4Z!BM^Cr`eE9pl@7!54BVLyu0%dYkhLj&caHMG6j5=KbB zG>94XT3cItXO4NTTw91Cgq4Z_S8_O~g7W&Kq-Db7aI0gI?$)$I<+B{z&Rex3a{@_T z{<6K(Pp!Qg&gH_^vOJ$6*b#mOmg5*9)+^Bv8KMlFIw1hd=Qi>WQ6>W9J=d-D;oiVu zH7V=;ehZn%5I`=X?{t9ooTEisN`hLizN|5NchIlzRmI~uqYXtA!jE!JjvT?akFtSO zADBR}8hI<8)ybg$v<{bNzhf}051$D-K=}3f@i7ZU4U9!4yxg~qg^cyTv4lqjsbt~4 zm9vPGLksY>_GBC&t8(rikq<&?6%%7)I3yhVKu>2P43pL_+BUPwxFglw(Y*1w4~eR? zb{_$NO?06H$L8^9_cLnRFk9TwPXP|~%3pMINwCjAn+;-3#FEAEKSchXiCiae==sW8 z(@PbY8$7z6B5;W5L@cH0M8G(R!t-NlIlTs1kJzJI+b9{s>f9JqoFa%oG{3|^I3Yk zz1FdbM&n7Z$%K_R=BA3+oOP-3ahv@2m=PS2p94Z)A*qB2`_UW;u{L?Q*jPxw=CNXZ zDm&38D%^-Qi=Ef>jB3p2VJn&=WB!qBW%ijoQquwTQ?hYNc>3 zcowp$yrTF^DaMDvBy&0{lcT5YD7IOW6u|xsvLxAB5wR!*u&pp0 z*})Qev_u9fIE)A;&c*gbm*e(R*{n`hZv*c>+aq^FHJBtKeW-Qini_rdzOYcWkT{|) zhS1WES8JFY%R$%;s34HOM@tyw0F6m6O-N3))u&#~WqeZFHN<>IXqMs?s~C5PHo&Htl58Wb{y5)pI&mKL?I*UDyWKrQM>~Sx z1gY0=#tx%h8idhOF(zkB&5WAb$d>aZYJ?rS;V`OqTk~cRk^aNa-(9Ovo*IBZf4B|H z6JP~X`l4tm=>4(giCaCYL^_u;1sN_q10{sQYH_EaeJ?F6HHwDd!4sD{Uy@RNrx){v5&H>;E3S9hy-|%WMo*jvFA!V| zJ%G*z1Zfd&=zYOpYZS%miyO}=lLS2X=RjW zLt<=OB6LKhY;fYGI1xYs8h^a9v7ecQ_P)5&vn#G~`6~JDdBIH5TyW$a)5YFL(5~Tb z7bJ}I34kQt27#Bc1e!-GwYFwSvQAm~XS*v^;*FtWvWlcwjih;5c-CFvBF9CRys`7y z6HYtbha;_!O+RgHh~{~JdONFRcC)3Q`cxaP5Qk~TC(JlFF^5b0satIh#tJ7TSoqy{ z5QNhQbGBS)bQmkI(9AEbK)|zT`Ql7atos$mAb(&Pxu98NO8s@{frx;(3e8wQ+#?OH zcFAbW`bCM`gx1F6Lrxr)`Co*zwuAiu#?o*0y@r8I7QCJaiL42pqMGT*?jL!ysvbwR zatJ-?vC=-dfx`ZT0iihG!5h%Iv#v-O~&3ns-_Y(?n04NZ#piZ3R95V!{O&|dl>wJ!V)y?H1(q+xrq^Ej_j9!QDKTb+WTlNDW1-s#ysa^JJt z^1`3cz~9$W?}9ZDFk_N)fXYl%%GUpbK(1lA{);zQ^4c{}Wl>3@By9&04xaYYju#VR zG?<9GVkCa{u!V3;G-)fM(($>y)eV`~=gKfrVxCMh0VeO1oj=yE%Zohwl-pdhy_bWPG^@iT zG0T8VJCX5w1UJBxiX1gdE1j+W$$kxz3*YMIz@WcoDd4I{q|s{_W^Jf2ra}8VKWA<0 zt=~(?DQ?z!NcBDR=Cm6RhWSf78gmN{qnWoFSr zN`B}mo&+QF`iqk0fjq7uKAYRLnoZ)gciz!0&ddAqdV%sh?aZ#Z{o>EzWbNv|UhqBz zk722N{BK9Ym|gR;s@wW%hpb>K8XkhAZt8Sh^s zi4M-LtYrMWes@frdEM`od7a^Wa6)`Y%cHfcs7c#pl^J{gB2F-tU@Gc-MrJ;9fK84~3NFc8qdpCu zCX5+C60p+GoXVV^HNRK(Z;j{yf3k z4D+|Vd0vi9*5#JpgPv%+r0!Mt%&YK8^VfIv-Ud1X*NiL3ietMV0IOCesi=GOm}yw( zRKNm^GblJJXX?Ge(4RzRq#nAI2ae|6^!9!tS*4w22fXvrf%=9=?4hqT%fN$Ejh@W# zN%-APabc~af#6YF|2`%nj3lHgw^P>hshvFVpyM+I7QxN1j)_kf4uebql4yV#m%nCa zi|x*jpm^Q;dMZLG98)SelmQbl5MsNo^KW2V2XI&R5^Ad75xktFLN#2lt3XYO(S)=0 z!{G^5C{JC~B7D{4htSS%Ip2^3Ihi@gVpmh|8Z~lbk%hul+1XRs7@VD#B*d$S7Cj}1 zV>6?Sa9hKH%H!>24WP$h5VQhMs{IA3?=N=b?+C$D`Vn`fk6L<1DJdHNJ{c9?3~w`8 z8lG=5NYFC!8GI4@QkJny{N}b0OXJ6N9<8L1jRoMsKhK$9E=6R_PncVuTHZ%!8Em

    B3hU_(szYBeosEit&zX`nBOM1zH4&SsPyY|i;A!djSMM{~BF~iIK z%0;1MVtikwT--nMbBO!fsX_rs^z5ioP}$AqOc(PEkBXkf{Q$Z>Xfp4g(x&2k;F^GY zJd<5O!(t#4rU^rjxLYBwn@*&OhpAA+&n8v~ASmsB*ze2rvgYQ#%!5G*JjDvtbpwt3 z5&I)zm}+Mz4$&Zum6s5R#<|-z0u8<^R8xJ0tpGUck0>l^WqHhx#4DJp(b+w#ZCIqT zqqWwRD3;O$Q6Wd;e7o@pE+609iyM@7`h?dUrqQCu0!qTa4cZp5QJyfcmeePirsP~- zlk`a4>lzf^JP##Y8mc%IKsli@&A!}MU_prULwcVg%6Odqk*h$A37p6&M4Vh_VA%R1;C>1CG{mg?7z--if%R7M>-L9n7%9k# zYm9wPlk(;%ZsTl_C8~%f+)31l(pE=KK7zi0kV5gc{H4hY3s>F41ey&iucY~)b839y zR4Rg~pO`g2ycg|+)&?m@p5n&52qL+!0dXD$;wZUKW`W{_m=pcv4ExBpZt!wRXOsU6 zYcFsojEWuJSW&Qo0kft*usHTo{l!(jDk-LWgpZz;3R<`g&-m4D%v!3r%8e*$-vwN8 zW&|e+pm9iF-4c!BDY}#Oa~)jvkzhri!PhXapwkLZgHk3)KSvN5nX9`0`J3GF2-2PH zsGwdho61z_*yn=>L8$-r_u3hxwSEB|#`G#-mS>;Y7`26GFYAIQPV%8An+w+NsO_<{Y}5yX zr$g-)I(`6KsaC5B=#U^yAxKti`>-&DvO zRgFDrZZk-*!-~h4cxR}n{;IHz^5Idu$igy9bW z=`L9}n3Akwr z!29Ukbad*=bL+dDHS>5N(hfR~dF1PfX3~5+1b?PgADTI$fq`SS<#O@kuQCcz0ceL8 zibgymE;!{h)SR%^ir*7T`9c1F1oH^khVvS)HrB*53sIBi#>+alrvIXcsJK0wSqCQH z*8tNn+t?G*ys@xiO5|CEBve?~n%c(^3WU!@Q$InwK2;OSp>5q8kcHI{yXpTdFgv&;xhJ5aBI-+<7CRBKE6 ze^^$sh}?0u#1(BQS?Ar2tTT2oyNdU#<_jGy7eqMhk;zwUDdzz=Ftyy6P{;F zunQp=D!&%4GXmzP(l0(3DLQSe6JLP=4+)a_q@sFQ}r8EJl7}$z{*gGF`tqc-9Bi<-CbP|ilAH| zM!f6>GNJ`%`+rHVq2!jFODA({PM`(!*>k(V5A`mo`mOe+L}}yxF&4g-&z4n~dwJZ0 z0N^E0UD=G2j$t<)0HJT){YuVWo0Vxyo1<;7vN;b0q!TR5&~r z*U0jU;-+8GtM%cE@nPT8`$CXd#41LrvCedOd~D}KdHUCB;$wl1lpXfl_*ud0gyvJA zU?9~yNH_;T8CwEm=Y#so-!S^;;&E3KImQ+58~+K_?t77`sS%F4HA!qq>x@gCU0+#K zI(p(Pd^Fu$dQirTrDZCeSmHqFkC|sfzw@35%wLB@^a(;~q;&1!0rUu6$cn*zQi#=Gj{XskL)K~Z!O;~xQlSR&voJG2(R0@LjMhQk>i~BYewev zZA{#J2xOY3(&riL`9!Bnoc#xChn83I02x%l*m=I$1Q-P$#o}$a0;3x4tgTrSVyC=r zLts$O#(PFM|D*p3zu}m5$R?taSv^Xet_1+=_*^c|Igcl=iJbl(Up!12{&OsYD~>~3 zcAUUG&o1vdiSj3)bhhl!sMfqk0rTR93}QF zlb`$eP}}|Yrw$N^dikd=9l~1j351&D$u(1TRJmN2va{oPzrULWYYYLg=oT1rVenkL z=6eZ<(l(l3nHuvo)NUFX5oS>26xj``GEJ%c?Wh6I-h6$XGUu@6{y(I90 zZ@-x>knqkN|69nSNErOOvq4b>4Rh61-pf*4^t&YUb2iDiw?*z_D^bXXRJDhEp+B~^3;tKrfHn6cr4LwVzDRy2n53O}ZVzvYe{hd){)7rp&xCis@n=`}HeMj-XToXn zub=r_5aNXtH;ft8E*IwX+9OQs@eyInpiD8{zNEX7*lvR5N$ej@t7JBR_VinVh#trW+? zpQC)HtZB%Uz>~QINkjQ^cyi7*-N%=6+PEqR^ zhxdk~iuCthDmLx)m;RiTfn$#j4$43x-7&$Jj)DhbGoC3b#aw@{3Z;n}*ZSI>TudV6 zR~b60`g!cRe%C6zk$HX+Le(JF7WT}#D|K!PKYYkn7!T|uss6>j11yTENxqrQ@V{wi zdvOg^I)12$7H6K<|1W$~Z{6LYH^mXuRqvNhy;evAzUk{1{8J#I{cgsO(|$=&`(v}r z@+raK$Zzk_+f>76qeChOBifj;aZTX~5)QxyNwBSV6;EP`KVPR*fng*SRe=%ur)du_ zxBuf44D}MchhQM#a-JW6kl#Njp?T#t4@MMXH&KmeV}lUS#A)kLoe-@-kQ@A&JSaX! zSJm4?xHQo-gPzVMsKV^N3RAMtG6Y0{S4emF#Yw`@B@OZiHA8h)M-yO^D%#(%MzB$7 z-7S(sep5EP28E}|F`I7&_gf^zi|tW6fWX@J^da%2A!@Sy%d*_T6p|7LM`XfDUrD*o zH6qgGTOd|p8fi602LZR9t?H2ym`i0xEuf&^H9FqzZ3sq9AM ziVb6XLHO0x{Ye@gZwA6GmhOduliIE5r8=C}{w++uri%QHo&)ls^5&X!+*l%<+bg-Z zGurK*BxBoS7zJ`)zaq1AgCM}0Q&if=4jemzLYL7($Iq0z<-}L7qZ3E+4qiPJw$!@I zr9hxghtpv||29cr0k_jB-vlOtjD;%Ff2CbtK%wV5;IQYMrOt3sfX%n(mUF3_L@Qst zzpt#ZQE)q|+_@V;RQfdGKlHw%2>+#;oVSvQs*_8qXicUG|0H=3I5~5O`qERCCGulg z%Y}J3J!xHNS%(U3=kbe8W0mKvqVts*l9d%jY3on|9OjB2b~_lwGER{>umAMK&u|$j z`cp#POWT7;U0CYOZv$WmUIbQAHU=&u-g*81MMXtr0s81t2nn}=7H#w$qyvUf?(<>W z=l+B3qlS){?eT7iL)v>79L@2luwJtrFZh; zD{zI6z>|^8nYfI$F78zc@R(cOjI2K<{2kYj*q;;CnDR@H?CFNl8U@9S^|BDoe!h^f z`0rbZW0S2u^ZZ+*QABaSNBB&R<-0fV?@7_Il^~jSkfC|CGJ>cyWLuv zA`=RL-ZUGZR3LKv(W9g9|88n!+I?#j-#eFAd*6R(z$SW)F}On9&eTV#RLKAOhtt*0 z+r^DXB6)Cuwg{i&@8B-9BR|k+UERz16PmS!h_jTn+QOLsrc~a)et2g5zck46qPzCZ#XQp2N43fET4^v-_`7PGyVTSQ%sGZ57!5XYB4=VsHbHfM3K zZ?R(8eoR%FeoX^5Vh(3h6nb%bi4Qp{btC{&82Q_zUPS3VMj37Zt%Qke0yx~YDoM@; z=ZR~|5>o4F%Dn_i=h%?}8M)O%7CPJIwwy2J-A^|d)2S}<(L!_IkP&?()zBB{#OB{m z`C}@Lyr~={wyeitVG(Yg&_V% zZ6w5K!Ig-KxhMcXUS5st6YMiX>yWjh%kj&lX=mkbRbAUTsn(<>SeDuR^zgrY|N|zcLU9IqVgl9hPEPU_B7uQ5nlPx!X z_pZ&2kvQ6mpj2#x3nf-KKq#k~0CSdLhpk){Ukj$XE(Gv@es@P%1Cj)HV18+TShsSQ zlmA7Q{}AAf){R}%2~Cq(FLd~xQ^J*G_{IK`A`r+T;8j)HlVsOggI2wL zu9FU2cl0IplDxoZaegX#OIk|(a96IP?EB!)1dU%(D74w3dHm)``mZS*&uZvTQIg{` z0$MRb+UwtIhxcPj0yhJvH=knDmc7l^{B-p=3BR$Ysw-ol$=XAlSp%>sT9@v({uB^8 z+@L`H9>?(YWj;ZuXqB`r6hk4a^qdIq*V3$z^|?gQPd7I^dh^iRG=X`7zU>s$}7 zwAyT|R@tA5^=p3p6?3_HC$M3~RN&&gB9b0Isc#|f@F;5=e(H$-aQ!1K;Zs-vuahnc zo;r&1VBSlkKzC&A?aie@($%hCV@I$v`q0Z{w1&SXyL}hkv(>7-R?jKweAq^$_4VgZ znr~MAvc~Ph#Zvw0O~UPw3+U@FxZcpO4%M6Y+?Ai0qr?~m&eL6NA_#_B2fnX!$d(WJ z2Ts`MFKpYjS#K{P;AzV`a9?%uSx5NSk_5$XNt%y<>r`8hbNx!8mS!<_Rh{MrrIz}Z z-E>jsP(JGm^I1QM!o@n3$G_DI1ju)%jF9yy;+1`>+bXL;5uWhpDGzA7h!8!qFDEal zAqF+;R7-pmU#??p(w=zUZKEz3~&&GjH0`#gzG+D+W-Sp7O0YT7)BNS?*p5 zyRgkhBZ05A9e0_O({MeWA~s_wXz1`B`9bR!K2>bX-K@0BOW!RLa|tc)p6;PdG2Upd zGWD&bksEWJxT&y-xy#uM@iWY{QDzzv+%4@%n*W}CLO8nA zi9b`R>?%9j9CuY=hUl9jKxS*)+8Cq~$(B{R6ZN1mD*o(t8UbNT${rMwwJuv@eQq#y zxeQxR!s0#cC-*0Jo`zpIY(wpJaljhk%^CxcDl@{QeZ^d9_GWP}LSb!DXlID8n-$Z- zM^J-@ovZJiOj8?xQRVZ}%kbv{Ql6In>)jfoHIBsVQRkAF2;CXy4&uYsU?@5W||qxePLf@~fcA-kN%bqo>!GB5#O zgDccrnO(|#tuSXm@Px(>8^R6rSoV&yM2*>^H2ewEUu=H}mkyoL&Ty7(Cnhyo%8By! zD;AiY`n9#g;4BEj^5;20ke++P~FG8ZjM*)&R4T0jY22KwV}ROe(K za*@~b*R9^hl`UAS6Kf|yC>kP_yg-ZTON#)HVMh4#im-=SmCBEctIs~kIekaME7l%A zA8+z#N*tX>EAfJ*#h)cxzO2n)6Y4LNQWSs!$%gk*5d+eP!7)aZVmnIUHPs=Y&0-!D zO-acb%Fb@}FJUkyI=l4RX)dcM=XTd6@&m6hkO1e_956%3w^cO!026vzJzt=XM((jM zF{vH52D$H0=bQ$exs9=+oIqjcgzf0QYppE@ZRDm7`Ke<9;UXXUiR5Krn@^SK$wfVi zsdG7raAd=)^lGF$BBw&#x)ugX7ITU%CAd(posqW1JZ3{uR3Nq4-t&91{uR#yLjV&yOpN}i}&2KRuXCgzz)1EWL zX~|tM%kY)UJX2ARbY7uL8x+BS7LNx_z+(O`xi?+?W~^ITA?Oo-=fVT-oz$0BF`}nC zNeEC{g!izmC4tprg%3B33&@H|T=$zvVrpv^W8)`wn8)wmA;r`3s3X^Fo(IkfoabCz zsrHnp%KW@>+=;?^@VPn%L+A60AIw!Gkqe8PQ7-e#QwcfE*hwyNMPK2qXqd#fOO#tB z$a&$7tp{sIaI#!OdI#hjc8wc)zqiULA#@FcMR5Mn*j!wP;Kd_ux7O^jA}0j1;g^7i z@e|S=K%P_^?{wr>R&M1^et4dW-01(bbeyb8B={lCes7XN&2Uo>hs;HSg zZM}l@+fc~OVj@38-w5nXeZNFxgP2a}PF4#mlO6=gKIh)xTuHCMEr(PjgeOfPc+vsF z?i6J^ucaEMY_wxu1r*Zi=4doWh%sCL^sHk88XpZ_x1>f^Og^*zvazL6e{GeEfkUeQ z;`-ue|G`SjRU8GVR+rgEN(~zVCoYaxYNzm*d%F9BV9fW(J53U*YH1gPJy_cxgS@KfI7A^Zvp+?qSURTC-SOl0l4m{DYm6@&xl<&qO>jdutl!+TFZayjDn| zlyLt-yL+R>B2*9}=TsKnayBG|?*IJDJ0*+z<~1Ni1^|~0pm%m{(kQ%|EnbDU(1F_1lF2n)?4rNO<*$SWQu z#B4^3zhtqzxqCNv9_t9~&8S!9lz(srzD)?@pp5v9 z$RLT81(B38%Y$kjU4?U^y*r%LTBoBZ6VRKasT#sR#tE=$D}m>?(i!kfPY zD+-HdfOVvu)m~;?yJ;0*-D9$}LmWmtc|2niGU6WInCvvJJacoDk{H;-LSi2@fl|fW z?AJ#?|3bt6$odGV0XYU)%#&X!z)9b@tPY`&ruB8G>ITVzuu$V`EpO)3dzun9ezQn1 z9c>x1uXu>^P&9z}1QJ zE)H{`h-2gV_5F*_+wa>@el^G(e<^G zM~Y=r(E?PS)Zl&>yy0tKF%_u(jJCn?b`rtKki{zA*XWl=DJ$@>1|4m5XH`m0le1@& zN>cxk)y~_?c375wU#BBJv$D@YIkn|Uu6K3lE7`t8V?G4Vw=zYWhF*kXqo?x&W#VD^ zb(q5T!6}AH@!Si<4>G zUEr;q-Q?*WwEBSWaJBr3<4qy^^uyPnI>YoxL#D{`J0+xRh)4;=aQFNSE_-Khwk%Vl zbYS_f%4^#`|MNBA8N#Jlbw{R+C;JiYuS|px1??e{sHo+JP7Y`@eM(9uIh0LJB|1Agun*VxaUE zw8-4rDq4qse!oV+7Xi50Z2ZphJaQcoVi_X>VJ^M05$}@?bToFE)hT}8m~ZP4BAS%_ zSpP;lc@H9GmB)Pil=hrK0mRJZ zC#nakzqP1QanYGNs;G6XPY3kobv14pTE7kaws;@SUe?Ux1h?9*%4(H@ecX0t* zL4Ge8Rf#T<9)`aq?y2>n-1fc5L5!Kt0B*c0|g--t9?+Wp5pMnYG3-%1;@-dTPe7*P1hhecC0d|eGS z9VU62*S8s;{+0RESB+=@XjFlv2qU73Ssf9i&n0Ad!fZ&CE1W%TtKog1%_eyqF@825 z`D*SLy*rxNCo03)jODsrQnyONB6J|K#{I)$2EWG#p^5QKzZkkR2k>aamCrY>NXrDn z7cq63L`8fWkLZexfoJafZ6{Q`D?6ht^_E&v1w)N$?!4vPr#{CB-fTTue%!FqYUhr%w(3gH2V53$;~PQ zjh%RweYllEZeqeumo&xI56kqTJz;4uUAR30(f}CU@8q}7iYJ|j#9enq?qNAgrTx_m z@*QqNtK8&S{7TL@p|_~rDA_#Y7H8~&n03(jk0E4jsDqMr$n!a)>LQ}=n%rxfRl>We zXO{{SFg?dCJ)?W~IY&XD6~nZPLx!%oUt`UsL;+bp8aD2iQ7skjH?#^W1O{#(I`pY|~E!l+w<9ojmpW zw_J}N&%IZ~I;V8Pl67jSd5B1vt5sA|_rv;MUC8alyU{#bomb~f!`IQ?byIny7U1J8@poZ2d`JL0rxSowuLtgZ{9g&p zvn0rll4m3DZ1M4zV9#072UKqsN5H@D#(^Kl1tLKPTPm@@ZG7w-LpBVa$C^ zU7P?VY`&fttz+;*5a~#Ri8MDO8q*Efb6~*UmKHOj$vwtM=F2nJ)O!T9c zbw(I1uQyB~5)H{$31{UcwgCJUU^rvOYGxHL0lnmdBJ%+m#d7D~fOcI>JjedO`?6-g z0Fh6RNE0+n?IS-e)&TLn`2Q64dN=Pb_7ys;`=o-N(2t&mq)m4 zj?)5O@hs?U@^AsbBQUJ&UEhCa@rNUWaDi_RXM=@I| zDyU~l+BF;dmgNF7t41n0QHqtv4rS5O-2U#(C0mIWUJfRm2=rJMar5eD2Ru2+6Xm7d zsaeD-LnPKb-~n@0l!mTdWT`p(#Y=MjBhX2LfPSv4KtD1#@-ge!028v?@PjI{5`f^a z;B8I-vX)$L7km$9@Rx6+1ue$_riU3&$8uzg{0S}h^TWZHBnGMxEKG#i4{JJSkA3n$VHP6~!DiRf#L|;;-mP}EKY8ar51@cL9rh0n z)M9Bf$)71uUkt)Gb)G7DRsNAQBEzykk(2$KhE+F(8JD)f#)Yq%uJP2fzp;48>FOcT_KNZFX^W$yFBJJ0Q-LSI{gDGACEzwba7!l#ZOpU~yT77pOk zzC+P?5M0x&(kBVRZ(WNsi7Z=yf`uXWNPD$dR^1T|qBZdDm#dMpoOYiJIO0-Yo%V|a zY;l4lu5>W z#w{bA0_q|B`0E$HnLHnR$1~ts`1p_fTWC%MUWQ?_SAM`bI`RPxITud zbdw%ly>eJ=h`msQfFuOaL+G+*<=>zC%9OWp;-Tl$z5AJ+7@{P**;64UMvd$Zq7cy}Yc}$*AL? zAoF%nwnu)g^q|+Pica9w1PzIGC*ZIxa6rVD*}@H^o4&<3gx9a8&twIioNq00W9M*l zA^CZT4>{CqIV|C-tnbxId7rKRdvMgKhBTLGsaoO059HCy2?WOhFd5tMt;W!_(yzXH z3m8%XFa=>Ad#ey&_1=xC2X_u=XK;F@OnE_gep3O=jGK%ZIT&}%!g3`zcCFsEW-SKP z$+VV`U2G)f$JuE+*C0Y8PGxNcR^1isW9Xlom;28(qjSOZW80gCdwFWBemt?%9BI=l zZwEF$>JsaHj$%M9*ZS@QFABz|ug$zaF#zg9fqb^(kURPP2lK`8qW;5_7{Ep^N^L^V zQkbJv)^lnh@sBq(0O4K(RvAzLa44fkoB?i3(VG)%nmedVAZ;x;wdi~+}@`s)<-H3nMe}z}f@p*rv6*0C1vPWu^F5)aj}ydTEhq2tkYPcL2I{FeyEYW!Zri zo$n5%zj1YxT6I1dCevI!MugQFyjzcB9Gg;Eq{$C>ko)6%1A5w}cd?s;k%2NN|Jm-& z_?X{T=^G+@(xt@N=4JtsKMPM!AJ|6ajs-Id^~L#IYZ&cwN=lTd=Nfd$I`wu#wf1?c z**^-vdi|H>qv#LY;RQHe=c7dU6%TbZq9EOC4|P56gFVKTR-;yU;Vi&t2gvN;Yw*hL zs`Kpad27%E8uN}PzD+NFJc$12Q9R+|^%zXV{28aDV;ZboSgrK>pJ6t$&!;ZoY?EF* zBT5rX{{qU_iLb4UR0^9WX*E9#Y8E%~)Y3eQLHbg#-%JKX-q+ya`E0%+9|Cps%*7#e z2LWfTeE0n%YxugC{Uk1Tu{?pv0r0E(G5Fx#EPMiQ#j~2|e>-ubtemAh%tV}Sj;3r? zk~*CJ@m7@^wlDVfqicB}oCxpYM4EpwhlbtpH+{_kYr%oT3&6i+H^FVszpOd@?@-j@ zxaj#KKh9~$%iI;Y7FF}VA!e zDm`SyVWK`Y&7W%XNjaPXwBHr=tO1Gn6LQPRqrYYNwPAZn@Nf(1a@I>T%x=DzguGus zZ;LC2s@TDXZJ*B$|NHIB(f>Z%sPzp+kAK}I$-un%zb1lo! zpc7I5S+GExsW|Lje~6lfio{P1I(<5MQqtjW$!d`afA-o$cH!RvHc3l!GCnhI8(=bt zc~q#kklIjT$?KKJckth)*=sXt-hbjio^TF=)_@k@S*&b?Yj1~^6M6OE&&US;BNu@@ zm)C<|cjs&8uo+(gEdlJm-%kX7agSx^;}YXDBBid9URrU)pd_Q zjWXW$N+lOLNx!B>NV|SgJl!he3b=-QK|I#RmMLF`14I@4{b^;_P07= zAsRH5`YTj&O{gUK$-_=`a7kvseyIX3nHXBkvIUwZU>jC;lbRURlpyI0m5b14a4}J~ z5D$8J#S&$N01?IWJc|H_nialxkdqFHl=cIy%71ClU#u#Oqorvu3&2L@<$A za?t_Qm%fSLgn>N;)fhi~p3QFMI2tW>fTJ?pL}$R@qw?$8UjnazNf`RX20WPatUwRh z3kZgOs`LAR?`M|(VO+`;acJEgzgQSv_g;yVa7l316;a-Kw!s)Cszi1m-5*1=Qb}qzC*j?1wiUdvE(a(#`l*f=Ip+(FWn*Li(Z&5*o z#OM|1JM(Ayb*BH8J-^>y5=9PW+Snfl^7<>eUj+h+kBu&3?q{AN82wHB2$vQ<_7KQu>`Ox`1wgzi`(AA#YAh@4#G<0z?KdD`Q?SVykP*Ghc#M z9+1+J4EuCXHa4ba>TAT|;hF}XzyI!FMa!&;zqqv&ux-P4!Hx?-gP^e@c%CTltR8DP za$1dgUgK3zcC2V4s%d6739C{9YVK$m79tZDaoU%XFXZuV5Wfl+cQ68W{zKy`wO=KZ zdyCM2HeY_G5o{^=K7GIL*Q`bvJ>`}by0wNUikqqXuec`Pf!3QqGrx{F5J)seD&%3g z!Hi4>adHX){Ky#j08&AcCc}-&h9qX|hb#HZ!t(j@D47xH+|j1LusEz~mWIC4=lj5o z@+RwY01c&b6z@no$<#J4cbK4KKm}crbqvl%i9Si)?VA#-2)p8jyj2Kb{$rR0z8%pv zXH_##$EAGKGUX{2GY4~a@LC`(fNnBz{l0twOZT|>cirkJ_+StgD*D0d07Jj9t+3|S z$;1$?&Ax<@R^euD!DYzc=qWm3w%iAFe+lghpOXQjE*X&BJ2 z&-P-k%;zZfFBi23onz15r+PR51-wtfmD_tWj+7!X0OB^}{^4UX=)+NYu_yc7cCbcS zzWS%K67oNT7?aFM4?Lh?{AX8LoQ1_Q6@>1Gz`1RzU^jb}Z2pB=Z2`^fLJhn2H+)I_ zXUd~KUj9Z~8f9FRN8xe`YMtGgj^}y&af!Hdfgs?VRjAg2**lmU1sakk7m%UIclW6Q zt%z|8=&tsarV-|rhIS=>|9N__uPHHOk0tVWoeoNjD7^tWhZ|oItQM-Y1U47y6V12x z<7K0y7wRY5aJkEt&SsydBGh91kO=~0t?sX6&?Ly(j*v>N;OQ2$%;bGIT@lJbKyGFU zcq|)_rYs^ejX*#`` z7eFARcOwKhJqR&@am7wO;3{LjLO6bC_q&}3Tl9kP~_t=+*^amue9bn4^1jua-$)3HElxl5jD)u9vvj2ix zWv;`NMQyCfGWKHCkxHPLmRoc9c=jA}Lyx7av0=oa>Z1bvJe*({g!d&?Es}aKO;NDA z#og%9AO*D?u(e1)E3jQa?E_5bHO3fD6fAYmoVAxT(fpnd2_A}a-+pN}yt{8^i<|xG zwZIe^s($4$hl2+5@3U=%QLItA58IPfwtBj69-anl@R<1-Qf$?>Qa1`E*F&%i zzgiD^=ZjA_-eJRSLxj~YCB{M%qjY8fm)FyyiF{ZyK$cH!=t3>jXI;gfFa;;eXW$G?gcp_a4gsg}nGgMX7fU=S#IwXL{2nAtnJ5#0`}pM2 zONt=7-=`~0BUW06sCtNu_>E<(h~~?hcQUhoH=lPvjS3U%7gu;LZVs7qD&g*FPGg&? zljig4&w*V5Hc@feyP#BAhM$?wo%iPJdR$v199w@<^VJ-CH3GdhiLqmwZvu#q*1Nx> ztj{ow^xTN>qPahJ@=RM)`<&=}4y;8DNMA~6RT##QZ zwU!5MDS(`jsCZZotIh;$T;aWdzfhzb0zLv<&Ijla8hg&3Tv=*V9yt*nRRyRY-VPd5 zXMR&$BH+Ja%sHAXKo97&DVT#27nn*{9A|eDiC%Nv-7je07$gk@&LD}=NnF7T6O)sL z4fp7U2)!<;R)^{;{rXJak2;>07`2WO|B}8I_F2>As&o&JI|X=ou_mWh|l zb8WRkKD{F4b3Z5yq(v3jY}c6K9XqacVt1Az0iyEYpl^@-i_gjOOSO*q-rz!lQOh}C zF(kIUNlqh*1%=sE0!Ae?;u0iQZ1b=Gb{X0VLXd%4SV(cnjjYb&W+6R0K6;a$kX0Vw zn?26bUSB~i1XTtet2bn>jWuFu&{38OrYzxN+%1uk`@KtkDIJiHwG*~xKs^) zXlk&}`8Bd!Oruy4q8^;j+cdPXM^}UTBaJHN!8BnQ@#HlQ3Nor2_kiG`gdmmI?Nlu@|uS7cR2O1`PTjmYYm5gHPf#x3wbN^9(i>4qrb% ztB~mw+q>(xRrmv3iZ2t4EaM#XKOsWrjv1IZ=;KwCT`vLqah|_^2uzWeumMlcE_CP4 zi_+Gkd#8RN@d);!)r`V3Ljj4xEb+hvk^nZh(h?pX1lD@fWvFP-ifS5@^4Jw9+dEioce=TIpn|s0Rw!-I)Z?4&fx*1{bj#v0JvF z8vB%%(_k|3AjWm*LSYjd<(R=_nYG}OECU|a>L&>v=SAMeL&P}k)@B;w zXr|DM2I4y89OgEXc87D{@AbMc#z(i|F+U~@w2tfvxJR%PXGiyY2UH_9<=8n2+xSNx zA>&DCW#cYl0_Tpp4hMELYL7vBs7M~zVwcDrz*q2nM+JDVlc%b9A>x0t&jG=NL2tHS zv!Hw<2csjRVaM>WnK6EktaK~(m-2It+v=194~+Du$2va?j9NlAXp2Ya&ex;}Vl_1U z20zFZhvCz%Dm`S}dU(7gY=KMXpix;lopU8v0MT=>7*@{SF1n^7yi=Py5vnJS)2~Qb zb}>iSC~u?~QRR{YAoHWC`l<#@l}p z07B^gF!L7!xS~|ikL#Z+@G4pi*XY&9+mOwyIiWFz?Sb)c#H6WKA_v)f0XU)~TP$@pjEW_s zC^Shs+jJCZnhH%eCARuzfSlR)}sATy8p`5L|UnSnxHWEu3zp(D{fDKfre~g#gzYn}c#p zDjZnF0oLDnBKiDD$h~Js0*&|AmntG$)nBn@fI+PG5)~xqV~e`4Rx1O~X5R5v5)u17 z?_MT@Ga_NhAWn&xGhWo@VtnX1eUt_frSlNhw*ba^{FoARE@uFL?bZ8cZ91Ynapqct z<>Y>lsefG85BQudx&F;icGU3&y% z?IqqptR~8hj8+g+x&a_^YRMmPnNVX!C)>(_B`Xn zg=B(|v}5lhf4nD^4u$B3TST!!2|fTsMDk?6KC6R$B6C3dO!c-s`S#H5g!us!ZdVqr zaZL%z{8+4g)O;PFhUZc_&c;m^@IgbQ#Ezbh(JRba`-qG|R6(N6<2Zd*kfXbP$Nkwn z&*5y5H!z4xl5*E|Yk_r0$Ks~z7K}b$*IsfY3CP$`cW!or{!ia#-6jBN{0wnM%Xw-? znJW}Ny1WF*d`qMsF38DuwhyV%2+s%eel-(m^E~1Jo$?!E4_uFwHU9zW(X4mge^X1! ztG;BtYs-zk!?3W2U6kPA!a5>V-gbulU@Dpnt^PIv{&{;%Wl78|7q@tfi9;smPtPRu z=32-cT7wl?&@@_#7(;Qz@Hb7-SGXF3!@yQSYHhK3ksehSCf0pTsE5sPB1cj-mj6Hs z*$AuqTd6bN^cz25#~r?Zb`@H0^^YB0K;{+*$M;B;0|s$--S=Th-r&4fG194kf$ax3er*PmNnSz{X?&t6o{sJ6Y} z;HR!>0Vj(n;OH~(01)7S&t_!iI%* zFg@3IT%Cq`X*|8aipkKXa}c-dEqca1^Nso6ejo7=W<;h`y3YR5u*8_yTcGO@HDBOo ze$QuJdd@wr{M7!MI6D5{5q*PmelqLdoAXK{RCtv&J?9W{~ z6}e2YUu1|0Nog4z=saVJan>piwF!VafVSlx;JQrOG6&)W({jYSTl(zA8(=0211wE+ z+XeK6y)W}N<`pTDk`$`!6Gd=ZeE?qos+^GO+!B$4Y^acnYwtUISg;ZOK*C1)%X;2Ec}QfU>nz`zYKFu+rmcg<$2AK{^t=Pgr@pETFX>&tVN@0rVs$^=Y_aX4= zrattFp~X;WGX6GGv%?E`cE9+&k(5L|0C-0Jbo|H!1o@K-&gkNJ0hmxiR=E#UmU)R> z8Z^An@*f6M#kTE&gXErV8{E}5yNT_WOWt);IVR|#W&KPH4)`ui)v0VSP5`P9oF3Ba zLq7CDS5ODm?|Q3)*?A}Zx5)b=C4&pob81^kH}moeO+{~8UfZqa($#WA#*OT0?qr~O zE;;E{=O|6S|3#XN^ez@TKY$T0`ihEXB_%o-N0REEc2_f-882Z#MTR4!<-dPN!LQy7 z^8D2e`u~T^fZiv>GHygIYtyf2(4n7ste_y+(yORlCg?O;xj{fP8H^AY&8MiQJArP{ zEHGfd{?Grs-~I@JTX=G1_gbPoT*vRxZ1uA)RfmQ_CVoQ3$q~Jaj~691E=vn;*S+#Z ze3S=!?JoY*xPnG_BX*<>8fFsxq~Cx07X#-_PTSUQTekDq&Ag?4^P+5QZ0P!l1A{Jq z-+eLfruh`Znnf>{p2b`HI}vP!d7jDFIZ`nB!|;uSX7cP_z~=Rq+omJFJC|?Su zY5=m;Q=GUZfX!^pkF&nU zueDKwl&^zzws*5D;Tn(2s#0X~1~otlP>-kF9YF4^(|gFdh+-T`qWAi3ef^(h+CpeT z!7;_^5tH_ePf&GpdB;lw-DtH2^1iA0R*I^=eh@I_In0bv+HU%>fodYN*uEEHem`?l z1pDRBtdxp>RRriL5%I4hSXsB+%p6!0r?Jy_If}tuPu`(I+nX3dazV_lMJ@GA*AIh< zYP$WdrT`lP@JuCcHL}7wG{FtTHACDo_wX%n+Y)iAWnvN~t9aUr(9V}*q4eCcIgl47 zUIEh5m)yQ?@e>X|(toO7-&q~|cA3-2GX`B=is}-te*7XgNn9dCY7R2CL;0${ znVr2KSxScs$04r!9$`il)!gok`Z59pfVnI*Q3-!4j(r*ISVGErAOnkO;rsPZn+PXx z7PgV-MdA+fe?SL^7&p})FbVIz{4tLCbP(TOKuvPA3mewBiIkhmN3lIX9mT~x<}xcR z#8>wYI7lb&&ip;kt|jfkfDW6?p@sVZ3j0e|&IFp$T2zp908klC1WWInCTD>G`pUeq zRKz?N^W7P@v{;L#^p9cjFn%gan60JE}UmJCDHR*|7wH4}FGj@CyBPfD)>_K1HQU`*v1njp|i0UZF0kO-Ws+W=)o zZgN!Ikrx(nwTUz@v#N6EOS}|HtbuwG4!fql{T-W^Z%(z3P=F}pS0+d!rYV=E90-#7 zad_yxnwg9aO8QgAN1Sipz3IMMgK*RfKcCH6y4y*uG+ z$RT!^itGN)r3h#>D10tO155l^pGtt7Ud9(PdoaFG1$;GrH$si^f^Q}Np`$)?0vynt z{y{C58ft4wef9czHuADNa|I}mfbWt-59e5aEV+i#aFXw$5d^5X4ru*wi5bC-`mW#r z5U`@z-dxVyEc$Bu=Cu9uXnWRu%QLBI!X1Dm%uaCQsxJURKI>UVIy6ShLrYrtc=sIA zY#OozY$)5|LGKh@3nnVOQ}jrKET?j4$EM2YMS~QBcw7f%!{-z8D@p`>gMcZB-!9_F zc>L7u#%<-$GAC_zBE{X4w#`5bPuu^g&mX14HW!5#fZ0 z+Ze4@o1aikjHOGhMYZNz5*}itn4WMMj_NCBV+gYZfh^ja1o$H(vq!1$^xu=Xxs^2g z>Cz8>zMfEu4a0>zIlaFweXahpe0SXROs#Wn=W;_G|Fr4fW}#EPh1g!eIP*Ctak2HhG%tP9O~UiC-9E%V%p8-I4g2ENRyH`buJt(F_fiS%zR z95{D)KarIA87we$UadZ|Z!Sj-m>G=g$Jrn~^i6nuLJeoaF`OBJP|%kSH{x!9hM2qi z6u%fWiFruG3runem2`;hiXQm;q8FN%9)eKdBK{%7M-lf&J`V8~IZrt1ASaI$djLgVgI75}w}@4FF_J9khy zfwSL$FzBz`X{O-!v79WCIz^1 zPc59Q$NHDn>7hI^DpI4dW%1NHf#<%X!vz~DEeO2PlE_r^okzc!Cz!B0rs#>YwH8=e z7qz#%!$w6N>z&&joj(0#ew&K(dUd*d^JvNRhIFX-UZ1XI^uisDik-wo6tUu0pW#;H%+yeR>!qj} zCE#lLCiRypTi&F_n5ttbvs*S_s-c-QM~6L zYWdlJm$CvNf_@qEjRxq54vYP7AMvr{r{`2rMBpOZOLxxVLR|y&na}4BQ18meQ{KRv z#-fLnRQH`x%5?+^x`@%aR!5Y&XLnI<%0>`ckwcr!hTkRCo%;#d`UPrP`$FOt)jHf| zLpj@&rS$2K+;H#S=2K@;aNTz>|BPmRC>mPklV&eW3=`F@!ryowFNL>ki!`BLEj`n@WZen@ z#r-Y0K|j!YXHj%V4`@9mt#@j#!#=gR_Rz*;_x!V`bcByL#>dCkz57#XtCMsxi`tg? z#+gTy(!=Wezpx5D*HHx72=InsDl7^|%7O7l<*_X1D4J^svT-y(sclxfwHh~_BdD-P zP^#=g1Cv->LHZd7^bY^I8{XleUydI6B}`b40EW@-0KvXIoW-~}e&8=Cd+gX~bYEI( zv?NUV>K67_@O19xKQ25xOZ}+*Ycu{P)Jt0dr@;6i4@1Q?>HzH|cVIqu@Sh0Y%vL3_ zoK?Ak3B3rRGfAU@awQvCG8JB^JAHlr9|3D8m8|19E5~!Bb@h|Ptsw9Mw+OB+SysgH z*^@qu;`R_e3%{%_YCZQ<{Elz!RbtbZAg!Lq(*(z!_s;faqT9alTbd;vtFR?%dbZ2C zM(*J*k;ic{oh&zE&lJVY$}o^=%REd|y!S$nKh%sw$qc8d#^RXzX-p78kov0TZVwdO z&ByjYCi3{Qwf3J;&u zB%+4Es)g+L2NbuvIAP;_3#d7x$+>q9zeCBNwXy}(@S&B&(EG|OTP}?rQ zlU9{ypI2#5PDJrlQ%8waQ{FM1md7~p;JhwxN&h%)mAJ|IiDdi5xBYR6$a2a{>(JEp zcKoMRdJ(H&dODwnxC_S>dz3duG<J5rm?(2x}e|#zVlum>e?V5^?4U?>_>4+m=91htu|t8 zkQ90FqcM?5->`JyC$vVG?Er zxO>&Z1cv(&`I`VEEonNnq2+NA$;k<=Y}Cd%?@fa6^qcQ%i~->nC2`{m1R?As}2>z|O{K|o@% zGyGs5x4f?j@u*%b^xGJ_Dzr9XJLA0b+@^*HjV?g#!_K!W5^vYRhx|8#YoFK7=3O=s zZJzD@A5MX%zVEtwWmPy*s^Q!1ze0H4$#86||8~}N1aWL!TWvu1%A39|b}Fi_C{YXX z>%pDlMgQ4W@29ZbtQ$cBf=a^=&yK(Zj9V-z?>HXTOX?eLTFU-A;xsfxypdz&{5C_v z5&LyHIXuWx@?*Nz2Bj_>Z_wxwl~cf7`ZL^R%W*mY9*ubV2re4D%pL5(n^d89h3I3e zrl3n3%INlzUgjj4WR-?&}z>hi+Rw_L4e6 zofx_(z4tRNU{z+P&Q9Kb25)@@;rh$1$bX_M5gzltalprao0-8=)*2a^3Bx_Y&kn?-6PiU0PMEbo@xYE%T3 zJSp5n!Qufw2%1GW^asJF-;h|_CbGV>F&J-nX=bbMhFysjYeX90E9|0_*hl_2{;P{< zW_pjbG3D&Fus1^pP*cSXtpj5)4_&31$IwjG&t`Y`vTa_)mAXJatcU5{cw-ceG+n)` z=yCUtCPhtTGVX2i@7oBnNA98W z7jF(0ge5ka0&RRr^(br2`*rn$-e)!&X45$dyMUWkW4^J%mhhPPPEcAb`#$jr=1~&0 zD9&kJA1rWi6+blpFh6( zI9OfT*fkAVk)&f*jeYt18N@wp3>msKk(qUp$I5Oh{2dnu-VNcY8*B2B-#f&aY2VL( z-87n8*2^pBq3rM*{I&)=(PY*{S^uqy28$$7W&q!+A@wR4)Jf?syoyLWOfOmn#W2e{8OLYhN+*-z@v9xCP;mqevfcE%jCMh zz1IE8muE<7=XG=V4+UqA=>x@%0T&lCI9y`NaNNqRh zC|VNh>T5n(;+4?d<0%n(uN~+FY3h~AZm!6y4a+;z*YIV(s@*ngPY33}Hfb?SUV2Q5 zqLJ3K=7T>Ir!;e>3G)*QqbbZ_l|D($%JOxH+ytrZxw161^{WdT)!~xl1Gf*h zX62#L3LKKlSJeMF3|C*MypAkqV9r>*-#mWS?LrTBR4+v?%M!gYJ#%JtJe+a(yR1kC z2{=IoexJ$;Ng)nsa9xUS+5Co^QAU{8GUOg<4AoVTNYH zXUPSv|CIfOJ%rWvNv~VKruLN+K0d{L5E{V6(F`?x_^9j@iEdwUN)S+HFC|x&;>EXe z;xTn+S{G|dhk$o?Mar$&@Za+o1O)YKA5yP0|L^dqx&6Zv@F&y`ev8rmWT%}bzVizc zlmO{0a%KuQgH-mM=}+6A=|8!&@LNjvG-eFfYYBPAN`@>SIGr@IwBd<1okc=^t*9Lj zSBpMgyu-bponB9|$aT|DYK0mtY%3kr4X00c-}I#~e9*_R>8R=&zd(!u)*H7haY^4Z z!!sz~$_B5O&X=mvRNoaQi;b$K@I`ClBm9{*g;6o(#Zn|DQHhe$>DfGGqqq ziUfz{765uKXD?rS2Jt5Mp{Tj*g)@@wcdqMwe$AnU!&L^hkGXQ&p_b4+SEL>C)2dJn z4g0=Kf#~*Kp_i+4LA5YGx2sAcgpKk1+Fnn4C(ihBB53N4KE(E^CXz}Q4n3KN|CUS` zZ~Ws>wL{L<$&P^M=s8oKf)hOMzAm`VH!C?>{eB$-q>P^B_oLaRhp?>{f+6mAHU_or z7NjGDu1eCQL{i7H{rZBXo{buN|Hn-O>t%m!C+xMME1aGu9RRrt&9NOSJ$Z+q_)7@m zdf{EbJJ*JSM)Dt@`8kM9C(>5iR7QFy2l8T<5b;6mtHr_c_wYnyY76-adYky|U}hQSRZMeOYfO`RjJv*G`O^f)Fr+;i*mk z#^HMYhW0Um?1xRD!gg{tFxU+V%FipX{tVBpB8pU&SOn0~m#g(8&8(Y=W>aS&vK--* zhcq+82+65fvuyS70xvs_(zF{>-CqduxYN(kUxT>+uFeL$7M|)$NVUVne$t8=zezLk zAQoG(ZZbX_;zH62&_7qO&SH~|pE04o)rg#%<|mCg^avxDwo6vRTZt8}Te?>q!qD*^ zgaPy+V8rC0j&%%0B!{76|1aZzo}~}M%OzUoebr%Ows6tfdFAj{*8x*L z&Bxbi>!vlo+SK$FT=av=(OBdHVOIyTacE@ z`8B3-wnk?&=BW>J|i&f&b}p4@bz)yHw%v%j6FZl32Js-m65bs1?~HO4xDNd#zyRYPSsL{2?o~%> z4I_zj=N@p+zXP|PN-iF#mA}s4HoR?cdefaY-Y6Hh!d&87^scgP`k(8(ULmn12LczCxlXDNit?Q6G3$DoUPXpE-H9S*Jo=&Ng-@uccnSNQM zHX`xw4n6Mql3u6|9$#_|K0SXTlX>(U7Xjfwzc3%>6gLqE0n1jfa~Q}WBK%o|&mzL2 zwfd4tuq~qA0n1F!_(x;hI||P1EHj$`wfJcfgLvb+lIIRrQ=^ybG$9-PZTa(qfe$>2 zi>O%KTtZX)=xH-HQqIH*Z#jdd)|JHZ4it> zwP3V(><;YDYMwSmt2XX#)I5y@dKI74Yn04lfr`ARAAYX9k%p0TOJQ$pf5$8?X{NJG zp8sP9_wM5^N*~KJ=YU-rEXIF-Q%z#HSiV<&M-%T0=Y%Q@y@TNVRR^#%fzR}akC5j7 zTcj3174x&}OSE9cRZaZ+3b}Ym6|Mk^y_|+zbcOt``lTfpf~CrUJiW7cg>bC(DI*?h zEUIUxd95KYw^**gDkCUdccOkx9+n%O+ccqe(1L2uoI(9f?S zdny3DWhFKStvd1d1fwOQ45!jzS)|~j!=xPy_eM4Z6%^OaAUZW9UVW4Kx3!<9kC5p{ zr}sO>+*gPRpX2EjeTOMgH1M2E^av9BMj1Hki;Gmq(jwiR(%t?@-Arnsl zX1vgM>fDl8^IY~;O7~fhpS{oLhEcr8!k?e^Z@sH*J)~9xp%(WaaOx0#3>z>*Nk)w5 zu!M^7W`WSz5i7nk{ls`7oc*RPq5*1pUw{G3gtVU`oyl>PI#{SuQLmJ?PmC(#pP6h{ zP?qzLut{x-%362|l#T6IC1)Y{Gb}|LsE#8-5U3COF~khFKBJD~beR9nR&;iw^W$58 za`F_1E&-n0Vqv5V_iC1ZOk<6>A-a{*F28?5Hal=M>*$g5H~F7(&PPiZUf(R_)*CNP zQ)Oyf%tZN$rnlQ2_~ONslaySh{HO)uSpCx%xsh8EvLmq=T>05wDBmdXHfLICDyvan za4GDi;mev7^)KY-z-J~1*nocTu_Ue>lH}t<$A-BBaahtOwQzwz_R;yM&A%# zk|WSLvGDPjoeB}Q|xGSAcYMqy@eIck=tp%2VS>_ zuNATV5Li)=or`ljiPHm8V4-IrW0DCy$YUKjSR;jW`|d zn^>~!HX2c8ILSGVATCJtV^N;46#IDz3Y-?I%>w%$?tf!3q2-p#Zz?{;yi<7f2p3M> z9zh=K9qq*;+MlUQ>Mr2;lT}el((%T7aU^}E?InKX= zTJ50GVnXHgi4hNl0qjh&rduD*TPMW3d0i8pAL!riaZ?QFZv;(B$lFNTJq>EwS@&I( z4B~ltOm{II1PouEkLH^_>Yq<-ohTc-)4BC0XPY733cl>=#%+C7U;?uZC7K**@uCEO zb>#R5)u>!s%&khfI&yD|=8pa8Q8yuTJXHf6^i)An>QW^YOf1&@;lSfrndRQY2t^ zl?Y4`w-dWOXoo-X4jBKO@9cNIRz|zZqjsVoVxS%7XT0TsqfEg&&|=`nANzE4Cv*A3 z1~ExOq^^D1K0Sa9zuUk+<2Q)Fo^e3DKycBq@{tg`T@PJ<<X|aQ z>N4W5XNm$B66o_;(Tm;2g8E3#UgaR#H?!$(!V&tSdzN;ucX^ERg9NUQL|;Bk?`}z7 zGWyGB+78-o;R*ni3kW1H8E@?3m@IeqF52;SVw(<+c*NFEbX$FAI+vUDabT`@JEsma z)TI9YvQ=q)=2|GlALQTGWTF~i>rfSeMaA=k&!9I}huqmZ9bON#I1f55^A2>2Nc$5^U zl^O7~b-!BX1%g}X%OigI3`w<%{L3{k9AnW{wR!BzLNh1u9D?ySUep6bjM(LX282e65|<_{to3RP~IhrEe{NAufgiB!lCrr3OW-?pbc$x}W#O zbY8zwsC;0o2CQ%JAATr#^Jhw~4w#UNEkxj<6ORvx{7silU{PJbvc^1kWb+%;uY&n2IBYP5qqGaw9c`RNIwDA|^g00NruMXpKk3$%pD z+)!0id#4qxFA0sWtL@Z?Zuhbs|CXpX!{~$GxzFm~8(vADythBug8otW$B{l0QzO(_ z`cU50{_XMwDL$-J8lZ2!waOivpLG&Qd44ZY7A@bDwHvl{r% z+#%Qh$|&hn=yT`Nn zzlT{5yQx%#Oq3830kxXWUy`J8oiq5Hr4$5S01;DEL)*eA?Vx*Vhk)H+UyGT@g0w2@ zpnrx&Tjg8XN_APY^;s?S1su`~uNcnvvz8jV@o9bF>`2j?<|qv|Kk`k~CQfQnjGN}N#GKr33b z?C)(gEy34SL)e8SnTVipGw6w~-`C;j4GelOWE?OUd#@uR`Z`HQnVZ{yu51as_@+HB z!#-mTVn;GUPt#XLv%%9L8ZZeuxm!SmPdWL}i=ZyCnnxw)AR*#~GE{pHr$~#9`h(1G z%#)HRDif@S*V3?fo+1a^^Wd1V3=NM)vb$a$CC=4q4bsw_GCt$QH~!M`&UArH2J#(J zMFdoxi^;+ra*+KEMYc4h-l^v&Jbx2>yp2%x?>jSGXfNoxPV{m^;}xhE@)WzxC#+=4 zTSxXJi8b}gzVt$%z>Mg6W1=AArVog_!O~-W1A1K*1cz$S9f#N!e~{ zQu2*Ia!;DV5-M#$WRH>FJ^{8hLhiHAxv$BXeRU4N9#o3#+WskL^n z#&F=xE5rYV163>?Xb{p;-O{8UE+$;?s>hMH<3pl}jaWd%F(JTvMgSy54@4cGV49#| z6v{~vseJd>S6&`_|1`@c)EUr=)$pk~W9JiE^l&v|Ro}+C67Bii66xVslYV|1-Wx;1 zqZI`trp}!uHV->WeTNb|r`MMWJmm6`J+L-?eQ| zp!&zo*dv0MqRb`;8A7Lw3ThXKSmH>ftujH5!%Biwwl^mQOuhD4k5`P6@TpXSUtq==ril}yzCjFtjd z#8>1EvH{uZwJ`(SX;@}q(k=iIwI#vb@_}sA=<`^DD&{WGB*t+me(=JF6|V$5{<$7? zG4jzJa@!6M0bGZ(_&?;>5!fh-s06?&!BuJJe3aP6jqk^)s^>{;T z=zEaHiJQF1fZQyA1QWOA`h{hNQ$X7Q7N3Dh6elKMFw?Df%)b^)(62U_z zhR%#mV`qi5bxN;Z0upRNZ2=J`MTwC^im3ch{|JX%`-~vt53YU%A5nw=cig%|O)hf$ zv$(`4867C*Pw~KtwR$S`|0>&y806v5a{oSFpa@4zcVdl5+8lQi4___Dr^io*2<_Yt z#y`I%4+nel!*-yul7YmXX~=Z#FKB4X0DcF>TS{z_^sZXhHfP-^0Izb|SfzeD?I+rJ z?L7^^Qy)eivHOSnDCGPmGfh-(+Yzu4WdZ=$&#IPWX%dl3%p-8nO}HcNwPZDd{?otP zj)@NF_R6(s=l^e2+=r<-WN1}69Vci1{1+Uc*(CNkixSCMhKG19#o(}-;jveBHQ~#-ruIE|1 zb~DqELVPM z3_Z%2H&GQ$jRt$W+Z@F{(Z0#MZTTD_5OGs(mmW}?>T0v_T%@6^Yx8{FaKGrBpdPmH zxRVT#BZWyo+SBmzs+~ow6mXFe$)yrsq%@GlUG$;9P13qV4`Y0JSr7K7k2)ukoOcF$ z%wg34JtR*eBoXPTU0oXyK|r9FH(0GkLLfvFh(kE%r~C# zn`)m?H~hRvX+VqlTQ-Yl9irM7yR_f%? zL69zlb5p9x$h68ZTqh+ZI-F{eQ+4!~x=w=+mWzB>-ys9&iGWF@{w4I}jQYJA?P$Z2 zYD|G5{N`$R&%h{{VZ5Zm#gE#r3beLH}(?@)zN`#cde4Eff`2wVj}#E9R0Lu({h!lFFWY9UKVT{ zToh;-)hW>%#aDkW;2c2r=X8)EY0?xvF~a_EsWHGTe-pgGPN?sadEPETC?)$Z(V9jO zcb%#>N3lo7wo4rrT=tXY`$h;$dyZ`Z(MHKLKY=HD9OxsT`;`wg&~&nJpx96Y<_+UZ zITO5nQj1{qH}pW+`a<;9DB-U*U7 z_E#$k=w}+U{?WOpLSdgE&>c|z1`i#dCfG%$U?Yy?C9zg7FW-D0ezoidbsYe`JrE?P zrqLV7sZ^CL-uGFoWCQ-hP{K4qEOWv42`XU#nv?1M9vih0*DlISZ9hQ6N%+mVR5o;x zo4C&P?=gg`cO;&&=Ow|CV6CS~oZe)qCCVjmKTx z9IO62O#@o~wxrUvDtk`B0q@ph&idN}0|2mhFlo=s0VrOEJTdr9-%X#)^am^MDdaAB z02z|BjPj+XkB%Mkilpf%ZR}R&IiUh7hGH>2Jris7 zH-M6?z*|>$@eg;ot}yFe>SC&Y1eHf5Kjj58>AIEz;q@Wz5F zve52e=HpKF7y(0!i^Qo{L?Ja$pW=Y)?DnyLZX)p{QuhD51_0rmAOB`wZ2Y6)q9`R& zMP#u}0#IPa`gY_bo{HdfxED+Hy!uu~QD9Ntr*Y!wAP$t;aM?Sfy#w{OH~V>&xdC^{ z%~nsivXuSr9PBMXkK$D2DAYM&`K`nh$ScGM2nd?>r1*2KPUoX_3P@&YwhP?ZIW6ec zT5V&DQSE zY$%;igFxDK7L@8dY3_ditlgJpRaZi5SEFhrRdt``ns4vi_8ns%`+xg&f1G#%fn;$? zm(+u#NS~;V{8qW^pkNJvr1f$#63(1vyzi48yy0`qgoo0ek3i1DkL({kI|-tSV^J?w>r!Pt&tRm7_Ea@+yEG!>-5} zl3QUsML+knM;DE49RcZ0#AM4C2HCQs48B=_5UU3HL!YlK+L*87BPzA7F$zDo4w$sZ z98$1{-@IkkCvMVT)~6MVf6906M=sfnrSBIt?^T^Jr|0d54PxcND}bpli)66@r{4G)K>EFx!E%T=$+rCHOM$M^aU5YyPy;5Ae3yS! zWlH@nzKzzZ(>m3?#~OR8F{02vp29M*CVj|*SV|{j$z|=ZgT;PESA2bD4@JT!{lc#C z4#yi1*)(kJ$=QHlCd;Am6jFe!2Bce5;X7|hilW>b$UQwTAuFKPit@IlYFbk!C|^21 z`C=&L=T)T%#Zj!r;|aEbM+y^e3@Qgh)8!5`LQV51 zF#J_OD+R1WzX(S=ykJcHieB7ZNgG~1m;+MCGr#tx2#SW@mA&U~_&7I^VflO}_}Ncr z<%TC#sEBx9Sy;;qA56)q=yf=us3z;s@;7fBH72+pTLWIV#-pkNQHQ`q!qao5Z63c5 zI293Glh2*Yg59qAS299&iBs=J@NAJk$7*T6h>pz0&EA+ED^Kk0N}<(=zEYI^l}Vyw zblaPe$)!G00g)M{SOJzT$j#UCXI8oei3!>Plk=n0{9F%9I!uhJ0mxp3VY{h z;4}Q@v%1ksj2=5lmCs-G4LtA{c`QWOSFHlvK!yagIU>ya>(%n zqo>o^LhW%3k7Cb5gsi{6xN^%p{5G;8MB|)H3cw$_tBAd4f$B7x8;3@i91cYpiL&dY zC%6x!iY!9lQsqx9YSk%$+@TJy*nMR#>n3UH{d|uV9z~B{}ei~o+Rio$U=Cea-U)NRBesNWGjb+!> z@woTHH}i8B9<@$yJP>htb5WHfGGq&>nZMlS*4A437z@V2#32%G05{>Rykha=s$Vc-K7A?)j9 zq@nYYeRouFD7+)dqOSewQcg}a<#@H}IX*zN9LA4hYr0hC~bZfh^ zwyHKKjgH8*Fr!s3EU4s8 z_n26M_gX}51doeEKMDQxq#br1&CFtaMC5krW+UAIVV5bf5aL{JSNKSqlAcJIbX5E@ zA%V^HoIjQ#~7&k%>~B@O2#!gPvXP zuy2`G8gK!O2!%)!IL-oBf9{mS1~-vFfNKH7v!~>FWV-4~;8;>3Rdp=HVQWWzD)`*J zlzHV_L6}b?cFSXu>m{wJdfZ~rQ4@$J44kBpB(JFKMJemJo;86ZNHZ-=a2t0d{76I~C zDj@@7g&>nqI&sNsIhABSYMCrxhYj#7QcWh@>^yCXwWm*p?`$fhk5+%e9s8gqg2IbK4Lfs272BaMHa8iLM`ogPlT*B*?jIQWg}8&lqw=4x zm>rq6dwaxmBPR13@)l>X=+uX5R1T|K&%nhnq4>!HN@38A$G%V)Sm$d*U2zqTV~E0q zz6+}-p>m>-HhVo7xOQ4~6$zh*mrL)S1q$0pY1YKLju#+SVVhbu7%Ji60M#lcfAcd# z4^-;hK1ta_DChgt9G~3V$#In@0w?Q(CD*F72atkEPYnj${2~enbA=eFaglBesD|{} zpIH_3@|om02Nyu)60L^EaO9a}zJP|N(Q*buf)JY+j|}h={?*aV zzRJ$AD^Kjt4=E4TnGS;&>PscGqEL0&Kw5A*dLVmeeko_J-EMJJ(_&yU#=CbC%1iCMzw*N`C-Uk1{;|?@ zs{0o+jUE?DAcNcn-lhx9?!%0eYyvnrAmx8p4VUCUTYnSmwlv2Nw>H|K7V~)^%}OMt z!p?$T@OTg@h7vOnk;9U}e$%@g52b1~?Pc#(LbDIc+TlTq1H!?g@7=zbafqjdBo%OB7MWW$mD`l`z;b&JrgEHki%DDFD!{h9Do7vUbl%scU-wA@a zY|DQvRvNJ&0{Tnp&R^p?hEMxYQO|`B+uWBMIGg*&ZP-nSU0-(X93p*KXh(|_fR0-I zj=q2CVJwd26p&=F^)*JfN52$ZtWnRe=tP&kOUE#?enY)Uc@S?XnRNUbE*t#zE5GX7 zmfaYEJSw0Pl6CB?sG^NX>lc;wT8Yhb|?Fd3nphVdK@bbHNr%|XtsWBDp?WU^cc zD*+|6i`;{jz?I=6%hzEh&Uu&_(Hkv(1YYyx!u_~f>raRFl((n%f4tV2nXwW03mRl< zHOQsX3c>QoggWn|5X}PDs(dcKe6ljaAzhjt=5*i+s7uT1`EWSLY z`1qcZ2edP}i|)vj<@fa;6MDl??e?i-(hzf}RISd*>9lXoN}tYk_CexSrW<=F*6nHI zX6=bJa1=rTrT7}4i^aOe`4ot%nzlzhTKVmGvVL=|ypVq7duKgQT_-QMQs>%YR_>?$ zcg!+r(t%BFKyivoAtt8Wsch>SEAO%=t{5O zv?bmJ7TzEolzsak@cwcvC}J~dnL!8dmL{)$kc+ZYBAZfJpPfD&oSXBd zo(NR<=fi;Mn~Rh%P7fzP2Kc2d=ZnX+?Vx|-GJ!6bE=ueI;N-FF5}tq00uqYEWK(vX zbElt6qpj*ahD$_<92S0jA#gS)9Ud+`t04h?Gha6}ZZ}!X3F??5JghYOt-sas@_$%9 zkghsE>*o-o2yGKixsu%O^hd8mE2Ch(+Z(u@W#q;LLW{;LW)@> zyo{i_J|EWJWmEQUY}fB7^b6=BB*0UW*fWE}PXQQvv>1qEaBf{}Zb3>AOceBBBYi1pv%y>oYO&J9=fcRo)QWNjKe`mq7 zUc07>Zwdq5{vh2|HZ96h_TWuc5AxLow-vJ|9{4sFoWM48R5ikQxqU=>5gUMy~nUI zSBvo*!6os%UE$J+CJ6${Tb!dGnMsoA=D)femC|&=s`Pj^>2d*z#&Mk0aq$#7RwiXH z0HoS3v&hYA*@4oK=qk4@_UyY$EOOhH0cw)hYPFoQ){%AnI5=dhvVNigM^YxXU`k}l zNPr5vlMXFcxhKDNJ?i*P;$lJiE^OiLtqS1sLOs1p z4zgS9aBw5u4S?eXwe6;Fs*3s$t02=c@b2dEzRB5KL=XDr9~3jF?Z=ShJn;~B`g-t2 zck;@J+*mo5Z0UEGtw!MFXF(CitcVyG!?2P_72+3!;#B^frxu3+%3N_RC9}A1XY6E_ zg=-{1y=zlTx&Hn3fMjVWF>RZWWluZsNNN{sB8wLhijReYvv#_{+JF9&uREaRZG?b& z9wY9z_iVT*PVXaelXrPk{wei(PbMIHdIUflKpy?kfkiTRJT^IBGw&pY>bl?2?D^N6_Nx`+ z?#AJ&xkigaOOl?R9znn*dgL}}4F=HkOSWh)*^RhhQ3O)`$5UL~1^l)8?Zo}5jDOPg z;rACbI#_a;#@xI{yg<<$2IPXS+mH?t<@vhZRY$(DSeU$6)8EYPH^5@xpycoTYbUOo zdP@@O448O3;`0X=J)X zHtK;@0R^(TpQ!0eq%=1AS!smC98cw6{_PF1`k}wo`d_`%H%H%&^_+U~024(uUDCql z13R)+b+ zMiu}CRg_n~9#e}Ie}{9(dPB);fia-er|@<#;hx*EN5r`;o~{=0t;-p}ZfML{PxgfP z<<-%-Owh%`2~BOehWEB;I$t~NfGM7Vj<7kw?6=1UFaEf$E*nRNby+t%Tr8Az<5jM7 z!g--^rBf#3Qhs~!<#bOEEw zz}%s0M{@&nf?y{afDPeL4)mZ4`_&5ERex%rs~u?dFr+oZA19YO{maLOMD`=Y8ICONnkJBB7Ra}ppo%YCF{3{Kf3R4 z>K4wJtFLL!(JgS*=2kY(`Q9^!FTNCzxgMhNY&H5Y)U#X#?N5-FoW{Yi5b33E-cQ@_ zJ%RKjAkj&qqK_d1EJ?_MIhrMZ)j$cfLw^bsw^rjlJ=q^9AIPhS1Mz;@QH^$_l<)qi zRttAm9wx$RpR=ER>Owtxz00`B3!{^bck42VH?!SM%~x9a0aT!wQPIe+sk>NDWYMeD zFv=p13^Zy3!Zo(>as!LH@!uHX=;IOT?=&FpDJvTLr~Hzu9+9Zk#H?C8^Vsnu=>oO^ zCGtvc+rT&Ir=~wh(Ei{#?dKB0-NtKVrqh_>RD@Kc{)mT_qH07jivQ2uIbM6}<=4{w zu`cNbnH~GA^uyli&W&VxY+0W%GazG7`WgN`JG<2R;h``AZ4{L z*fQ|)TZ=7GgDCz~*b&NzS~_tTQW4F&nMGpAwJN-^$wT7pYM*?HQ$0WePzvIK`4ef* zqUtrcwQTf(V3m`qV}=82U|th{zXSV8sMwe56XC|4xOnlojHB^c)KdUwC2?~34Nzg#R}H+_g`=Jp>uf~k;3 z^zK`i#!kJiFWcAFvmZ_^udEHk0By5~Yr6;PWJJT(q_9A01^Q(NaA zv0)&W2%(eXQZ6=<1-n54D>&n~QZk_Ulb>*aS6Y!=A5{gsL7=tCL#hTB5hL1c%6rytj^>m;P`#89$DV(_AR}J@qnS*s%h7+JcR9tz|B}sK zJx}$HGFjF?Lb~-51(%W|pa_wi9^Zl?9Mb`rInoCdw%GNpYutP}3paM~UL(vjuTet1 zlD4}n-bW23;~P|ZWbWcI%^N__NX@@(lij4bMUofx$M%2kS2F)j42T1=-$m_3$x>^% z9`^)1hCi6T|18vZXxZdw786XpfSn7I^UBS;D{yLo-BTPUk&6I<_{q9^v>&cRJCfkr zGwE}UDk{ekNal|5!_~VOkh(fN8jn|@FVi}XY+@HTWZeIV1c1^2dGRs$;8entp z(Rxbt_;goWM9o7%(mR!nnsX`b0D1rSxXALrH&ucFflN*dUs;1n83Ur#DS;rn${_#r zkF*Bm%(@+N!*`*#LUTsIhm{RBbEas{wVVx!oWI8@v!~M*-(~MP3xr=w)OfgMG2LH7$(nVl8{E_JwWes z`5^*FqJLEA)h>a3J7z~+n}u8UYfvH*h@*Klekv$ydq(g6*F<~6Y-8rc0hVda;BMG@ zI^+hvV|Xwm)3^jwX}8a>Nc5X+^Ag(y2RBx7C9TV*%u$l&=PjGO*!?uIPa(4gE(A&hhL-p_KP1IZzSN*+i0qW#sckZvty( zc|=Dm{+@c|aXPRk%#`wBkS=_OrFyj@EiyqpNr{yd(=DA7O)f|se(m@Hv|{!?j0>Pm z<#_c=(jg7+`yNaArY{p6C#g$JtuuUQRCIL@8vT}%#%q>N(U(@{FYHroo^xLV#;(Pq zzMydwplk?U3{{5}-zOe(mPVQN*mx?EsHa$L=G3eFAtO=ff2JZHcxVSlrCBAHe|%#t z+oMZsvU5jw$1U@{wvA?G8!>>ieUFM zn#m%puLbC~`2t;l{JR)GayEsdO3KY7){alzo&!ykaC zL_4e(7a#F6ajNg2%*}iX1Ga})c)podE9kLy49LowHfW>*(|q7Ts~7G^W6%tFkIvoW z#f>jP>`>)jlH~IrrSY108!qnu-xPS<+@aBec10?(>tB~J!*Ss)zNw{tZUoyDO*=cx zEr8jkVSv(6!GJF>`_n%3GkZO?GG$)gjPQWd0|u+CP&OMWz4vYD^6z60=fwm?q)X4YX}%@RQjq6OU6Y z@Ss%l;@E1HhpN^VieK74k{RF>|Fa2p#%u748u_0duCCBtQ0dPc0)l^ezl^ zF`cS^0D}*%h?p8Z8I9FU!s{;|{U%P`Ey;xUz|xrf`vvAXd+~yx^wse{3#L!x(#qHQ zmwN5?DXTmwW1NI9H1X{sa2Kd>wF$!;L~F!tB474_AJKd3IG*<7HL*a zW{9YUJwJvm2J>8Q13FO=mg%_r)47WLQ=fw$!v)=;5Rq>L>n*K zMyTnz4yy!U(6ncnoV;5;0*nMm+Eb5-h@!4K0NhknV{!qqckupj zNoGb*`x-ZeZfL!WDFx}k+>=CW^4;iMw@0tsp^uLv7NMNAI+2-gYBkE>u!8A^)ll0f zkVdAD*e-HVLG2v_1m|;nr}d=3&lXQ@ekGl$rcHDMAcTU8vQ`9J(deW>YXdjYh|qU% zz`!^V#UmUPENvOwrbNA?f@Tq})TSswKkOHl^@{4_*5zEqk5{1Z(HAq-59U-08CK~* zdAG8fZ1WmkJsmWb$eXyTwOuR@3|Ki5!CT4BJvgsS9fr&R)M^(QBF4@a7r;Mc@4q{` z-Rx3^cP>(>E)k`R*MhK-rvKc*K=A4ai$=${IvS4_QYnw-@{0q>I3;vy6!D?7?OX2q zMzsDq@AdC@d_74m?mx`wVo)FUJ8XqkS|+m(IQCO1 zB(b&Txi@L&Ts=KBS0`)ra3`{P=?@J-uaSy&UAe@Y6j|)rE)5(SV{X*vw8w$9B=vz3 zAmjp4++!6h#vuMLho$or$SkU~IqqwP{BY=j;t*huxQeo};ehD&Z$?J&ZOW`+P>hv1 zlV_H6GO&+LU%Qqjrc~WZ=?enG?_e-9<5z>_-YRKgC7fKqo+uGM5>~F~pXypkHjGqv z?A-f7+e23-3`l1z0|VVa-Fq8e^ddGW!Z^VpL+UYqqrqqY9k?xb(#rLSYRyKJH+PLh z%HDl)ZRcy3AlzSTBrKO8GUM&vnQ*IEPX>0U%fA*Y-0nq{-WRbtP*P#thFreH?GW){ zC6&7|I*W+|4s2y~-~|EV9lI2S_!RYr~%CKgF92D7jx^U?^}DV8C6`Ue{@JEZDYZ!Ci|faT+V} zMq(-}4UI@3lt>^x`*k+?Dj|<9PE&plZV*brSGWfUX_>m!$$Afd-<;eN(s zEk^wjP4YcsH3eu`*ms%^M1E)WeA#8*ykzWS7p=cCfb)LXMnetN?&*QPk~DkJ-ACVU za78@fFJdNfes3Z+CO}d9;!7-UeKE)f59D@V$Aoc~5@vj#pP2WUrj+xyJe=sUPsAg@ z-0n!7XEuf?cBHEpGKbmDd;wxY&2H*J#GiYF!#9AKs|OJnsJT#|Gh&d=i4;o~Hh5|Q zkk>T3d(!F8%pU83H>8*oril6B^8Wey>BVlM0QrtS)o_;9QRM`SFy8nm`Im1NZN-1; zSoN7x5&|OLjhV)w`>nq0mwXqXF4lZSqS{7+ds`Ha>0gOCx-uaZT=B!CU!#%0NuxYA zLFP&_<8|1JY5Y_$8=cw5L{r8PNGCKdxWbG}xA!Mc>EXtxBT|9H{pFNtFcCNCOS|M4 zY;*}SJDx3cE^HAobFqGY6Vr(6p_S3iFk~c&bcCSYJRno^H$!h{F*wIFvrc63%Dquo zg|q$-gjNtav(O8WHryGHlwjI<*WdP^DD~^hn%j0n{ z#~#`E5mS)A4#yke@bnWWS$+Z-aDfbek7schbK7Rtoq-yPeFF=XE20a{1A)|ax)hg- z-^JBBW-dM}kn^tIj?U`0=;6l9L5Mx*Qc-^>up+=DRg; z(seLLcMHh1{RBn0$_LdxGQ|kKF~ajHrN0E-enhn{5d#vB!*Ff1(bP(xM~esw9wvde zJKBkzeD~8S7vDlAics+qC6^s#+W~stQ7u4C@JMCm4EqdSxvr9c_Tr>~H)u@YTymt5 z+|_mTftFk*+AnNJ7jNXx>?8r}l*hbCUoQP}rT}7m$D=qf;x-U>g+H(yI}&A7Jp+Y2 zAv>r)x}+O#IXl~#>^08C+^w|6Tz*Jke?G-IhU+04NJzD&$uzs^m`*VZ)OAj=JPqLy zes3955QIvJW4DmI!qAlt+>;+S?0hb+?<~VvE#$Rd{cQ)-5yW?0@BPL<)?2R%#(7x+ z#gZ%vcdVCxHJGl1iY~vN^~b9Jv9e%C%s%bNFp!A|86l=CYg%YPl*TKQYN!A6V_sgVv+6|9x3hQ)> z70`oXoJ61~!nYvc)*!P+KDcnTkoPmFQ}RJd?})jc*;K;x9V5=~$>e(8m#qAR;?c#E zCEZXHk%3?eXr{|!l<#h3Hs}~$pAqm=qI3cFYXLR^_FFhF&Zr+Z>!a94qsib*nb6AY z2LzYFRt?ijWHH%&IIBr->c&qppMEd|hp2!lG-zTsRpl7Kwouad~B>wpelJxwF)pi{1-&O`bedLnRo z&T1w|)ciW+OwZV&%2Wde!Lq(UBreBK`wVN1j)g_+;rJ(^FHi$hsWgd!d>kv=uAKaW zzNo->NxkdPL9CZmrJLc^35Lup9B<^g}M9)uz1sf5Y z{8B6SYcW@&H1q>%nxWys;r-Bnl9?Q}wCYcdno%CY51tL!aPU~vJivFiNSG!7#ssIb-kSkw-bcG&2l1Di4;K!iehICiZD? zzq^)-yS7!Z-a-a%dH46dQ5CtUhk8xBKq-AY=G zyMtn&YB(JKS_!PYx@sUEqs?SwXAR}tyB__R)Dr5*E7Geu;#EajImn<^w^r1}-eB4e zOrxw;zNx`w$F%{udnuRUtMqNMs;g`H2pE8-ALC4TAKDe>MMx46n^o(oldqv!)xp4Y11)2Am+FC}D zZ%ntOVX%ye_rKN5{2D~38qXsV=G(cDN3r8CikeG8haB1SlRdX^(3+|D*P7XG38LLo zfS>-9${;>k!&c+)5h3QV^G+W$gw0S)5= zRtNSHK#)7Hz_~NML3t0@7-=AP`p#+0_1m^^;Rkf;9+#`>6m1&-4iWBVG}2{y*phKW zlq49+X%3LXra{9AM$NkUZmVJkO|+Oiy&LUho$62+(q=kSC9u=j@c zce*ZA=ExJJEa^kY01GYwSpN+c+GZBN#!ukYt^k8upa(+e9Rop@NnGM?5Z)Jp`X|yW zfAeo#;PNosXw~&;3pkLW!kh`nzfozJv)Oa1<#gLF`cFWj!EQ0j>-H=F^~llCv^Jn6 z5Yo?c-68{#>tFb!B2xtl(TclJ<4n<)$YbeSBUz^@wv^6i zfV0uW>q?5_!mZ`@>|%ca0hF4buJW8_J$Yv}HBm}IeCf-ipvoGn%)Zk;b@+s-Oi)5Z zBJZ4;%g)~IkkR%Q$jm<@33@QFHHeS(Z9u(8+X)9AJkmcBA9>gN4->5>*f zX;@eU9*}O91(cKyX%&!=?(SA%N$HkOrIAn?1f(UTySw2GzyEpX3%%4~zBBiH(nxxk#pr>pf-by(cT@0I%x8_=J;o^YiC!NaFAFDRhhbEsze}=){o!H5WI3Ncg#`tRJhz zf2!OXhy+Ng6gejHk&|(9h!qR9(Na*Ndv~y*q&hN7-hr;g-<|oyaj2tJ9&*<)- zb7g)%mSk};jLOyBNec{*d()fY6`D2?FBY=X%mwk=W@9^m$Jw->E`PXOqjfSYA0buO za{n`>kNUlj^FEy*ykF$2kizsyNLm)>8Q^@R}`H$O}9CLo;TRMw5BIbquBKQY2u1VYu&2$Vg$jS z!XGe*rFn8HkPij(zk@*HAQ;b&&3?6wB@-lIIymPWtTIM=N4N3Sg&E|mvAF*BfYi2_hx#&EaF{NGh0>5g zQTm9H0g9tSX5IqCug03jtYW-EvPa8jwAHW_qBP~-uUMJ>rjih?>;JSL<|`m4uq|s} zEaRiN3G=mvytqJ4Qt_Fb5B3b$el3O4=fFrCQ<0-YVT4dbwROUnUNLWzKIt%ba!Ww(<(6o9W|Pt3~GXPgx}BpxCwRKA@_%5 zyNqXkdARxH@egQI$4$cEdF~^{nmu2FoBgW?Wcy7m2~c~`%SI}6e4=eu5#7Ht<0Xw{ zM!w&f`;VsSZOmM%sQ7CH|4)JW6ha7tBSBsFsE~XG^FBTfaaNI|Ld-M|%cB6I;GS6e z;dlfySMb7)`%3r`%6us@Br6AmXOg?+ofEHgfiQ&rdTA1L4?>E;g5sMIGxnHBI(2x7Y1 zT;>;6%kIR~&aoNv&^{`$37%?d^1hYpjCkZGE0Gum5m?U+&s#q>iBFTqJ`pG?Dm{?( zdLQ?JRkF&&f`?H~@iO2=!)z`?!g&5+jS!aUrpYy_Bgx_Fya+yk7uQ;dIw~BypXr|8 zZIM4b{Gx@qdr)NZQL*TnMXP9*Y?stM9ZRuF<*>r+qz6hX(biV6B@@;sg@$8RK1TNw zTN*Wu{nyg;%`(&&_F;3&e6ZAwwW)Gnq5sKi(U;XYv*@{v<9KS6MGu62LPv{cI z*<@D1*|H_|YxH@|5#dFcj@4}JmKHO-#qgtAz6#kM0Pi6O-SeW)^C+*Z6B?9QUCCU2 zf)jKu2_rZnVItR|Eqo<7&9@D?0*U5Tcxk6hE2>wB;Ixeke_0ciHwGe|qU2+Q9RJMv zUC%8-LEu99lf04hqXWf1A@v@~JKlQ3;I~LJtQ>}|JpQHLn@$Z=EVr1h*(YKxnbprp zfH+k9Y&9rR=m?_!`rDr$VQ#x4li%op8eATzLWhF+cUMtPb==1Muh-2Gv_kUi%Kn=d z)SR^)18LYdmW`5Z;H61hn4Y$gg3NO9Lj8+tq2GD)1md}HUAbnkMXyW8bqZ7d_=<7> zUF#C%K%@cE7JFgqpoJZ1`REy}_$pRJ0a6~HA6tv9@9{Xq+kt)aQFI=CSaf?IJPY4; z0i+Fa?7+TftHaf>!n<(EN)y0?(S>|kf^>gPs(UYF`j=FI-?yS}Ol^<7V9`gNJeBYH zT`TQzhUR)2$ajo~5*H)i!*C=E6gZ`4_^E@?IZH^y7Rh37U!T^kKpCK!+)42}BOkt` z?0Zdmtgby!Rp7P9iACD4;K zpmkef*S1AYRMj6bn<9Pp86qVv*r%)z8OwqG_MB>YS{&i?^;p_65l^*-?oaVQ4KL=S zG=AUQba)lK`r7@kZs1mAWoUklzT@FEI#>+O=$P?Kbqh57$%evfk=S0Ixz<1+xYFQz z?SnKsWp))r-p3CXjdTGK_^MzV9qh?Jr8~tH82M*tw2;thB#!%d0se69Hv6`}n%>yI zQH?SOX#dL~ED7hXA z8x31=V#SH=V-U%PLTEl@UkxxxM7z%9$-8N~*jH~pI&nWXdK2IjqaH@EpYacaoJt?I z16%p0G|~(9>yHM>8rC<=C_k1-cpB>QJeBn=v+-qu*khnQd9w7HeW`F*d%Zf&f+pF> zEhMV(Dz?;L{Kzrm>9Kw%%03>39LFPRFEG0ly{CC8a>d~w$!IMxnPyn{-0?1B_DQF8 z^3RaxLh^642AG|htPdPB(@NrdBSzfnjVsRqAOSwp7i~`17Yh2hZ1wVdOi0E{d(&q{1=~*uU#?iSL44t6GX4HHPzEmm-tB>E z>HAmTJNmWX^d4gxV`$Jk^rOySq_ksB2+3P+CHApeK#KVTGbvfT5DsQ!k>rmVh^g(M zpr|J8V>K#ds#WT-T)@cG#Kt@(*7Rg4X|V>`B~xr-SR5@O{~A** znF{&Pnp`Sfuu@D}1b-VH8M~Y~X*OYT0lotOXlrSb-dcQf8q2aA&opPVU2zwZ_k6k_ z?*qm0Xlv#c`m3C_f`3o9Z*;UahQzLj6$cROckAR;d%qmJryfO%siMe2cEn*ZCSVg! z+-h;hi)17fT&?ZwRUo2Cd*5J5pIRxC-geI7UhC0Kx%7tXcMTR(gO7CYIkn6#i(i_o zN{C82xB{AJghY@9>tIs^i;Y~XEz53?7Le1k8FHc8^>H7X)iC>h3cbL^#bpPy{*dBz zpqcVit#{lJQ?eoqsKhK3}l{%skeEp72O$~u;(xI}(0fVQSMD-DZMX7<>6ElMCG!lF)HSA!LOtY@4g zz$qX-eE2}9TA0?vJn4NRYou|B$2RkGWox>aHm-&0XiesUQ-26(eaMytd2SB_B+&Xi zc7J7hl**Mm_T==;#Nsm&k61HP;2r})b8cHcvVK3{l)=x@jnba*c4?%5hhM1a#X26u zzo^Nin?Tux!Yv;YQrI+?O7<$GvMIsJ-=G>pODBJ-S*S>T1cd>9Cn;SlB*NKEf9(dR zPpH~w@*XnZ19Jag;2-)R8%S$-dWmB5U$=Erv1sh_1Kwx35A*}LsY!3h<2p2kkR_Ry z{jc=pk1Vh*zNFn0;#)ipDl02h6B2+_bXV;}Qr)wwB_~`?w)a-ZT*V{D))dz_qe-v z29a_5$70Hb1)<3EN$|6$S6HAG~UgCo#)L>Fs=c#Fwuyq=dYJ2FO-nS$>3;~+VbLTb+3QXJ z{k38FGF1>@swV%X47n5d{fSJqeZ;0XwjgUix34ho)0?~9*bB^t|MN$053OHMJ03C0 z5kXo73f?8N9g0sih04Bd0cg~Pp~LBO>Peg8cHpL1EOlDJGjH

    Hq^U;lLhlz@G7%u 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

    78!c6KHF}ax`*un8-kHe}Zh0Q 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.xcf b/forge-gui/res/adventure/Innistrad/maps/tileset/buildings.xcf new file mode 100644 index 0000000000000000000000000000000000000000..5c98cb8920b725ecc5304ee5c7ff42973640a0f0 GIT binary patch literal 815977 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�*Ix*6eO0DV1hOiewyZBz5-ek07b6kknAO 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

    L{3rqMlU!cAjZ!_Yc+nv*T& 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

    QaNiyF{ zzr}XZDbJPmqL=-V%-?q$6-HU$_iZAT-(oS~P|tpOEv~6}=HC)uJ;POgS&1tip!g1qne0pwfnlIvbthkz{FmR9&cMF}u&zp|IGNq13 zm|U{uS1qD+JU|jD!8ukEj`yZR$^*9rl(KOLwCnW5lgFEFu^;5YCLkTyIb$Kk9it=? zL{u;tw*o!nJRMZ#$_g&zBXN{I5aMPnduL2h{ zG)F==$2IdG=c%u8AK!&zgRDwB8I~&U=Wti5n>%4;@>Tpnt;Ec!c+fP%~c0%dx|1g1XBo z*Q1f%W3(Je(6D$sv4@SSL%_A@_>Q*~%`h?mOSUSYD#1u{y!T0XT#y6kafq>DWXNM& za=b;AMn)*69>*VJBnVJ+B&H4G%Pq{svu{eNt>`W{M|yTm0cT-)pQs)&oZ6~+a(U;I zI| z3?;$wZts@6bZP9;5Rn#crLh zQLC}xc&tkR(Zjl9D6=ynjxM~m zqf1!m5@Fv0?W9Wolf<~9x&|>3OK}f|zTksv; z5B&;@mQ-$9qcIGMmtF};*TMi27`c}SEyyUD%y9VSqATGSYPCy%aEUe$ms|?mhT4h3 z5+$+wO3=daE>v%W4;Lkumc$n38<*VL8d|^B*O;{)MTrY8y)rOj8LK~Xyb%50)U>j! zm+e-0tuiNTtE+sC>8C~N1eab5=yAkpl}+-rV3jnvkcgiDT#U^F&e^2bExM21mn62u zrAq6_xhAKR$ner8vVg6kU;<`v@ioaQ8M*lmo`n^e6I|oBp8&jcGW|l@(b@>leTj%& z6k^zp37FdHS87;<`KlOD&8d1~O!D?5PEeb>u&&2dus5MERz|%bJXUkH#==5_FXC#f zylPNLo2#Uf&s`|2P)coe$(CWYh??OsA|+T>0oiMyKXI`wpp@18+(l0ydED3*`#~Nw z0@8t<6Jn#dW0d@i6QxUPR-lKDbRix-+9}JtD9tA%7I`FShdLZatXdM1xTG#AL`l3Y zo4Z&Llevo&c|aw(;@qFZU+cwpCT?qYRU zJ(#;pwN>+EW#^r#cfe@w0<8B=0(0gcsNP+nxX0<<+(i}QBlUGzR1OkWZ@Cssru^K6 zmXjHRsRNWScbU@IVRM($-9v5=>ETq-NSYI%R#t58a{Bb4(xDR54WO)6bqAp%rVj-* zS+Tjxq$r>{#N6c&U4*&I6myqDn~ufAj@F*Exy$4sPj?7rhZrnamdxDc(7I8T+zmp! zjQ3qP86Mg&hLYe8Y3?#HQJElvLvxoyuc3Ev;)bd;X>*s!=+LGBQW^KNxr-1J+8UKF z)-A%gDV@oLjZ0kudXf_z>XuMuhdNL2+c2fM%bPfxyJ&r^MDoVjNt?UC;83$<`b{u* zp_-Kmz|jO2ng}Yv1i2WRyPy!G<^+NTCZ$1RrNAv=Cz-oU>1P1F1dS%zrnKfRAoXL^ zg72aI(66xQq{>ZeG=@QO;+2pNd$}7D$lL{?1sNri86INpGKpWP)g}OG?gGRm6U<%I zP83d3!rVpB!l7O0p+kP|Vl9a+%r_?7?b~SmT3?K3sDxbRE)%Z|3@gU!Nq0zd7Yb!r zFPq5xZJpfa?Yq($pwtN_UJK}P#7*5gbKZJz*q?75#L}9|($mTBWBA=rWqq)n3 z!@1nAu!VjCd{qpn=2Sf~rsgin9stVRB@I~Mqo7a1vr1M-z2E^Gk1OX_R_6Jtr#zhN z&QlnqkP(*(Q+w``Qdp%lFsekrKS(-P3h8*QY#4w}4VsPxah|r<-Z7 z9#`99KgfeWJ>TTO&Ix%@+%ZZbB|NK5>QbVQ?FNF;WqE(3v z>Ut#EiWBORLWab@BwGgxqlIZx3fhrkjze{Sl~-BYWvucIpi{e`Q>;CMun3s}InRI` zNytvha~CS=i+{8W{1J<`BtcO-#o9~-E@o(sgy!kC&^#42?)64ALqYvb7p5)v!C=o$2h0XRQF>1MYT;o<3(S% z_@>7GI&+tddT;I`oteAn>zn5;DbHPa1RJD0cS#54qm<_^>09%`)sT>6Fa0)0!9B9Yw*_;(Yrm%-%uc}y|UyUN3EP>BUDRfm9U(Zr6o70qyU0G7;Ms7i1(ndrS6P6%=UJ(#FQOAsmH`|j06FSUX5vkc)o?Xh@(?VZACZVyjrzu3djmmeOL8};nY^m zllh%@C*B3a+$9CZMxQVb(+JhO^Az_u4N{)F&@50;AwE)Hmqq0ui8yXuOw)@fBWz%1 z2qq3t5~iJt>6s9tz~*fCa5{+eaH41=&GVq<=Tn}$q-W0_E*~cNnqWb;zfBK9w|ORo zf||^yJaB!y8-5I&w5OoPLlDT|6zT6>f?mlEta?CB1}>~JSNb3Q(EFbxl{ z8&x^II!bVtxl1}39^Np9l8_$e7bZP_{>=Fyk{X!19DWUb3MT?>h4RHxTNrbVT9psS59^juX6LFnrs2h{wD3DP<}T?rYo9MlBrhdss7^ntU z^b#~W-!`SwRzb)RL$=_1ct7+jEIO)k(;AIoP(1%iNV*mVkiaN?iO_2hkd^MG)PHjp$qAEX;((!`y}Bjf~uU2hYNa%n2^? z+ka-$bTa)y+R@qwJH152E($TsU4Y?S>94Q_bQ*5v4<7Wqnq3LtLzW;`p+7GSl5HyE~v%O8c?Jziom)*GA!NLgJZ=PYj z;g48nsQBBrh`)WC_?x~DLwks82Z`SeQ;S1b`8v3&>bE*?m^d2+{wZH@J$0kyWUOK*1_H>8LvIy3l!~x=HT$oW+^9L57)>q zT-yZgH7R-h!aL6d&fz70g7U`mPEJjgxuIKo)y*&55h%Q~mC-AQdt<3|Vh`UsfuK@+ zr$ZIFA6esR(VaGEKpQ#eL}`irc$YSFl+4}XelooCs-%ap)YE@QcgVqu?qHxCy0k=d zF1_B9h_v|5E4RL8>jVj?t*z69LFuJr`hO5FEwN$y(#Ebp4?Bf>a(W`Y4VeAh>-85=4j_-7hRN+x>^r=sDXNyMnldN{3T;p_%TprE5i)gb@MiWElRVK|%ZP86AreA^>r$;N``G3SS^E{ ztX6@iBi^o6aeCYzkFj8O8lwe-`s9Gic`5q-4S!GKe0{V{If@Y-> zWJ`KO7BA@x#ARm}@OGodd=qXv`rCw=c1j zIiB+no_w*UnEhxSFAx>+_%5+EWa}D1lU-^AOz-KX)zwUo4C5R%G8t+`MWT3EF{kBD z`&3e!Hpk~M!uT|A_#p2hb7o>=ZhCO;&~!XUN&q<(gG8&Y2T(`Z6e%ytrLrYh*%E4U zFz~)@2~dBD%}rQeZOgS%NHrXcr>>1&1bVg{zBMi1V$V;^%Ifd#xMys%YHbZv&ls;V zCu9d+{_s%@C?DKozR6C#3>kimdB&GypovdQ0fGV7WiS5hUozgzjzZSeu|{VaaK!Gr zmWaZbr`>*8)Q-4ldc#ObJLg|<`YZdU+L*93Jtv{4sbQ7mmCm%o-=FipBO^xD!eue$ zcyaD4;HYUhl~FwgS2aL}b8}z!!^o|e1J(h8nFX5;cc4r%s?VVX?kEE zHOW8_i8xnE3drjGj*>C+COw%%QgT{-vkxI}Co;t52kL!q$dEUOsIniz zj+^`OCv!O6evLe}yqJ_2tH1!hKljOx=iFO!ET8vwX)6th9tPQFnbC)KY(cx2OMJpuo6{aJS~Uz+^1Bdh z!V^mQO-L`({tq$(X@GErGJ-N1f6m?pk}gV9fNmp75Q8}-dnOxC#yQc2b4~NbaW|Y( zgk%Y+myq0~BaLrZ@~9VNodOme`gW*%FSI{l#?mU(@j}_=neEO8?GK`Ma4WbS+<)TQ z?OV6nZRhUae|`J*>-+aze&zoC+qZAsii|vLXYlA zcn`Y%LEFzW+X&u+ZyFHV`>&JR>tNfrjMpCU1@wK;92~YcZ{@`I!`pb)?M={LlUrUu z*nTE(4!`A3kZwHNIW<*go_YJ#>-<97>$sKC-?Dk;tq=C_tq%}%D{gnFBK_kw10@%L zh3$Eequ+ZmW_xB%5bua@r`-K{W<8>BcA}dbKX}#@^v!jwY+GydOyW2^ug~Y16NJw+B|cL z*b5;9%D*CjK@>qG2=k0J&m=xJMF?Ht7G4c`nt7(t>@v4`rYS%qkEM>he~;JYxekEX zbI<0PiY!g(GKugI1duT_8+X;I$OzxV4i7KT3EpQSi1#Syld`Y?WJX3kjQbe;-GK1h36jNjkdu0=|&?Y$DqdgZ04EA zl&*2|B*N2$&-Wh0MrgsBEe2PlZO8heMS*k;psNin>!=ca@y3lAIrew1rK4K$$D(|5OzIJT-znKhHOm{;M%1|Kx0oY ztxRX-HHj$;2%$zML#?Q&A@j@yEfw3R5+hQhSzEvewMKDaha8#AnL{#68iNam8u0?@ z8|1&#YDL<|(HvV2 z-%>zW#xRg<{2BUT3Z9vGuls%BF*KGKqfGtd~lEXCc7&iLuDJUp7A9a22ctS z5Dd63d+}%gl3Fu63R#mF9%Jdh6xq=VdnMu64$W)`05)oD7%96C@UPhT%D$;KCOpxV;uzhAy|Dl1%Vkzk~!8G*hfv`7DOV>m68IoI=`c2H@!(8)M#YdR1w-fguI<; z(}KRyd%p~Mb6DF%0?iAs0tUfj&;Jb>>nyz`v}_tpaQOmCOA zQpV_EkZo2NeP}m6PL$sU=ro!9gDCAuMOz~S?1kBa zb}^TDhp{%NJz%tI7^>uVaM*+=l=2%k+=kSfVJN3mT3b|m&b|wAP zU-aWQpcOsne~PZW{3ipa>7z9s`{A1ggm&qlk}KUxz?StlE z9$!AniI>7FtO2^R3EFG&$ms>YN||-=gO;p$}g-56s~P$^pAK% zzj5=?FZS@QUm)mFyw;(L#3-&1bX#kK2DFibe(~rgzs)x{bCk^8Ngtuwt49{((35?F z9T>NZgf$G5LvP;XdFIX6dlHcruf0l_uH;KpuPo7o!K0Uw>Hk4|^Cr(TZ*J@g^dLlJ zOKLfa*IxHQZrnc_q7E#j6unv(5yqZ*=FO&2Kcb{-q*@+J@XzY8 zMWcI4=9xEJP>SwVirSe99L8%+tRQWfXWk4Rb#8#MR zT8!^}cu`?I=9xrZh{1K!^Sn&ZLVL_JA?B)LOl-SJ0ItIs^URdznc_oujvy1eTIR7i z=9yx{Jku9*tm3q(KprQ|Gd)Y@nQ45HI2qv{%D*DmM8roV2=k1YXDXI?F*ws!XpDL0 z*&y}dxLxMVGl^J90iv!f6Xnf;yy!3O0LZux5J@FPLs7tsy39Ni0=0Mq)=%8pf4Vc^zn*^5DjN7d%YSf>Mi2>F0nOa>mtF(U1|i7wUO(kRsF15Hw?kj)XPvSD#A+u zbA<^0ewEaw&H4&PU}xr)oq3e=&K#a0)oF0$(0sf?s!d&aP2@zVz0Yr4lnc@#nDTp6 zzm9p7b40hinD7ovIue@&46(7nV9I{!DrHfAK#o&zehVjt3=*yOA3z;tDW&s05_wwK zTH6GZFoYW6d3H%4+)Pu%<|eG`w`GDXcc4r%s@iZnfZZz)FjzKB;s5tDIlx!J4z~-d(}z_G{#+<;A3$Sp^30{groru#%Ewoff@a+Dh-E(?hmd zr3cb(e4HqMV3aufiu_f6g`Mj!F$Xkt_WHm9j?-x}`3F(jlZv)Zw%!Y~1?^%k@h)R+ zPJ6&;)i6}a?|!ifPblR#BxFJA%`lWxDg`mBKW9%3Nf)IlK(`Skh{2qaU673@d1H|Zq-d~Zf5Oe(IN zlLoN2#J5-YhvGj#9rDP9lv6$lq0@-RJ*%t9TCmFWT-W&6Ho^*C69Qz0$y11svj_@( zYZdH(j;%DwDY#Qm*91wwN}-Fs)1Is(44_)2l9}kmULcAO*G=yG8^)34QDFa z5*TiGoN2DsqE+M^l*&aioZ7{3xrse)b=%F1%Ou9FyTR*r9E;=O)$n*0QAyY#fF z#AX0=TvBOEkLqzUX%qd#72=;*OJ`MB{YL8C&|228*ZATPvw2`_`#8#Ma{S-z0AX+E zVXsHa@AZL}TYI>MPjA>aw&W~AwY7&2%{0CbwB5spp|-{sSFD^zx-}b?c$`5ARj~D;*;<`5)^UMb^qDL<$P3|1buLS4v9bFu4=sJ!F`K_tU%j<8kl2v7frOggf524JysL`+N3 zaB!r@x>=>#lwwX^6AfL3DLs!ctF!JCx);MoN(ee~WSD<2bWu|s_cxBS>=JoD?#M73 z@s^ieJkwbv$p`}H(GKw*OvpK#?j2#=+Sy{*{~TJI`;5N~J#4Uk%*zBg8D4!aW9O1<{eV4p>05Y(U#10U&yWM|PY5tMN>* z`pVJ>5crs=5S#NK*+KUs!@~ov2e|DK(Ghl|!$^Gin_1<-f0Ol`v;)BsTE}Bt$`C=l z@wb50-)K*=mYcyCZidRv@cYs|!oGttKT&wIRr|;oHk^4hK0_108X;Lzp#{hM>~o!8 z2EgPt9Kp!lB^FI@b5ZR&f+}ph!Ks!PW6C3hKUYaOBn5`caKJF~w_oxjOSPm->ByMG zu>CSwH2jY#%%Muc@&g;Jy#xiBYJ9{scM!@C?vb(Bby&;9X4>5aq#TX0N`NvKGMAIq(|JIntgn1P5K8_Qy;N}MAmyN zV}zz+kBQ!P6R(mr!jZ1SKc8ioRkM+orZx2}ruI&P)dzYVP)ruotn4`P>IvPIJTE*wtAe;xYfsqr8;{kZ^k+IW0@D!7!wG(PO-Oxlfx)ww)9Az z=IdnkBXfYaQ&5NqH7vaGH~byjcbmPi8E_Df(7#7ivTfD?S#)2@k8lQZBj8TYQ!*>v zmkv+mc*4zu2>WWEO>+-^x!Y?Xl}!@4t>%sf1ppyzw|dfWWMpO}VniPXM>|N=0k{2Q zr6ehFgE6ATYGp?okzk5bBDcxN6OrAfPQWfQtjAV6{H)0Ztn~@~hs2;^4TbBA_`2Fj z?o4ZpbZ17w=~ra<@Q;)XImnU3b$C@r?lsCQJI|mf*s>m>)S$lB=mn$T{b0>ag6$eE+yY4{6vF>>bwZSQyt8Z4_Cr%t-{tX*+ok@hI5(0 z4U+1&1xN$rB73MXl~@c){Ei$MT*Lz$TUXv&KD@Z^c7+JMZdV$Ojq8tc~ z<+p7n%9&yfA>aCCS3J;u;mMZBD7a$uMCtIi+XNvRh|qMwZY$Q)~6u}-91S4h&iVB>vmUKq?@D`=%1tsrpH05o6#<6T` z(=%^q-LCYb*p$*5LCWU}<)Sn-%V@nK{kqUv!~}f}G*O~C31~yk@*Wjb7FdxLtwRTb$r};|aGb-_RMBs*PS% zP~KJ9t3EN;{==OC#FOe1sCzo-cR&pU{ha~IhIor|uQTLz@ZBM^bJicYUGaAJT>|VA zVbvve>p)vtC(XVad7n@vOrL(0{&=5w;`>C)tnV8X7qoH4YihSEYEP@e6W{#SE6l*q zW-VCtJaoH~nLG2$zK)@vMfm~aR>p|-{sSFD^pYJmww`$Z@LtvL>I47Dj**%CkM)e- zf4j2WxvuHsHj^k0*!Kc!>2_tAi(Pj;qD_=SJ?~?}`__H9U0J?9iJiEgMCaNc8mb5ve)TJNEid6NGZ3XgvEP7{?@coMSq`tSy9W{!2hQphU2p4v+m%@ZD*r`5Gz_or zH~|`QHE6s-Q?MU`q;N91zQg(TlJKReN?N`1h7U()>LT0F+clU z=a&I+dy+$cyRy8^MYZcmRH<=a0+VHF6JKWn*C21zv9qh&h69z8zv*^`YDt;N>lKNa zl|A%7rZ9(^6qa#6xcw3oWUBFXY=cm4SFV$u)j2tNlG~NLB!QiD?4EvIU^$}*nWNY| zMKH1t5kZ6C-`u0OHy+^YC(#i%3r~{!^5Mt%{R$0{BbBdrvR!o#u&(Y`!gl*X`@sW# zfN{@RfWLIJYR9T3Yw~lj+GIdhQi>J!a}ThqZd#Nm*?rIsAE>D?o#4M#bx#V8Vd*N= zQr*Q;T-ogbDo3mF%P(Z|VEbddOx6icb{+ouECXUTu6ntcgRLFR09aS)xk7e8!bVMf zl8McA`gx9(t};~QzQTHPOG;@HVIQ>P2f@d!2VAPU#$%*YjXj{R=z{x>!~-P#iO4i# z0}^*|f7qqWqaMizeHG2Hq^9ud7z(8Zy2Bn2e*FM9{rExnalk=*lAeE3CEUpPhAg@# z@-Pfd@(tYSlLdOG-iGus)qL>r1H`pubVdX3IsB-%ZzELsO5DkO{GrAR5FvcG0DMf^ zVfAFhV80B`?qqJ?=1%52YD}dD(Ir|RqC0K2sUhS#fz1Ra5hjPGnwlojaMIGkUtG-+AX8Lxb-WYGp8R z^qq8>tXUe66rOcT8YKGQaXu*lHC4@d+_NK{<$bgXLj%cFb|=FKO?|kNA)_mNN8^d=%$-c_sSc{H zMrGCeAhRwTRqRfNkzQtSgCvt~0n*sHdnYr=Pt0|HC&TLt?#|ks3^@p_m*ta?G7iMz^nA7`?#Xm1wk!X6Wugsz=Omi^K*}u67yz zCM`fbD%6$HQ9B^>VRSUP5Fn7BvUFf{+c0oVF8mti83O7n0&yM0Ku&!@oATaFxe%n! z;C(^7MQM6L8D`3hcg(SD%XH^vX6Tn>X7!_@QSM|i<#UCy?+Z^6mC<@d`gNhT$m8)f z&{iBYXK}C%Fl?U3%J7Vs}d;D{U!v4JVT}(Maw&X0ryRJNa zYNqjhpq)N_N>bX6O4agtFVI?cN@&)n$jrNq$@h$-3r!;s==b-64qE-be$ca4yU@$} z0e3PGdyBUvmphqn=nOYUFZ4zQ?TwE1MxUB%|KZL6;_2v9sCzo-cR&pU{ha~I3*s%x zz0Q!=!FPwu&RKupPR85acL}ghg;kf>t;6r@6RL#i)34GW?-NgbpJ!lmm9bp^!TnPMOuG=TttL z5_n0IQ*Dm075nb7V-Y)wTp%-!)T(phIU1b`&h^+gL)(6g#+sckN*T~DA28*g!nT(pVLkq&$z zxI%giGPfl>Db{ZikhHO9nN3=QAsIdIL23KB!g3PqXHVEbS_S~5` z?VK1r5vBh;N0#A%1Fl_tPx)#s+_Mhwm&(Qygl$gb=U}zth^(X>KGlSDvQx}j zs9W@2xB4Clk1&I$;J;RNPY6!-GF=67br;K_X6qNIQd*79CS+3GK8lx#XLzEU;;+v# zARDQ0)yqAB&CZ(>$+~I!-g`oJK*B~%eS&$-Ikd{L(p83v(ywG-()!M&XJ`^(tM74d zeUyA8O5BCVNT+^#Kwr_7^am0Tki0xiPE6Mw+#k}EY1AY6ps%7CmYgTv>qH@f)a0-S zL{A_gtb4Q?9#v*oe1e{TLM7W~9FWEIi98H9A-fCi^vQy{(Wz7EQL0H-glSv4FdBHz z;Wxc~1*j6@qIB!%pvDUjA$+$093`(64`Qr81&(%+tOM!x50q7@+%vjFYY^ROGcu)R zQF=9lQbdBToQ)0U*k(>m@>!D$80}rU7P*b5G)S&5(hbyPY6}|XM0fN=IRC0n-Ejc0 zc+I&a?R=&V`Sb_x9>*Vir%)?{furxFr@G47R({<&CG&N5DJ!I(dHvLEpC#!wBL>Yj zN-K00J&qBBoj_0dVemD|lhEm*DA(EbJHj6ar0tZ&?Mxr_1MlvWg*`^&VTpXx89)HI}h0QrpMMe zLB{)!oqHL3^wKBj!}p(yR(j>-{pZp-=qvZ>^hiWZ*e|Jwk%|=bNQRW-6nPiP00uoo!Xj~Y zj2V*9F^&fLpVpa!T zJAVKDI9z^kPw$G3$0TJrj>jR$|LZ?qjulnhOO_003}3w0^w4`eL$ObieMigB?!}Ab zDDF#@EF^J29XgBD_}>4_%l8r^rGwNp-Irs?(2h582lsk$@_w5FJNXwCk-*TODT$Fx z^GtuB_f*5N0ALUY9DU7|{jiXf&v=MBcm` zS1yiu5+3)KsS?K1am!Q-*IJeYN#fZmA|gQ1y=^Zhz8A)=_aVMUBVGgcei(0aZpwwL zuYLBUCA__Xyl2R3@x5h`%lG1YhU8q;3Rl0*@+Xx=iK^%r#p`>jf?f`;bts79V7Y@W zb-she4UHfDBq$tU%hPbNr`M@p41JZS%P}6?(JRyyeZYSY+qZ(yYEmvYNq`vPsAyzj z7q0#ZpJ(nTo&>Q@ZBLQ~{KSjFK<=p=KK^ zN=}7kgM#ZzX^bpA*zy~d3<;3>xy42P3k&SwtTX zS3jRwwQKvKN1^iwoF+$F8l35_a{(tlopDMhj7`$CEgv4h@d$$ZbC60fI1xn=VDLD-jk?8W? zd)9b(kc0&Y3&yw0O0xl_1iE;Y-UVK1h|SWl+>2zN9_^z|5F}}fZE!c>~LDOutgO=!GThWnQbOa6ckNPRkJrq?z_4?W_E62xn_<}69ghcQJjL7Uc zg0{WVkR==`z|59RFO-=DEArx$vBb7^uq0Uutpdg!rL$oQwriSu?>)A#@q)1}=&+0p zkfvOt=fgCr6vbDD`NCloMeWI?7?L0XXkrygv04{c8#~cLh|$}@q&=&w8A_~`!FGKX zoTXHCrsv+vGPo>DJRl#6ntV--wEqs99F^EGiGhfaCD-UNaFkp%6WI3{n!*w)ihrSC zy8ul;#7bBmxbnKll$2}~XLM2;Vd=yPZ2-0HtIZyOg{C_MrZPBJ2Sa(>&xu-YL$cznCPyErwp8$R##|5+V6jb7X~eX52_P z^FqzJIH&*F83|-K&1=+(aM!Ke}f zyNhbi;T@$F&Q0S){H~3BNslob$Z*8d9*!$AH#cpLOVfn+=oQ1yq^jIj;>Xcc^^3;8 zu(1ax_Tcx%-z&j_cEkPIdF|f4&p-FccYtX_8oxb`VQC*mEp;Ir-ivkbJsc<8Xl7(n zr+eY&kF)GRDxy{~JB`l`yA!2r*Jv4rjIi|E;Y={;e5GY*q@4@FN1v0WO^3?69>VbI z)``+PC$6Cd;}Wu) z=HHhg&tyNcEq)*YGe5xUnSH?_nxEFuU z6toa5Y9J_=!CX?hA)d%DFU;~JL)vwbAx~M3$>+U$#X`acKLn}M&iBOj3m zkdms=+eqz)Y)sqvjg7g*BZU^mIpQmNkl)6?C2S}aL{lIC8c@O!P%2j-qdjb1!Kad@_?%K?r91`6R2$0-9$g5cz_HF0>et_tBem_wAlcNURz zKTv&5g}~hBA7;((2O4B1kVT*utB5Yo8H_Cd))EMnZD_OEhVBQHc4hYimPi#>yWa)7 zo?$I#FsVMs(g&rfsfl68^pzRk@dt}eT7CDs`TYQvu?)hnvH8T3A~}2F?+2jccTWu7 z@nDbjXgKBxg1k0E>57fdtEBbNwldEiRJmR7$nFOkY$#(^YyjF)@+G9ytYP;9W>u4T zPN`&7d&v=bfV)l{RktkP)~DQBBi=uWRUuW%3xB9=_XF}F%d_3RA0YWj`A^yXfLzw! z59sI{?+0LETk`PD{Xm0Rc%$!rKv_%L-iA$SIOKkSEvMK%rtxL1Q1A&PN_|zjkrJIS z7fFIj_)@OlF}C<&A59o@Kfq2nY-y$qtN83_kDX<*nuDtD2PR2|Q}!1onsmol`5|-R zK@t`qEU0Z)l&k_u8EUbTbHOXmuQ|Dle5K6rMr9;1t4Gon+ZWmPOf{vu^~h0aDwC@U z#{C9aO2V-WGPERpjeim+&4jF>+A@0YxaCRbZYP-Tx;QA`MMtD!u|E}8`AOq`02SH$ zO278%)NF}FiVV7tMTgvVQeDIi;3S#l+z*JVpn836mz61FJF!6)TgD%FW+&vwTu0m9 zB=-Yk-spaSt+QTe8U-s-&Xo7Vdu?Dz$`M-G{Q&x6if5Bo}GSQ~KBLWt2D_oO}d0}LhbgPraN&{cVu z!ZsFo39#isSsHYJr6~PcS$O=@W?pP;#X!XU0N4Eez^$yAz?K=B!bwyV|3blbYhr}Z zwpgS*9y`YU0I7(QjpF`(fNcpskRsc@+A{n$c=C!03)~OXo?v1r2IIz;>P6~VhF)Tu zCxPKbU3*Y}K@s)yW`0( zRZH1Gh9lAONzKj9Qf!V((}Z{F70Y%%Ah(tH8k(wpQSA#Gdz3?F;Bu{e3>FJYQj6Fj z@9tf;J&lyY#)wQC()jHfhUI>MQA=GYyB{FGvizi`q*DE{2ie{5{^Kmij*6&N%ucn1 zGwy?1ygiI2SN`B{movd^^>%C)8foW3@X>wJpy^P$9}rW7;nl4VZv9^$OqsXJ6PqNz zQs-G(Wp+mrc<&`a;aKu#yq{lFBaVVg@;>zI3D z*cdDm)6GSV0jR_9#jcd>&Es0+DrWZs3>zfuaX)ZO#wANMzRwg?_X8+VseqYK(jK13 zFE7mUR6W|28vxMU58UtF_4fn3jH`n%+LM+ngp)h+5qUt9*3t+gQoA3hXxl|HKy^QW zajyG{X7>Z8LvPmZ2gtv8p6EsM$=n>Vsa#Bc+*4qgoP$eL7KS24}q#n&}sa(Z# zQPQ(dl6^->Yt8_qVsJlTfMo7pbMmB`By;(H{l{FDmgbWMv34P; zC;ZLr{L2S_x%}tg(L|Oz&tWJI`=>G z^1b{$=^%AY_j&>u+MSKc!CWs%&bBGAlYdbW(e?g>K8$3VXZi!3qlR%g02m|zM_+Sg zKP)6OF&Ux`o;ndRpWfM|+%n=Q{o3avTAGx!snZM_{O^@Z61EFTdKj+5N5?HwExhu7 zllHc;bzRrp=e_5ib9ksX+p!ZTa+*;jy46Ty&m)o3iVvR(y@UV(gh8MR^?abv4!|^3 z5P%;Hg9Q{6)A4ezm|SIEk7K=jCF00?vu)VmdhaZLzY8_iLD+U_Vqv$5yet zrz+eN&CA;)vA$=Wa1`2UlX7_-2lh$M zcprew?6QlW<@;;khC#wSdS%<=@h3ltL^{zug_`l{6x91hI?aae?y-px03bp3)pvx0 z0a@UE0HE1Eq+JH8?PIP)M!`BiR3Y&I?h}H-%z$^`eW2QpwQD6|yblaLqCjXl&);_% z5k*Wq)C$5%L-&-7l)T!T)i6w29*8Y}j8-Yv?**H+8WK;4$Qnv}j=__# zszNy)(~;u?Pc-8ENoo~Rkt2M_z@5mV4+S1|%Ni`dvqs`cK2=ty(`9)d5Nym@)#&*S z{(&3#2X5dWAog92S2c7Jt;hSo3|9CI?*p_#UOhlLVGacHnV>*J^j@Mr8T)GHmlKUf z!eIy?6}1CE#RdRsCvHl}+yJ4Nz7jg}K0w4GEOrBn@!c>M(#v3jn?t{}2Edd7$e_(A z*uYo55{)MWR&sJ&C3}VFGV5Is$^kh;sEZ6jnzatEz=#0J)issK{8_?52^5-JH6#e&J#UZ>K@ z6|Fu2_(hWr*;l{}*`)+0cC6BS+yeq_h{fHm6$ z&d9IrnZ>WvaH2rvH3>aN>U~ONJS&5)5rB;T4HA%Rz7JG{9Zk&y?^hU_vLRG7|3-sw zRn_9mU22J%hkXE$5iO@|6vslmL1@vR|L}*3UQ5Nc;@2z}TSqSDY`}S!Dvmg7G|(?C zuaNNIzCk!HnaPW?cA)-{BR^JBz?y2c^waA`uG{VVj z=z+~Sx9ESiP=hm@VY^QXWDh8Y1U!0=(A}uGR<*kLL*sUF^`xjXb{lKV*zyz@*cNrX zNocW`U+$^i3yIM2ftmI-k{IH-^79|IDp0CXQSib_eG(B6Aldnz>SH-2gZLx|8MEpk z)fMGFY02pv1UB0Y-ux~wGFrNdhbi z{Pqvo@C}@+J#ifjX>4H1eY2r#_A&)2I9n<)+HH0IzSOeAF;LYKk@O?lo)M5A{dT5iock^P^j`x8WHo(0x_PenmIZWqoV1oKS zfD-LCJQu{i(GxFLz7No^0`W$f=NR&Y+!b$hrsI8}VuQPF5U#Z6MIxVOLmLzvX5I&C zE=k=1GaE2GCgX+g160oWRM7f;Aav+V#QOl)CIM~Yk8k^wvF^ z=5N3M|IaZ10~6)GaTs}=m!X&Y#9`vGpIydYcNzGrP6rbY+*D4WI_U)UseiV6&GNM1 z;Ry!4y15r!1)a3%cL#7Bw#n}AX5#=f#V-9$19lcm00C>k(&Pxr1hkm=!E{Z`AYmW) zoyD;OR7_Y{2T^WuXVo;H_$}RU(qt4(p3eY3Q_eFS3%2ts+4ru8?fP0#Ow0x1?H!@X zT2U|r8=j9&7Tui5x4Jm&Q|X#QyTtBx&V>}Ao6UxZF<-V1yage@Jv5a}5(w3IGP z&1O%{-;DTt3D&kB-sbh+guQjs_l^nH<`#n1O{&jlIPamlzX<+qd)K?8+uEGv@mNWG#^f_UU#0 zk;J8cGbQ2TOc~CBqz$LkgpngPfBlolbm4aX`s=`;WaT1gDtNOi?tX_|8J{icIAFZPTGPz1ACVZe`w!efNz#li!TViv{}>!w)H|AmH>bBP3) z7Es^zXx$d(mNkA6wS)XrT~Xnl^YM$Z(%}SzV1B#Ew_xShj+gf{Qg!4@u1_$oL<5?S z{pHaxS$J;U?B`eIR1WyjZddSXeNN6rz7jMrhfa@Rc>C>I8X&kO%EGVuBDrq{Z-%N@ zihO4{&uFt|Qe4;s0%Ak<`L*49L#PY2_QT(FeGi za%?W_)O7?bFS63zOTCCQY%XkiI@jAc%J*pic1^qy1{*OrS}$K=c5DqsEG2wuZ}V4? zoPcw$;zwg;KN~akyQfkK+6|v|#iaDBy}}Vbga2rfR1h@o;#A;YdK(BqgTDykS@ygt zTn~dkzRQvZ{D{m5>|RolkSkMM-*Z6@LIN>{e8P$LCUA+!oe4%bklVVwC5PFcEqlNQ zoki@1C?*3VGAs8ca0OsBs8G0KeFY z;1(noCEc_Ji7vH@ec)}HpfdpKz+#)!r@xHN#*DNT+m2C^xjDQluYwXK4>54mK}uE}Wt-bb zx@PfXc^do%-0Va)hna-=gu=J+UA7tzL(`O)RITO;oPt#&=Xhl9j{zsHiU}J+xM0IvveT^WOFm4I;bKAyKkQd8kdw5c7s}i)|$5;CBPR5 zz~{>M!6bGg)}}a%RKc(1MOnk`sVuc0;H39~!x7o-G53>-$;+m+aW_O|{sLMfD}sL{ znY}a7Ttt->VeK0^f{{u{RbIX$3~YauilMPJC={{Yf|>O9$>CM%hHBb|IxAP8J4(gM z+zr4etf~344gjZnT~<}LMM5~C4haUxih7h2PbFv1Q35XFX5$7Yp5J{0p5=NUH5NA| zC@Qd<-1>nD+%lV11Yx9Gsm3;J<*RG3*)>2puB2)T@TLe;@@|56CC}(I`BC}Z4i`iu0dizlT zH%T)>8c`|9i%NNj#8+{u;IKBX04IXLyPiQ9rAO}p)N?ft4 zm6L?`+t^^3?<>kjNR7Qel?wBU&jmX_U-y3G)+)h4()w_+HzM0pu5si6tHc$VfDCgb zAbE6@N%mWf`;i-r4Tt9%^ZhZ1@f7^%Ia=LPrp-oW9bt<{StG0-bsX8!bzXfO&n>H+ zof+9Cl(YGHm`B(s_5F}q-noTtREO#YEE6J!g~#+`A6(II0o!fU;d1U(sI%#hqnx0^ zUyF*B*L|1+=(tKZ6*((h$gq9SSyFGB5gU!iA$EsKGq&}ui(z(WVfEh7;lak?L{B0vLLR32RhcWTZBMLG9WLx^AB{6cYib76jd zE?#cVWS7=~>rLf(A1^n3c|LVB@5|0?f|+9g2VJ&A8bGc~{3D4=@p6+uex~#ZlIu&U z3Gmm*&*YariA(`tX_|5M<|*laIe zZos{%EigK8fmz>2o`uq(G1vUS*Sgu{`x7x}UIRmj=%f^&GB1R-H*3vPad-H2lb4&D zI|P+FlU{CWRU?Z8X{;3vmOfr?ZmwU?&rk)|adPKnU%cD|SCXTKNmeRoyxiQ}prjPO zb+dlCsS6z7Nda?KM^wQSFDbm-Tz`OoD6}coO>w<`xuKj(ln5q3mvEY^m_6T7tR235 zsD`NU`lko19bRs30(Z=B@^S+!zv`EpJx1}Gfuc6wLT|jUNV9P=FsU83{!ahg91d~5@q36eGy&&j7Z8*^$agJeVp-flN8^M zW}rcWftQ;k)V85YLT<|EdJeL2h5t8|MN)dXLEoDo8aHI44{$Z**u1_|*AW=Q$jX-+ z>P66G^ZKTz|Iy10kdJt|5hUZwO`Bi-kCz*E0~>TBFW)+F!25F3=H;dxFE>-90ta&I zFkfz_z(aIjZU8E^#UAdy+(;T&Dl+rsCc!6^=>ziVAb&cUsXD$VQpSpQ9O#jv|45DSf%2d1yY4KbCE$Jk84uAV-+Q>=;Xnqc1lg zI>h97l&(#`xK3@|ERh#4H>Y{I0f-YXH{e@9t69VGaw8Z7z||CB4C;1@=KlzRB_fdn zEkXdB2*j`xaR>;TCEc_J2{^TiVNL#W&s45wFGDttjYeDo0~VgFE>DB$^ybm z)TDGGh3M(LmUUllxN!4kKoB2;Pa-2gO*tX>K&^m1jI4dRiD+Jrtk!QP`kU$H1{J_L z!P$)~xIm0FQD6X9=z!p-kVW~(+Sp$^H<2HLU<2hsxWFZlGRT5S{1*)yQ4&QG@~pjC zURuC_himuc1{PqeBIML=0U(esH-UlrCg(TrEBm|Yg80er(&pSUDFh=0yKkQd=a-Ze zLxfr)@R~Otp*Jc3XIubm3&ateosi-pqB2qizm^we4bCSewI4{UALFVe<{K|J+)UpL zUUou`yCEv`7tk7q5ilpoeXv_rxTzLvzkaz9AI8g#W!Yb)0)lJ}3U#SwCjH0c(57yv zCSGp%zXBb>%!0Wau2GB@yD@{-y4Ph@Wm_bKXYc{+EFYts;4ti^g`RH`o{^UuZg8x) z`)GTb>%b_1Gg;u4KvZu1066k;(+$~3w^9wzfPH0q4K}+5kj<4;O@Tx;1TlFx0q>G$ zbejB|^apw&P1?uHO`l5SFwJpQ5Exl76n;~5DnMAHHGZh3B-ye07(DGsgPfrp5h&1a z)pP-ic+QTiHR`jHUQM}xIGqkj&DncTrmzztMc)4j4QBgW# z$MHADS-jlvLlxuYh5&aW2-C~WJMTPtM+tUpuPVt(YttJyZFbPK&B2Z1Rw%>cGF3;x zdAXT-=TY`f3UlWTvynuyRW7W)++3oHR~a!udp2kp?Bs>?ax?V^nS_0$SJ>H<=?D$T zSeeTyZX!Y!+yEAs&#I8>GgDvr6^l#^-{apRXH^a%+_fyxfpSgIe@Sw8oJKtP)pb0{?7^ z`Pos{OmYm#POma3H|7T|LdjF`qXk;sQl=elWgRPt&j%}Gih=MDPPTNNc6zz7+Sv}2 zy=gha^tW#FvG+OhqHz8g`BELK%iV_F37Gqse(Xap`Yp&o(R#ex*kIZ0$5Boo?$4{0 z9Wgfl4%Fr<8VCdS<;F;U3zk%(F&mA?A$CVd245I2H|NhE<6%N`E+g`rmn9vC-J+!-#M|4GBZcY=m6Pc)Y{@AhSpHI~HP+XNMVS*4sK@ib}dvrnAEo0O(FE^y5 zmzyADz~zE3H{L3~+@$+~8Wraa*WSyG6!CJy@zVVD;^yY{`sD_+*`;-`hZjM*wTkur zqPRF+^k?Tb0RXbt52)M{X`s?B@sA`f{hKKXv1m%ah`;`nn$U}+@^TZIf=at|34ofc zTmWT{YoR443v<`&@y9ryd z1*=8(@_t6arvV9lf^j7p(0uGKkNP7Ee*z%f$FIt%94L);yMkBib9+#+5;R?%9>H+& zVl54L;u2-ySACJ(L1U6nhN`smPCsWrI+Nl88Z#Rt7+S?z66!^&1m4v;p9vbiSmFP) zvPg=T8-BvsDmG-J4{$Z**qqp@>j=PPWF;_{dJzH2{(GM8f4KoSMi4{(3&>3XNH#&N zKvV$*75G7Nf;0|+cqEh=ThO)J5Mc6|%*zeiwF(r$a|6)E?H5U(0H6qt4sZwI-oO|M zq3i)|!+$dIyDVt{!^n)6n~I8rT$#MwRL=(avmpj>8ZS3s5eeI5?gnfUwlvh5-jc)Y zPXg-lzY*q)C&dZ)i5~$Z0q{hQJJm(+G&PW%BB2c!6sS6E7`zP+FE?ymnPQd>QF&Cr zbW%pd*e7t(i{0cm^5l zYzEyB{bGXJny!$C=?D;|;0yXhf#5w_hEEf((X1YbY?%<2L>|B{83#T>V1>v;8+gBf zCE1DK7QPrI-LwV?LbZzIAHh4Mwhs~e1~Kal>n6OVRc(+AdWe@BFe$=f!ASjxbM)E% z(IW7Y+**8t7;n>{k3^L;!OZ}ng2gtePk$NPDjJk4Hdv%2b8~cyA@IB8Av%#dNXd$$ zY;yo?)U|%OSp-=FH(;Uq}B9^))EL@ zaW`DXbK`|-dYU_cID*2)8iW~K20A6?5Zu+v(FH;7F$VE{ES_q58n{uf=RoqT1A`3$ z!2w7aS@UuOqzb^@Bdhg%qMwd#|3LtL3}a=mKEn^bOx!dfZRhE-aBv||ePk^FX=fVw zA&8PvH-r!*QWk7#cake~s0f@WEE1H_G+0C;;7zmHZxlNR&Xp5GkXx0|X=wK{neuXj zSPCNaaQeQoznU%x24z=gSnH^a6zslz9?)V^Qb1Io#bkYi-lz~dzX4jb320D!bPCi+ z75rLWlm)&PlvcJv-vHP}9Jt5aPbwxa+i$14!OHvvxmr0OQ%UZJ-Lk?>wOIQ^!b8Wc zmw_nd)jO7Df0c@EvNb5wP|ZyG8{|NANPv>nHq=?Q0v!R)g1H;QQNS5nfCD`PLYL&K zGOQtiY9XD}$0!Fo7qgdp&PTr|&Rf-=SNGvM$#pQHV6!Z61SjOy=R#R+sb~u0xMiKA z3~c4l8f?}in6;JQO0Zh7zusaXk;yYUO@5yKK;zM*{Z+NeSFH64fIoq_=oOWDUZ|}> zV~ODSp_-Cp$LbHTnvk`A#Srlk{Z>t<&QKC4e?V$Uqf3DrWtR`mn zO|_b|w52M-BzlL4o$aYUG0GwsI__UN1j#uf6CpBG^k(WA+T^M^y>~-Q+dmpTFK#=p zDoNnx5WR8JW_R1v_Qrq}%J8@x{Z|0#O#2^!$A%Pd7$Q$9lKq)s6=gp}6|YXP%kRKI zgO>4z5aj<}HS>?id_kE=r5_+us3?eOWiETL&G;D5jvfd)Fe;Ik8>AAu?*&Nsv!fEn zj$Mt3@<_h~whWA#yUI~xCPLKFv{vGZ{j{1P3gCeQf*T9(cO?2r%quf7{6bB?0maO% zRS`tbh;?Ew*#nule*wT$;)+awxw#TxNjl2Rnsx0MlAUBonrqykS{cN63VuZFQPM(M zl=4PnqB=p1*U|T=V|l5)eCTmJx2$&dpk+g3&TiZwk$9*R?{fq}f8rGR(x+sx6o|3E zRF5gF53cC9z#z8~nscv0oh^PG@uC%Njv4x{_MY)K^|nktb{ z+0s|_Zh%{D4z2Sfs7{?DyqtxMHE z_0mg;`W}j_vL&ohlvG0N<$H8N*i#v)XGFpqFE@#h0hbHD+<2?-a$}p57ghu~O^fQw z4Z&>j+(;2GHynpM(>&zK1zK5V$)D%lO?J z>8#I!!I*>x;&+S8axyW_Ulth0?zx!66n8MC8LKe;PI3P{KLSn4*Z7HIBwK+46u0QP z_(185$tZ2o$$f^sZaN4L3Szv*BOMSP=#q7SYhov`eK8xckzF(3lTFBkZ06KUlk9|F zekSUHv5TxL>dGyPy=IiZUaA52bK^O(COAjHBW+pp6c+hKMETnm5JstrR*MMQR26$j zSkr`0n%`%4&zt1iY5W279=q^LdxCiw6;L?j7m=SJke=sMfwD|5kRx(c`NAcYEsb)G z9%!EG*UdY@PtDuv?IL-*$BOHpiL``#eTMw4&S&@<0r3#^`IL}Xd@Fd0`||_f%|`n3 zYYQ2X=?E0Uu}OGAE=7tY+(7w=#5_hD>zs13j~tv^T*7MWlIeVcqrYFCGI(S+`}AEO zAwW>1-Q6RkRbe16WR_+Y8RR_B_^z3jQXcM+!7|z38rkkA&=4Gn8@C+ZD&Tl5mg-(A z@iIwCbRfKny-**>i`xe{_9pM&wGM^D)p$+hWfSC8lk;?~;E4H@6Rj}O5V>zjWGIk8 z;E+J{au#|N!y5z0KhqaV^eE3@WgeW*h;2hx?;;s#kr%#t$&QKd6yPQ#s;QT<& z__@bflk+-2EnHjK$Je^Hl>~0d)*@|>tGE`PPAl#S7P?nRN-U)9V*%k!TU zxIX$j@@%m_umUN0m~YkSnfp9bc7Md=J)!x^Kdg_(8wX1RXn5_*_~2eIH-^fg*UF&{ zPK}=hfXuYxcnnt8hhF<>=d~g5B1X?blhASE}tGY8p8%zyk`0a=nhbR1o*3+TvwV9Jaxt35L+d?N}5|8JkSY=#{_%| zq;7d6Xj%{u`oZ{sz2Z4d1jk!~b_PA$8s0(g#^bq?3rr1?!7AbNKhg6yQ1ciL;zVAciIs$e)|H*%@*wnJz{#_h$MWOy%IoEb=;z$T1C-(f z^WC(|>syHC>LFnjp{~dGUx(pJIn2hMNav*d)?06V>sxPeGEGqkIww$1$Lbx+*eu_B zJ?O{B6Gu7TWf+HnF2l63z!BzB?{sb%v8se=8y=?rE#4CXD7#o7U}rQjD5qP1<$%WN z6xc?qp4UG?EkwNa-g|Go^&TgPC>!?zUj)ty&47#B9sj18vHp@v|jUR!++j7V>ApK7rGKFU($To?Yjha-bi0&hp^! zgOb2w!@|-)XoCBp-Zx}=8w^!;bSY4YBIgLACPZrkrg8fI_|JyNIZ^@vWWmj7oTkJD zxe}oeiG3N-P9PDoTMz}CM4jARNQ0b^$Y00(4`iFTEDn7J_&dbCHMG*YZP+7LToF`2lFsl-)Se zpnMg`F*@<=fpRnd+Wgn@gXEfhjbRf=oFL0_{*Hocj-1c(SR#vsYa(lR@~>s{J8~q> zoFN5TypGl-twQBr%N7^_9o5;(0ZsPP+gZom@Yqsqk5ffwd!!^JznWz8Tk3>`t=UO=)qyK|YU2?xX;w#uUJS)ek&g11WpzaQ**)>L$S35i~?&n|o zS{~${!1A?&^P8N=u=)1!pS_Kcj7WvWS*a1g+d^dSSrTyHGm5N6gh=7Y{NE(#ME>#+ z!Xvw}($xv#-J;y3r>m8p;{lBZ+D7m~gmoL@a9ypf#$9B*Z9nDnHu3xn1!yzwk{+r_ zF%0KcLG6*3IJfTQZj-XH#~hwBpmTKGa_+!xi?{OU7-hR;|Fx0lEV9Df!*@0qM%~z8 ze)T%$9>AXt$0pI^xTLukB$|6;o(+b%XV9R0A34aMxTLvPlWFd8Iyfkg=3csP_UXGm zM*NpZySqn7y~99WsHO3iGQiYJ=AM~F%ELV}Sf&PBW7~tok%1#|Cvy*glIC80$vZ{L zO(=KGy_@^Yy{ok;cNJk^Sj42Y>T3nZF!!$4Gz4Z_0>lLVCAU*7;S?bV2$QeKPIBW7`h+SRT$Je^Ll>~0d z)*@|>tGL>=-L5~uLiY+uiG{R%EMUHBDYdyrC55?XTWIc?=kGN42v!y59>-mCk8{nv zOXWA7FY%H-{|!#N=3dZY$Naf1r>u=dVyQd@hXn2h)q*4`APFu-z%48z*f*G_#VYfs`t zuC-?!A)$4Kjk*s)zu($BgCkrxXl~*GN};t!vs~IjG*^Ga+PhSOq!c8jbWX~-AN*i$ z?gyOAhP8)BKUsU{EhE<6rJx@jO&sNDmtho!WbNrm*K_{PG2;=1wFeK@p2d4YKv;X? zitIL6d&fWzffWjC53PDGeS%tu_`!!C{@@26a)Jo0JwY-6PxykN0gTiJpAgpGnX>oH z7LVRRtUXH*)*gTxAQa1Wh`P|r2k0!;-YoDto`|P`9MsmH;4HKd8u49Lu%9++80A1e z0B+?$BAO9a3bYzwi-brdYtMjkfJ(A&F2MyqC=ma_v;h;FX=bB88+21mN&v(paWfbv zYmY9Air+*c*pIuQfzBIkEYMz9dv8Hs4z`|t=mC@)|3JPBCTow@L1Kav2sJ39bYQ01 z6qmYst0cD3=+oKp4UgqpwY3M33nr{RPz%9D#iM_d{X#Y3-rAadYZj(#HhU{sd!n<@ zkvtb*TL+;K)}9uM*4|iaYG(|FCh_Zb#*(!M3)UVt)B@I?co?m{K`|wRQVwns(QPoS zJ+!8yV>{Rr%IqqrGs-1&tZVIoyC8*+2pT{fR|CVu!&v3R+7l9zNN6waWSH0BiaP09 zdt%x?2_hp78h-3*PI+j5F7gbU+q3qJA{LaRNQ1Hs1{0llC_uTH&;8R}vi2M`8}E_Z zC7N~=mQfg>Kh0B#EUsTo*4|w9PdjoXPOUv?vG%M>T7}BLN*GUy&H${nH<$0Hx3iAA zU#z9twl|&bNkjFPnq>d9r9NTprIQqV>x<>-FH*MAvNhVdT8_rx{~%PC%CE*4>>Hj% zysj^nKL+L6A#_)El~JXgtUY{>L7wY`#N~1DpEfy>VRPz>-&Eo35B>7ndipg59_HW`GU0yc8*ta0>uF;Ea9S8ta^LvX2}nL|nq!>ylyZdD?Ev zgSA&*H~aKmpCGzNq}|;k1Ze^Tc_9UK~P+5_-RFTW1}`8dF_H=$oHcPJcCo6CZ8ngP;j)z=D+Jm`VJ)HHp;;&Of$0mkSxpwFvuI}BWz@% zxKOlviVxcy2Bwx7hk{ui_6}~Ai9g(DHLn3df}xGdr^`~C&0f&l$&#jMr)4L;5`8A&Rm3#d3;W< z)eHa<(+|A(;@y`zhz)Cx&|xG+BGw)nu2nC*_@bgQ_eiLUlRK5>UUja&db;1xN*iSH zlIh)GU@7;9i(}2qO`w zR|OyrfK{u1=bVUzxrz(8#t^akoxpV%&z2~-Y;t%vxo0dRx4+8xCxIw11EfGZ+1h=63FHeh1Q z!R*4%2Hbj(612PA44%m)EDnnBV&R@96x2lugQ|gl!Rz}Y=&OO&vkyIh`{5tX+JVZ+ zJzEEf$-%0Zwu;h$A{nB%G{=uBLf2e)HXGRRSp6u>J+}rGy+SZA{J6nI#iM`oKVmth02FsG|ILVscIfsmTnnSh~5c(R=d%{{?mLNvIc zPzpaU!NBOaZJu=#Z7JKE1ng>S?nywEyL~b}p~^0Eg>vaNugyIj|D@=6<`1{_fx?o;|E9!(>vtV*BP(Ggo5doh>VpW$5%0v6Jxh4;>uN6%0@z`os zABZpr$_q$?atKr!I`Qm*a+>;j6jde+@Q2Cd`x$mfsxmU#G-Y&hJ^@6)b()5#twncP#8G`Yv4wzqI{ zj}yqLo1@jqqm=DJ)wyOVnq?l`UkC2&GNZ~+n0v+7zE%Xe zC$Pli9{yCQHZLCi>P3WPgc&PNhPg*ALSp8gB?0$6qsVGhG2|VEp*gcj1<@-)2#@T> zN>?X{cZ+hDo_@5N|Eiy(fu5sYi9Cj|ZbM-11t;bnGKggupNjPZ6?l#dZD&Pxl}4BFFZ^P7rYPx4~XSxJy zJgK5Yf|*W2D9Ch&ASSS?|1`n3r{j!kaa}=M?5sm>c$(nOr`q-S~h z$YC^6oDMkx085A>o$~PX7B00!)PI?E*{js2-g#Azu?x3Gc;y)Zu zv3VAWJM(>q`Z|<)AIeBL!U`Kg4w+@h4YHVEOgEpGJ_RYn04&-h%;+3 z&B263@80Q=Gu<9BMUR+m9^WRed2io30n?8kpPi*gOht*y*&{3>a+-w6u3k<#`18or z_N)Zd4I-y<<@3#FiL~t%Ym3D~1Ypl+SpquM;@T|R56lw6yveL^G0XDV*(8J>G27u) z9ai<9rAN%h8Q0>vxor_!o!pp>f;*pGBCW*r<7c0cmg2^wXHC!8VKh>llXk`6ri3U$ z{myPN?UslJ53_uzm|b>CI%UUtWNBiD1ZXJXAQY?-8zhtX564q%pFrZy{PDwsc=wCJ zWs>U*q}wSYA$r8|inVC$10mVIT*x&$-WuF8DI=5ABM5u`sm##k_->DYEqVmUPxXk3 z6)`OA@YSPOWFdpE6&Sg3rJuAwW%By67M2h;OYh$4k#np7xIvMsnWr$4n*-ZKw(RX+ zCzj>Fz~bUlghZ7c8~O;yOD!p&n!TKI@aK`4?L`TAg+k;^u6(}v;?7K5Nm*x$B}v;b zwV+z;nb}z+{$+DUMOkyOn1o=5EOur}S=E1$fSikQ#^C8P`}q*hJvtRJ z539!i)*&B`RmXfD0NfF^@;dXLfKILvmZv$6C-i68+qkU9O9JHlOusKcfxfeSF$w=s zz+kS3RA8tjG8Lc|X6h3wYaT&H0DBl7hUx9QFf*E-J#t|b;jz?Elmsvnrgrlz~ESji#!N!GTb75Ak)wIh{zwdVc`+LG6+4! ztOzrfFo_QWH$#{jHo-2pgkcoKB4k=~7_af$z35kzt=C&u?vZoE3X3uk86|$_SGGjR zUzNUo zP;&MvOyqlIgdjCM|8wRJT65dvLuX=Fyj5!-6ibLAgdGgV^HGXkl*)WGWewR*v*9q|Ex3(^Q>r(3W;SW4x7vXurVr{&4bo<0gx5q_< z|7UOzrm4Fyt~06IJ1wm*&b>HNw}%sdTk7_l^R%(sUuvFt(1#$z zMIJ1B#Uq&Mb)nmnzohz!bZ&OLJxnXO4{;!}fH}IoE4&M$)X?n*nLeMQ+fUK$FSX9x zBj<=B5oIE)_?@5G(p8vW!l&vw<2dBxyG(uI#f&AsgVF8bz}H1-A^|Qoh6|>49Lh8I z&7Va6L21B{==M>6R)XHY))|cmwW8aj6Pfk7#SP3J`Shjx;YQxqW+C;&o%SJ=qMS*VtIIN z4ZzukiG0tD(R>&=-EQyC4x7KMTKl;3Lez=}e}t4LyFIuNi;7=RqP_h2nF`YF_SOg8 z-lz|eDRD;7zpHd~`_l@kv)~M0`d+tZ%93f!ORf%>t1b_)=z#bB&R4UG%wb$`QO#GK z2x$Jr*3e(LLWBhsF)w<~1q(bhXR3Z?F?o0-Ru+LURmMEn0Lw?37uj`y>5QSj_zPyV z=&}_vp3L{1W5pNTzMeZLNw?<}p0yWFx-sv_%nrcQn1G|(S9JSx5Bif?sbeikQEnn-|){ZE2v zC=TVh`{qv~|Dbd!Dc!z$6!m8%I1Ac3#|p#H3d;bU$gJO;49FPzB!g~W|0KalV)A8P z89wHNv|p_BC6%)TutUIo_~P*X^AvX*P&` z#f!I-4;{{3k~-`g={_8w4DCchxz9kA~bk{Z)|k1R3W^;?pU$*}oPsY)W6Nz$$%UK=N*I}; z`RB|jX}wRLijxzw!gKvpPmVDow}yltPJ8=1#Cz|ZBWEkBKK9PN24ZbJNdtZ{rG{VvDIbN&2bVfHq9;CO%d z8q-V)pgd&0dqPxWFsIGo<#A*r7GgHq1e5Rj7J!XjvsnsGQ+db;? zmGdtYN!W9eS2ONoO&MbsQ>t~8gl@OeCz+W7A~xPE|A(5^%+8Z_CCly3!d<~~Q~%Kp z)6?4C!`o0)#FpHM%9-SJc>Sz4wi55w65+9W!FKoY+A!GyvY$^L=1be1eK#cT)<{UG z8-uOOsme@pZjpn|pN;%VK)f?*PbkGJ+qHF6akq1kw``ppK<$z{&ND(^f?9^H7f>#Z zGMv*ATjPZOWZI1aGiZz)E;}3va%?|5I30B3Ea@5FyhaW8Im1W#1JcPL-TBrPaXe`* zyKXsI)m-F0zJ)e18JL)8)B5)0j7!8?hKUv!ne3U4*q-C#*LaVlr5PrRX)BcX1>Wpf zpyY9hw-GyrBO+-%lZLNuj<3WVrxqG2icaau9CLDCpMjLjz1nQZzXygp|>7gD=IAOCkhkP1(eKP(o5HjooV&t zOkL8uVJKjzAZ_+heITbCrfkvd&gLy&t6Bs{r52g!VfqsKM7wF%q=T(c&z1(lvULZ{ zJ(bGM|3u!a{cdp|1CRuz>iK zuu*4&ryfuDiE52JNMgL}Lp^wWqK{A#+CWJN@ApZvkF7aE-7p^U9He@88R;@~4`;zM z?rFyCVsg_W?-h(^%E&6RXd<~Xq*;vV*KSQy4ZYKjckt1RsAC2%!@ox-Ck`#YJCHzq z>ouqPdnIDJ-nn-Zw=iRB>ec>u!o__j!)w7nAnmtDe1k`FOv~Gl@L(3e_mFBssrtsd z13|4|PFoHPU$@jr3zFoo$uJb_SEdI>`3JybF(YrZ8CHt<%C_WkRwT z`!WhZoD9~n!9xc8Vj`fZkB3-vpezkmj$?zpCh!dcj=j6;Xs{x=Ggt))1}jI-lQtTx zoHYm6A}%R!+oH`kj>mg)Hnz&!z1i~#nN)r!uiA05IeTwj_De#Q)9FI zjfKHFdQ~#_=4GdBj_4%Rl}i|`P)QpGtAwQ6Y4EP_KbzHH4Jm2?jCgx&HW{n{Q8Rr$ z%oGV8b^-_TWrz`m(j~y-!R@EV!eC`R##P8SprHr1#+drDCug%OV0Yc-mC2ZzJPg*+ z9mzw3F__Ff_0??lewSnH=|TRO8w!JU^!>rBlwSdqhs<|Rh*S$~wmG;wij2f!99tTP z-JqGjV|J}(vlN`B@{kjJqZw|bE*rUq!Aj-)ONr7&Qu))L`K ztucFCaC?iMm``D_a;Ije-wlboH4+l)#$a!4s?v^|bBi2=JRkd&n0_68PbkG?>(zBs zaXW6o!`mn=*1Y77^NetY0Iy-|1y@X?uRN4$a*m_cIz*>M`W z(bm=G=;l>w__z*8(jQpN?(~>-MQlcz%dT5aRW%p6k8Yt&_$m_<)l=V|oN;M2m}r5q zsh-&t;~tKV5{!40mS&hNX01?W`Y>2oV&!p(c|<#gBO+-%ZYIyH^Gdj2ZKbL3wdR9M zHpQN-d=M`!JjYAM5myOtZy8}(5`3Pt82PNF!Gmnebp{`32YX^y^yVlVejiKpHbQSb zx>i(JHn_3|5CJTQobrdCd9e76C7* zMf{?8SD{a|n|4h)*a{CgRrH{b(hY4SSW$SF)pMD4S*f5|Shr!z1~Ky} zI&4I9h2`EDWNbaZ`=2D9wGNGm1u5QW402qjO9fYR?7j@a6uhJoau?sYTx)1Zk}Ecz zWTU3&EX%9|JYH+ZPY2;1JpaK{kEi=YwZH1X5_hBFrF!6tH`2>Zch>O^K6(*# z%-}`8HyW(H%HJJGpg#7zNCXU4?vR}OnFEPim@zf=>R>$K;=YsN`CwS45GWl_!9Wez zknms@!1s`9L#g`4I}bsvSBpoFCX&w#nO7u1PkRaV7d1yMr#p~we~)j~T9fNo*)vPr z@5B~2;}Q>M#))(<%9QG@HM^9Y3CHN$R1n1!wGrZ4V=LGss0br%a(?R=N~k4D(Xu`= zPnYGf?EEKk@@KW|iXs~c&0JDXT#Uf%5agn}BZ?SqjKRN&Z{gB|9&i^JtQ9k?0E2Z{q} z{VvDEvu*zH>R_FmLiAC9zs-T=3&=<;#8$HjX5Q8FhF`2^vlN`B z@{kjJ7qS6hGBq2yTD=`A=U*t2*z+W>X57b`GA5=arCLWx=yof823!xZ#V$0f|DmQe zvnZpkWVzj&wJTU|>Ob0HaZ!KQz%~>WG2k|$awu+dVEyC(zAPo)ttG-^^#ZUTz*RTX z0%()Z9Og^goqRVW?$$_1s2hXLpQ%bWq|LcS4vIdS_?4>?z#~1W6mHVXZY1k|(ZZkE zd^XVX6?dFxYi>qNPh9K;8I6_$IW4hufe?LwmMAcT#>C-@MPxGsBefqMWJ_e|F0iiZ z!scaactCs<=?_RZgZNli#M`5}?7A@2T;zUX%Zk}!qD|}DlQWozi3$@fFfr4!7%})R zTp+;e1zMV6vRJf2aX#WrWtEu6rM4XkCdN6^dfe@t{$)?zomA3(r z!2=Ykcj6&~#AUjRoslvC$)d%`XDtmLWLvSsP1<%3qn!dC4^*cTy^YXYkFFIJmbF<1 z0(Ai;$S->7nlbLIo*dv8y&HxC2FlxRQY>ghf2A#kPi&sjbKD|`A+-o>3-A~8iFQ+3 zI@pSLq^BHPCs_DErE>E>k@srbO~PxRh?s4va4o%T_d>_$wyX>ocDy z*#P^5w;c=|LK#jgT4RQSobV~vA`+oo1M$~0^KpH~K+VSFGODKTUwpkEaD&Xy(M}RsAC+^D-Oo@vTVWtUmPeE&F7&#dUaz7h2MQ2%N zDPss!$Cf-19Wr?8@pPZ4*2IG(#=Ab$gU2WOgfWuWD{@kQoXy3 zj1_bbF@zcSG-Gx#vuTm{3dS>KVij35kz5(lEXLwXrxvM(-bKed_~=E{F@qQV-Uy%k zMvSiVUhcZZQ!fdW?3DQ#1GCwsr83@-%(0dFr(=ruPN=$xlZx0=0Tg- z;$~dp!OS?3?nRkWy|osX!t+0KioUHLtwlklA+9yCf=z;oFw!O`woajhT5>bfvOY3d ztaB?KR`%zu=;DH|K>t?|F+N3vIT%+(z3 zn=&$z`|Z-KLQ`K#LjN?|Nk%(f+?Zqs=6r-eJ|o-tNRG3S zW$yUlINLPKxu-4T$Rnw8+`;)s-$>ssRbO^%voBFWjY_Tju?MO9vs)dUU60AHR_#u6 zghl&Lv-%t*AYJkh;`{I10t|u7)u84wsE=IiMxqy80lkNs9$#IS10{hV56nfdNA@&d zf6Mg=lCnVnYZNRL&Nf#os2q!xC2b8L8^yHtT;fa$PZD@n{P}R?I#NA1! zVB0v3wzj`nUPZHV?YCavA(B8%P6bC*CkDHTU8I~$4bmDRY7i(6TB6&F@<~{7+r$=w zpzl)zG*UFyT98;D0C4zUH|M5pOg$2RAjmd?Y!Wm`hymY1qF*Y9jp1%>^_d^tWIgKD z4nQTOW}+TP*!1)k-{=+j9hC19#`T&oHGO_3<%--Lwq+dIsB^rtp86^czYz^j!{K!e z4WuPpXE#$)K*8AhHapZdIM+Pd&RO4s{@iQvn=Y2>0>`cW!k#Kk%jO0$i?*o`WL(6* zoLb(s#RMSwaP}@F;torAW^+wO#7=oDN^U@pPDD0T11|@>C7f2zQxq7Va{@ zutEgf?Y(Ir!ozXtu6{2aY52qZ#5tZYX^EMbv*CM(HAqYY5Zxh>>NyMOi)?u7z^QNm z^8Nazo359Dn7n|#!Yslg+yc;m9}R~Xp-b6X31=w`%nsop)l1LK8+o+YV-(hY+=P-{wEzMSAD`A3^aoel!}Y%=Ar*ouRa;|{|X;F zjl%y>Df#)JX_ae%(tsNf@1(ncle7QT1J5_E(Vyzk&VCALA+CpOwaXbO89A52BbYcT z1KS)a-XZAXAN8tSi=|;($!IX3d0MOH5XNeP!-#u8{FB@ zPu>q~rWv;#Q+uqGYmn|5gpBKqooH&ls_Vi1ej8paHnLjmckDLYq>HX?(yIb*L$2%c?ODP z$O-N!Wj6ANIG-8a&-@d1-qb!jkMpqerfNHHD%p8c$L2)&pBx4?Iug2o%io1Z<@>=V{81c`L*-7vSY5v&Ld@PEce@`(ax(cB_bZ>y4503 zRhSi1z2+&^@#7#3rou4b;>MKE#4+r=vF&^;$4AEl755cqn`RkL&x2#h&clnEj~yR7 zzDspHJGOZ|Q9+GL*m)kzb1*yB!AGQ>SF3iuIab?wC;{n`hY&w_{umenWNPQBB2EMB zJSOs!ohQlwdJi={E-vi6Ajku%5bRw$Z?NU6LrDwVVz|x879W*s5dQ-^&vwLK=;0W4 z9>=irIEJ0aG0ZlOVds77db0E4@=h+OW2$BdJ5RQ$)F6N`axoTRfTeDdPr;JgCiEP4 znmhg}0vahAE9^Yns5A&39W#NocWl!(rXI2Lf-LMjR+X@pUvm;z2#J2R^Ju-Th{jhqkNYzuGfUA>GSg`SLE)nL)}=|dE|J0J@wVF+-zDJ4rgU( zAT3Ldx|xy!c*NFEc3$9XxaJXkX}|}Axt$<>)5TI<;P13wgq;UX%jQmYUg`rG7jet} zZaa^~L@Y24J5O)nY`DN{JC6lGoinwa7i)t_#V>@jMmx{tH!ao#?evw0~aRUM9!sfq$N(ufbAqNeAsz7l(F+dH!=^e8FrrK z-AQ7fWM*B{d$Nv|onxKd|Eg3oW9L0>Ii9w@KgA2G!b2^CqqXy3;OR{7z$Lv54;06vVT-ZE z!7s+O(gC13g`Ec_=Pu7@KT8UWAW1pc!jk4=&oU-Lf^Q!?j~oel*-StP=x8ZGFk{a^ zvt&Q-Vmv^A%r?0Vly5fRH3EQ#H=Uc$dxT>)cAu-E=lO*95Rbwb6w=iZUdC5F-!&Ii zhEQ|dp&Ojv(7ike+N2q`9d;h;-y5X6=q}?r&q_2lXmHqh=O0)nNW_iKCvx7k^Ws4U zj$j`^ZikSVBILC50tOOQgnIE&bonlS+IfzG%7i;515wm#9}q?CJiW@n9UkjAqw)+9 zshuZXlrkH8M4ebjGKW_?PbA3vlWJq<$r^T^e*ci03gzfSyM&#GCUgk$s#WG}zPx(c zeSE{tLj$Gl7KopNVdp^yW3+Bcm2vd6kcqCH2lyu80iU$&8%_=nYr9?!mCcRM+p=wh-W_rz2s(}F< z^fP3%G%JmOed;gAa@#=$K;n(%TKs5B^g4>1iO1>atQJ56Q^*!BXc#VxeUgj5Gj!8 zbM5AdE11uV zHnhQesA}vy8s1L9PN^JiZGU6u(X3qit=D&mrc;ws!BN$T!ERy~DQ8lHfL$Qi<4&8F z==P#~2A145vBe-5_!L3x@JVB>1qt<$1NWd->gL?Ejj2ZhOhub+1lbJOgAfCnf<(Vm zPC@H!(V!C<-Nfx#Z6{On)J)XlLos9&`us%76}j$6JF$^+%uf*2 zv+hY7(eN}JKEBXES|W6IGbIJgg{^P1Lv4d|&7=A zfEKa|BtQjxJpI^tZpB*xnehUlWOeF?|FMPp9Ip-Tml<|dW9=~hu(Dt0S#r#C^F|&m zcAkS3_s+z#t@dM_|N1udq2fp8+nFeWqd>uoGVCN;>_P7bp*J|%1u}?BjWYv4JPE?&!o!$TYMCaAU zvzFso>-$r@fDx?3-yxXjF;B3dCA!LjoyUS+*W*SlbT$1AhPhz)pk0CB3b*#3$N#y# zs(E&Q{wz_aF7U$bv-9?o1`>fvrGHgn=h3-zXVR8Y&)kHP7wtIclehBqbaE9tuNpWB zHbrMJy@5`%MnR&P3J?sC_{*-uctelI&XeIrbVoe7%kV&fD^(d2iGyE^Yn1~)bLJVU zi!MtU2)e`8epD=iB;{ZWOPWtS%a{lWE^)T|B*!+Wo`fHOj+Uwz1fPLs$$nltW=R1s z#ciN`vjOJ7Si=30dGpoBY~nswL(du}A&i4DD5R?+yo|5(G&q8bDnqC_?$8ZRZ0MD3 z1JY=kC0|CLszJJ|%(DQk(ZTt>*>-Ee)`%>^NF0d30srhU_LJ%WVqk=;mUSc zQ!lU#J1?OpqKZ&2K8mjH@~55WD5%VR_%=`#UIp2=awD9v!5xm?IHU564XK?cT@)aj zcto98NHT{PJ1+nfH=b1c23v6Q2k$0`w_0v0l%o&rqMc_M=@8^qtIXMr>hekAW>$m) zx(jQ7<8}+gPtk-Q5hv&djM2J@SH=q`MH<|Q`MiM7B^cc{w-@tyH<-`6u?7)UT;13= zpLc`#JfixvSekAGK7;=iofkN|3t^LJcF%E4I}EzLp1)2qR)*30cyJP-ucS^5n)n62pXK@sd_Rj<-)#mzi~im13I8U$Ku&TSC(!SIfwBq3 zsfb6I;eR&Tix5gDd8E^VOk4bi_R5r}F}x=mbdl9Qq`*0CTxS z6)afj^QDrlEzA6xjyF!&@v`hJ9J=jfPLn0Bo#7%}c3wZc;2h32OKVHXTi4hy2wN|B z9ulj6Z;F}a4`#~Vcb(zZwQStk8(tpAcN*gr8SN~T2gwV2l1y5xIA$9mj^s%oELI>l zI$bh0wqwOJR8T^F@LJEOsF3WkVpQY9%3tXYpxSWm3gENx8x0!id$$2C(dEgs(}@o| zM6nTL*?SFjhqunMKsIaqoJ-^T{(^)26AMBbu0W?6n&ZuD`Ec{>zs2%yR=fNbzH6Zw z#lOajKOCLm1AJR&`HpW!G=OY;GlXU1_qyu2h8Z1MAr8B1r#okRkYkBpW68D4aSk>% z#tDr@ZIX58Y&O2l;_!@&d&)<{XI=cya^|xrOT^hAJXEf;4;m}vDJsZzy$s9~46_F! zb+v`dDcX|eDHx-+Ss;!~9WQ!(5MW7t_qH=YK{=Ho4jH($~VQ(yd;60laCg_D#9Pl;;x5{oPJ zU9ew5flo-EXrf5sez{Qobi_>oBz&TOX646E{H7b@Y(r0Eob8!^&|fb6$;hAd!E}~< z?X6MZY=PTi!B+=8a}gl3r|}^2{*#}MEW`_VYK-;hVSi71+wRL|&sLjy{0P?g&*YA; zxDN)dNB5vi)^Hkj=D{JAThcB$xT(-G=AG*IQgW(!IcLxs` zjFYAby|;AV}t1yYBy)KZJhLkI(+C~&^1lag-97#uZAFRq6;&u(qdNXVOH&9)w6 zY>iS6s*3}+Ui(ugnI0m9F|Pdn@bLFJTqAOqrGddVXfZiX+?euDU-?r$oTk<*zu$Lm zxbOS+I|660E*Kd=LvR?2f|8A8+;KfCe*s_go#?{clEZxl`a>urpe)!fM6kkiI&OH& zu#}uSc;%HpDav0>Q$?ZS_vQOO8U`Q3(IlQ-{EnbU^tkKv_M!}p5|OX`N%_j3PLdY< z*BDjKF~YEwYq_Re=ov}YWo3d|=G2o{8#JPw zK!5L=VG;nkgtB_fO=5rMT9DoPU3*TDtDh>yK{vhRx5}qNC%gD+^c-`>;oZXRz8dFo z^{MFeTlSTV_%e8;5hFvyePc;D!bg|0{>2dCVS#UHx9w>3#Pygqzs5*(?p*fDzjiyS zwZkT;Q3|j>?rdtMCKb!^-qNJG1$Vf05|NKM=Q8)e7lI2A4`nHsGgy_USe?m`EpJ1YAzfu-- z&Gl5HBTtn--e0cYq#uVq`ggkb5dzL;AAo|N#5PH_a0?LqtukazWa;U0Qca zV+z6HZ9is%pIjy$cNij1Si4toMeJI;*ALySt=+2~R$4NvnY!@xWbLv7Sn}3YHcZ;J zcCYVFz{g2gyKMbO%z&%eX#I$5?=;$B?Orbrl2=%}S6eJsW*a4rGuYXBF>gxrH~7CBx97?EzF{&q93lr{g!vryA*dw_!j(Sgw{^@5F~4 zvclTE%5H#zTc>dsBx|?b*!v3(@_*+YKM29vWm$8{w|O-mY@YtNSR1b0u#c-vmk3Ga zJ0%}Df~zxlV3cY(&3ANj&@r5~7{Qjc?{(F40W>2aK3%9-H@6HOv(x*nUDF2X6g-z`l+#UPLho9;r=!AE z8abdfAk0SrUZ4uSkW%ptXFeOk=D^yZ;sKO}VaywaZSU`aQ$iy-wa^$6=rmqx;g#G*&dWzstY+ zOSMNh+09AqIgzN@fyuO~w^iLviP_m^cb5T7BeUEGJYwM(B)*6wc+QvOx(myhYf zcBId7h+k+|1a~=2U6o_3u|}kSdB^W7}oA@5i*Lk>+M1r%D2!eJf{vz zcuuuJQ!%L8gIANaI|vnSLP)WTIB4x&4{MkITD!QHgMhTKc6A^_Y*xwI_4r$?UD_zR ztH=M)+9eqKuC?oeVKmm-r7vnP9YYa3+AP@R*2JOA(rbQc?H)_k?scu*W0K(&$J&L4 zfTsT9qSh`-*hSNaZs$7Ruy%=mK(FF_Q&%nBGFiLV?ZxGKd^|h$4L5N#*lQ7S;?UaItNgQ1}&I7=60Xq1Tj`hPFK{m6^YWi<@rE zW#iB@lB~(?HyZ=K;>8ed>-{D3H(I-vmvYYhbv?++3{26Xfcrig6IEAo;PdcJ10)yY?J&#_f-_J4WDKsl3{?cIhjaY~)dgwjiJZ z!x_D*wsx&AP+@A71F|4mMQ!cIn7m;Z;Q1d>H#XRO6rDtN5TAjB+EloIM9wY*W{lKS?)b~~!I!zQp%3f|e=+12VwDwgfu(zx#S)EhH1ZWX+riJtxKvhY!qs%8vpcYnEllYSKXZ=>Iy5UgFE z{@u7vw9Q(#bjjMK39jyx|5x^HA93~F2L&A(t~9n84QjV!VeQiQv36AnNXP$6-uuVK zbzS$qGw00g*`$8hsTHwus6^LdCDn?pM55tP@{dsD)kEn>ab>B3=+d!y>97bS894%GeS0gW`|j zaNg&;_Br!|k{ajz$b0PrdFGt6_gZ_cz4khL*6g*;URb+kTVU;O;U1AE7Oa$B)@}gP z<5b~e&sDlD*wosU)>o|ETGFspZ|(9<{1-iIyFRy-)B{+%9CB>VJs<~e*1N6c*1WlI zRj&L7e6R3QuM>E@m3&cHyM}WSuR+C6!3EYX?_%e`kGDph^4Q|xX_?8i@J*vv>a?2x z)-H|2yz5LBDbBQswd-53c2h9&8uG3+P(T7bXKUdaC@AZN=C6DG^Uks08ey$9r+1H6 z*gf%qnQ)9`T3Y1jqS3Fn+dm1yuy%dJR@iNwUcsxkSi2Op)chF+?aSfPE+QGd`;Hj0 zo!PCq*6fN8?Zt9l48IN@uR)t+z%ZZ!x_pI$2GbV5`4IN@u0L*p9bPtc&+yg-uKcxpN zR^VF&ma}>P8rXT;_{C#4uNMgXgYu6Dh(PXR+fd+k_muf;-RMd8RO z9=wNoAHpy1SJ1As)ubX9WubSfAYgp>ylIc4Y}DF*XasMhoNi$-CQZY>X{photyk1M znO5b?CCSD=(K>D8TRlR#sV~FKVA){n-hZNzW;)8}qP#D6p2KK^CXex%13;pF5|FY%e{tR89L)V)XwLj54Alh_$zu`j)3(ZT$%rvZs;spL0Xy*wq8O=fB_|elEOsq zHzVH}6u~QR;9RI{caF23_qMrHqL|y+bcFekjW~c3 zm^K5j%}3bBTz3>=?ZQmWWQpkYlCZWZDYJP3TE%ry4r^vt=3tX7+T~B#zpid?R1QmJ z!^v9?9IRcxwDESz@YVm3IhHR%WGg7U7cAJ#iDZQ8MFfImkG0D&;aA+ff`2Z<==t4^ z^A|Mkmfo>t2X7=xaP01o1xY@7@fFG=|1`}`O3V~_B`@6s5?_M!T zo#Af*oIyO;0{-m|~N zJzQ9s;Z6?uyCLpvX%}q1w0t}ti9-3R0zU#WZ|NiCZ0{#YiMSRfAt}NQdVG~h`*x{- zJpU8go`H}j<5jT}s!D8K0HoAsr8fpH_Qau`H1iAmcF)Q#*JkUQ-l%0lA7TP9*ezdB z(x$}Lm8KB*LL14h80>|>WQI6IB}ID&;-5DSL_1fBcuRqFrg4hKSkzM zcv5r=TRTu;fMh%pm}H{;8|cpFNLixLq;bkL7+znwXe*NoB?O@;ss%xYQJ@f8S4nHL z{u1IzaeRv*F<&TB<3giH-=r();3=Anm@4otRfdi+4_M<2`BuMxA&=hvAXQUIhYYyZ z3&O^f)>h&QEc%uPKWbmF;LV@kI5^n<_S=Zg$f0zig@7c8>>4tpR`KX^3%b$rOQ_Qz z*u<@Q|8{?st_6YRL5}=C)%6f|!(T#Km@u9^lmhK#iutIHPd^I@#eUo8QO(I9n%

  • `BAY#5?i;PG;9T1 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 literal 0 HcmV?d00001 diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_buildings.atlas b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_buildings.atlas similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/inn_buildings.atlas rename to forge-gui/res/adventure/Innistrad/maps/tileset/inn_buildings.atlas diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_dungeon_floor.png b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_dungeon_floor.png similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/inn_dungeon_floor.png rename to forge-gui/res/adventure/Innistrad/maps/tileset/inn_dungeon_floor.png diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_dungeon_floor.tsx b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_dungeon_floor.tsx similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/inn_dungeon_floor.tsx rename to forge-gui/res/adventure/Innistrad/maps/tileset/inn_dungeon_floor.tsx diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_main.png b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.png similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/inn_main.png rename to forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.png diff --git a/forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.tsx b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.tsx new file mode 100644 index 00000000000..3183138d35a --- /dev/null +++ b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.tsx @@ -0,0 +1,2233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_main.xcf b/forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.xcf similarity index 100% rename from forge-gui/res/adventure/common/maps/tileset/inn_main.xcf rename to forge-gui/res/adventure/Innistrad/maps/tileset/inn_main.xcf diff --git a/forge-gui/res/adventure/Innistrad/world/points_of_interest.json b/forge-gui/res/adventure/Innistrad/world/points_of_interest.json index 7ef086aa441..4991e7ee5a3 100644 --- a/forge-gui/res/adventure/Innistrad/world/points_of_interest.json +++ b/forge-gui/res/adventure/Innistrad/world/points_of_interest.json @@ -4,9 +4,9 @@ "name": "inn_Cave_river", "type": "cave", "count": 15, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "Cave", - "map": "../common/maps/map/cave/inn_cave_river_entrance.tmx", + "map": "../Innistrad/maps/map/Innistrad/cave/inn_cave_river_entrance.tmx", "radiusFactor": 0.8, "questTags": [ "Hostile", @@ -19,9 +19,9 @@ "name": "inn_crescentus", "type": "town", "count": 1, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "crescentus", - "map": "../common/maps/map/main_story/inn_crescentus.tmx", + "map": "../Innistrad/maps/map/Innistrad/main_story/inn_crescentus.tmx", "radiusFactor": 0.5, "questTags": [ "Capital", @@ -32,9 +32,9 @@ "name": "inn_forgotten_lodge_1", "type": "dungeon", "count": 18, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "lodge_1", - "map": "../common/maps/map/hunting_lodge/inn_forgotten_lodge_1.tmx", + "map": "../Innistrad/maps/map/Innistrad/hunting_lodge/inn_forgotten_lodge_1.tmx", "radiusFactor": 0.8, "questTags": [ "Hostile", @@ -47,9 +47,9 @@ "name": "inn_lodge_1", "type": "dungeon", "count": 12, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "lodge_1", - "map": "../common/maps/map/hunting_lodge/inn_lodge_1.tmx", + "map": "../Innistrad/maps/map/Innistrad/hunting_lodge/inn_lodge_1.tmx", "radiusFactor": 0.8, "questTags": [ "Hostile", @@ -62,9 +62,9 @@ "name": "inn_ulvenwald_hamlet", "type": "town", "count": 4, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "ulvenwaldtown", - "map": "../common/maps/map/towns/inn_ulvenwald_hamlet.tmx", + "map": "../Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_hamlet.tmx", "radiusFactor": 0.8, "questTags": [ "Town", @@ -77,9 +77,9 @@ "name": "inn_ulvenwald_town", "type": "town", "count": 1, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "ulvenwaldtown", - "map": "../common/maps/map/towns/inn_ulvenwald_town.tmx", + "map": "../Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_town.tmx", "radiusFactor": 0.8, "questTags": [ "Capital", @@ -93,9 +93,9 @@ "name": "inn_ulvenwald_village", "type": "town", "count": 10, - "spriteAtlas": "../common/maps/tileset/inn_buildings.atlas", + "spriteAtlas": "../Innistrad/maps/tileset/inn_buildings.atlas", "sprite": "ulvenwaldtown", - "map": "../common/maps/map/towns/inn_ulvenwald_hamlet.tmx", + "map": "../Innistrad/maps/map/Innistrad/towns/inn_ulvenwald_hamlet.tmx", "radiusFactor": 0.8, "questTags": [ "Town", diff --git a/forge-gui/res/adventure/Shandalar Old Border/config.json b/forge-gui/res/adventure/Shandalar Old Border/config.json index c1efbd268e7..5821f361163 100644 --- a/forge-gui/res/adventure/Shandalar Old Border/config.json +++ b/forge-gui/res/adventure/Shandalar Old Border/config.json @@ -71,534 +71,56 @@ "Volcanic Island" ], "restrictedEditions": [ - "10E", - "2X2", - "2XM", - "30A", - "40K", - "5DN", - "8ED", - "9ED", - "A25", - "ACR", - "AER", - "AFC", - "AFR", - "AJMP", - "AKH", - "AKR", - "ALA", - "ANA", - "ANB", - "ARB", - "ARC", - "AVR", - "BBD", - "BFZ", - "BIG", - "BLB", - "BLC", - "BNG", - "BOK", - "BOT", - "BRC", - "BRO", - "BRR", - "C13", - "C14", - "C15", - "C16", - "C17", - "C18", - "C19", - "C20", - "C21", - "CC1", - "CC2", - "CFX", - "CHK", - "CLB", - "CLU", - "CM1", - "CM2", - "CMA", - "CMB1", - "CMM", - "CMR", - "CN2", - "CNS", - "COM", - "CP1", - "CP2", - "CP3", - "CSP", - "CST", - "DA1", - "DBL", - "DCI", - "DD1", - "DD2", - "DDC", - "DDD", - "DDE", - "DDF", - "DDG", - "DDH", - "DDI", - "DDJ", - "DDK", - "DDL", - "DDM", - "DDN", - "DDO", - "DDP", - "DDQ", - "DDR", - "DDS", - "DDT", - "DDU", - "DFT", - "DGM", - "DIS", - "DKA", - "DMC", - "DMR", - "DMU", - "DOM", - "DPA", - "DRB", - "DRC", - "DS0", - "DSC", - "DSK", - "DST", - "DTK", - "DVD", - "E01", - "E02", - "EA1", - "EA2", - "EA3", - "ELD", - "EMA", - "EMN", - "EVE", - "EVG", - "EXP", - "F03", - "F04", - "F05", - "F06", - "F07", - "F08", - "F09", - "F10", - "F11", - "F12", - "F13", - "F14", - "F15", - "F16", - "F17", - "FCA", - "FDC", - "FDN", - "FIC", - "FIN", - "FMB1", - "FRF", - "FUT", - "FVE", - "FVL", - "FVR", - "G04", - "G05", - "G06", - "G07", - "G08", - "G09", - "G10", - "G11", - "G18", - "GDY", - "GK1", - "GK2", - "GN2", - "GN3", - "GNT", - "GPT", - "GRN", - "GS1", - "GTC", - "GVL", - "H1R", - "H2R", - "HA1", - "HA2", - "HA3", - "HA4", - "HA5", - "HA6", - "HA7", - "HBG", - "HHO", - "HOP", - "HOU", - "IKO", - "IMA", - "INR", - "ISD", - "J12", - "J13", - "J14", - "J15", - "J16", - "J17", - "J18", - "J19", - "J20", - "J21", - "J22", - "J25", - "JMP", - "JOU", - "JVC", - "KHC", - "KHM", - "KLD", - "KLR", - "KTK", - "LCC", - "LCI", - "LRW", - "LTC", - "LTR", - "M10", - "M11", - "M12", - "M13", - "M14", - "M15", - "M19", - "M20", - "M21", - "M3C", - "MAT", - "MB1", - "MB2", - "MBS", - "MD1", - "ME2", - "ME3", - "ME4", - "MED", - "MH1", - "MH2", - "MH3", - "MIC", - "MID", - "MKC", - "MKM", - "MM2", - "MM3", - "MMA", - "MOC", - "MOM", - "MOR", - "MPS_AKH", - "MPS_GRN", - "MPS_KLD", - "MPS_RNA", - "MPS_WAR", - "MRD", - "MUL", - "NCC", - "NEC", - "NEO", - "NPH", - "OGW", - "OLGC", - "ONC", - "ONE", - "ORI", - "OTC", - "OTJ", - "OTP", - "P04", - "P05", - "P06", - "P07", - "P08", - "P09", - "P10", - "P10E", - "P11", - "P15A", - "P22", - "P23", - "P2HG", - "P30A", - "P30H", - "P30M", - "P30T", - "P5DN", - "P8ED", - "P9ED", - "PAER", - "PAKH", - "PAL04", - "PAL05", - "PAL06", - "PALA", - "PANA", - "PARB", - "PAVR", - "PBFZ", - "PBNG", - "PBOK", - "PBOOK", - "PC2", - "PCA", - "PCBB", - "PCHK", - "PCMP", - "PCNS", - "PCON", - "PCSP", - "PDCI", - "PD2", - "PD3", - "PDGM", - "PDIS", - "PDKA", - "PDOM", - "PDP10", - "PDP12", - "PDP13", - "PDP14", - "PDP15", - "PDS", - "PDST", - "PDTK", - "PDTP", - "PEMN", - "PEVE", - "PEWK", - "PF19", - "PF20", - "PF23", - "PF24", - "PF25", - "PFRF", - "PFUT", - "PGPT", - "PGPX", - "PGRN", - "PGTC", - "PH17", - "PH18", - "PH19", - "PH20", - "PH21", - "PH22", - "PHEL", - "PHOU", - "PHTR", - "PIDW", - "PIO", - "PIP", - "PISD", - "PJ21", - "PJAS", - "PJJT", - "PJOU", - "PJSC", - "PJSE", - "PKLD", - "PKTK", - "PL21", - "PL22", - "PL23", - "PL24", - "PL25", - "PLC", - "PLG20", - "PLG21", - "PLG22", - "PLG24", - "PLG25", - "PLIST", - "PLRW", - "PLTC", - "PMEI", - "PM10", - "PM11", - "PM12", - "PM13", - "PM14", - "PM15", - "PM19", - "PM20", - "PMBS", - "PMDA", - "PMH1", - "PMOR", - "PMPS", - "PMPS06", - "PMPS07", - "PMPS08", - "PMPS09", - "PMPS10", - "PMPS11", - "PMRD", - "PNAT", - "PNPH", - "POGW", - "PORI", - "PPC1", - "PPLC", - "PPP1", - "PPRO", - "PR23", - "PRAV", - "PRCQ", - "PRES", - "PRIX", - "PRNA", - "PRM", - "PROE", - "PRTR", - "PRW2", - "PRWK", - "PS14", - "PS15", - "PS16", - "PS17", - "PS18", - "PS19", - "PSDC", - "PSHM", - "PSLDSC", - "PSOI", - "PSOK", - "PSOM", - "PSPL", - "PSS1", - "PSS2", - "PSS3", - "PSS4", - "PSVC", - "PSUS", - "PTHS", - "PTKDF", - "PTSP", - "PUMA", - "PURL", - "PUST", - "PW11", - "PW12", - "PW21", - "PW22", - "PW23", - "PW24", - "PW25", - "PWAR", - "PWCS", - "PWWK", - "PXLN", - "PXTC", - "PZ1", - "PZ2", - "PZEN", - "Q06", - "RAV", - "REX", - "RIX", - "RNA", - "ROE", - "RTR", - "RVR", + + ], + "allowedEditions": [ + "LEA", + "LEB", + "2ED", + "3ED", + "ARN", + "ATQ", + "LEG", + "DRK", + "FEM", + "4ED", + "ICE", + "CHR", + "HML", + "ALL", + "MIR", + "VIS", + "5ED", + "POR", + "WTH", + "TMP", + "STH", + "EXO", + "PO2", + "USG", + "ATH", + "ULG", + "UDS", + "6ED", + "PTK", + "S99", + "MMQ", + "BRB", + "NEM", "S00", - "SCD", - "SCH", - "SHM", - "SIR", - "SIS", - "SLC", - "SLD", - "SLP", - "SLU", - "SLX", - "SNC", - "SOI", - "SOK", - "SOM", - "SPE", - "SPG", - "SS1", - "SS2", - "SS3", - "STA", - "STX", - "TD0", - "TD1", - "TD2", - "TDC", - "TDM", - "THB", - "THS", - "TPR", - "TSB", - "TSP", - "TSR", - "UGF", - "UGL", - "UMA", - "UND", - "UNF", - "UNH", - "UST", - "V12", - "V13", - "V14", - "V15", - "V16", - "V17", - "VMA", - "VOC", - "VOW", - "W16", - "W17", - "WAR", - "WHO", - "WMC", - "WOC", - "WOE", - "WOT", - "WWK", - "XLN", - "YBLB", - "YBRO", - "YDFT", - "YDMU", - "YDSK", - "YLCI", - "YMID", - "YMKM", - "YNEO", - "YONE", - "YOTJ", - "YSNC", - "YWOE", - "ZEN", - "ZNC", - "ZNE", - "ZNR", - "PCEL", - "UNK", - "EOE", - "EOC", - "YTDM" + "PCY", + "INV", + "BTD", + "PLS", + "APC", + "7ED", + "ODY", + "DKM", + "TOR", + "JUD", + "ONS", + "LGN", + "SCG" ], "difficulties": [ { diff --git a/forge-gui/res/adventure/Shandalar Old Border/world/points_of_interest.json b/forge-gui/res/adventure/Shandalar Old Border/world/points_of_interest.json index 36818d6b267..8b78da46c8b 100644 --- a/forge-gui/res/adventure/Shandalar Old Border/world/points_of_interest.json +++ b/forge-gui/res/adventure/Shandalar Old Border/world/points_of_interest.json @@ -3407,7 +3407,7 @@ "count": 1, "spriteAtlas": "../common/maps/tileset/buildings.atlas", "sprite": "WasteTown", - "map": "../common/maps/map/main_story_explore/waste_town_abandoned.tmx", + "map": "../common/maps/map/main_story_defend/waste_town_abandoned.tmx", "radiusFactor": 0.8, "questTags": [ "Quest_APortalToNowhere" diff --git a/forge-gui/res/adventure/common/maps/tileset/inn_main.tsx b/forge-gui/res/adventure/common/maps/tileset/inn_main.tsx deleted file mode 100644 index 7ac69497ff1..00000000000 --- a/forge-gui/res/adventure/common/maps/tileset/inn_main.tsx +++ /dev/null @@ -1,1064 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index bddb173a51a..abf2913b440 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -142,3 +142,4 @@ Innistrad Remastered, 3/6/INR, INR Aetherdrift, 3/6/DFT, DFT Tarkir Dragonstorm, 3/6/TDM, TDM Final Fantasy, 3/6/FIN, FIN +Alchemy: Innistrad, 3/6/ISD, YMID From 69e2f90c8d720cb52a05e2dbe82cbd193cb15511 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 18 Jul 2025 06:49:37 +0100 Subject: [PATCH 026/183] EOE: 2 cards (#8097) --- .../res/cardsfolder/upcoming/atomic_microsizer.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/glacier_godmaw.txt | 12 ++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt b/forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt new file mode 100644 index 00000000000..fdc95d85ef0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt @@ -0,0 +1,10 @@ +Name:Atomic Microsizer +ManaCost:U +Types:Artifact Equipment +K:Equip:2 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | Description$ Equipped creature gets +1/+0. +T:Mode$ Attacks | ValidCard$ Creature.EquippedBy | Execute$ TrigUnblockable | TriggerDescription$ Whenever equipped creature attacks, choose up to one target creature. That creature can't be blocked this turn and has base power and toughness 1/1 until end of turn. +SVar:TrigUnblockable:DB$ Effect | TgtPrompt$ Select up to one target creature | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | StaticAbilities$ Unblockable | AILogic$ Pump | SubAbility$ DBAnimate +SVar:Unblockable:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | Description$ This creature can't be blocked this turn. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 1 | Toughness$ 1 +Oracle:Equipped creature gets +1/+0.\nWhenever equipped creature attacks, choose up to one target creature. That creature can't be blocked this turn and has base power and toughness 1/1 until end of turn.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt b/forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt new file mode 100644 index 00000000000..467ec75712a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt @@ -0,0 +1,12 @@ +Name:Glacier Godmaw +ManaCost:5 G G +Types:Creature Leviathan +PT:6/6 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Landfall — Whenever a land you control enters, creatures you control get +1/+1 and gain vigilance and haste until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance & Haste +SVar:BuffedBy:Land +DeckHas:Ability$Token +Oracle:Trample\nWhen this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.)\nLandfall — Whenever a land you control enters, creatures you control get +1/+1 and gain vigilance and haste until end of turn. From e57708543a4f68bed22d07d76b7b8a87085fc43a Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 18 Jul 2025 03:32:11 -0400 Subject: [PATCH 027/183] Back to quest list button fix (#8094) --- .../forge/adventure/scene/QuestLogScene.java | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/QuestLogScene.java b/forge-gui-mobile/src/forge/adventure/scene/QuestLogScene.java index bf09f74fad7..50ce4c81203 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/QuestLogScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/QuestLogScene.java @@ -27,7 +27,6 @@ public class QuestLogScene extends UIScene { private QuestLogScene() { super(Forge.isLandscapeMode() ? "ui/quests.json" : "ui/quests_portrait.json"); - scrollWindow = ui.findActor("scrollWindow"); root = ui.findActor("questList"); detailRoot = ui.findActor("questDetails"); @@ -36,11 +35,13 @@ public class QuestLogScene extends UIScene { backToListButton = Controls.newTextButton("Quest List"); ui.onButtonPress("return", QuestLogScene.this::back); ui.onButtonPress("status", QuestLogScene.this::status); - ui.onButtonPress("backToList", QuestLogScene.this::backToList); - - - //Todo - refactor below, replace buttons in landscape + backToListButton.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + buildList(); + } + }); + // TODO - refactor below, replace buttons in landscape scrollContainer = new Table(Controls.getSkin()); scrollContainer.row(); @@ -76,9 +77,6 @@ public class QuestLogScene extends UIScene { root.row(); ScrollPane scroller = new ScrollPane(scrollContainer); root.add(scroller).colspan(3).fill().expand(); - - - } private static QuestLogScene object; @@ -92,16 +90,12 @@ public class QuestLogScene extends UIScene { } @Override - public void dispose() { - - } + public void dispose() { } @Override public void enter() { super.enter(); buildList(); - - } public void buildList(){ @@ -116,7 +110,7 @@ public class QuestLogScene extends UIScene { nameLabel.setColor(Color.BLACK); scrollContainer.add(nameLabel).align(Align.left).expandX(); Button details = Controls.newTextButton(Forge.getLocalizer().getMessage("lblDetails")); - details.addListener( new ClickListener(){ + details.addListener(new ClickListener() { public void clicked(InputEvent event, float x, float y){ loadDetailsPane(quest); } @@ -128,7 +122,7 @@ public class QuestLogScene extends UIScene { performTouch(scrollPaneOfActor(scrollContainer)); //can use mouse wheel if available to scroll } - private void backToList(){ + private void backToList() { abandonQuestButton.setVisible(false); trackButton.setVisible(false); backToListButton.setVisible(false); @@ -137,8 +131,8 @@ public class QuestLogScene extends UIScene { detailRoot.setVisible(false); } - private void loadDetailsPane(AdventureQuestData quest){ - if (quest == null){ + private void loadDetailsPane(AdventureQuestData quest) { + if (quest == null) { return; } root.setVisible(false); @@ -146,16 +140,15 @@ public class QuestLogScene extends UIScene { detailScrollContainer.clear(); detailScrollContainer.row(); trackButton.setText(quest.isTracked?Forge.getLocalizer().getMessage("lblUntrackQuest"):Forge.getLocalizer().getMessage("lblTrackQuest")); - trackButton.addListener( new ClickListener(){ - public void clicked(InputEvent event, float x, float y){ + trackButton.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { toggleTracked(quest); } }); abandonQuestButton.setColor(Color.RED); - abandonQuestButton.addListener( new ClickListener(){ - public void clicked(InputEvent event, float x, float y){ - + abandonQuestButton.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { Dialog confirm = createGenericDialog("", Forge.getLocalizer().getMessage("lblAbandonQuestConfirm"),Forge.getLocalizer().getMessage("lblYes"),Forge.getLocalizer().getMessage("lblNo"), () -> abandonQuest(quest), null); showDialog(confirm); } @@ -208,7 +201,7 @@ public class QuestLogScene extends UIScene { } } - private void toggleTracked(AdventureQuestData quest){ + private void toggleTracked(AdventureQuestData quest) { if (quest.isTracked){ quest.isTracked = false; trackButton.setText(Forge.getLocalizer().getMessage("lblTrackQuest")); @@ -225,7 +218,7 @@ public class QuestLogScene extends UIScene { @Override public boolean back(){ //Needed so long as quest log and stats are separate scenes that link to each other - Forge.switchScene(lastGameScene==null?GameScene.instance():lastGameScene); + Forge.switchScene(lastGameScene==null ? GameScene.instance() : lastGameScene); return true; } @@ -234,5 +227,4 @@ public class QuestLogScene extends UIScene { AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance()); buildList(); } - } From e4d3e061d11888565e70788a1226f16199cdf5ab Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 18 Jul 2025 08:32:27 +0100 Subject: [PATCH 028/183] Quick cleanup: 2025-07-18 (#8099) --- .../res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt | 2 +- forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt | 2 +- forge-gui/res/cardsfolder/upcoming/amy_rose.txt | 2 +- forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/baloth_prime.txt | 2 +- forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt | 2 +- forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt | 2 +- forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt | 2 +- forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt | 2 +- forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt | 2 +- forge-gui/res/cardsfolder/upcoming/close_encounter.txt | 2 +- forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt | 2 +- forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt | 2 +- forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt | 2 +- forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt | 2 +- forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt | 2 +- forge-gui/res/cardsfolder/upcoming/dr_eggman.txt | 2 +- forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt | 2 +- .../res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt | 2 +- forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt | 2 +- forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt | 2 +- forge-gui/res/cardsfolder/upcoming/emergency_eject.txt | 2 +- forge-gui/res/cardsfolder/upcoming/emissary_escort.txt | 2 +- forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt | 2 +- forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt | 2 +- forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt | 2 +- forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt | 2 +- forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt | 2 +- forge-gui/res/cardsfolder/upcoming/festering_thicket.txt | 2 +- forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt | 2 +- forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt | 2 +- forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt | 2 +- forge-gui/res/cardsfolder/upcoming/glittering_massif.txt | 2 +- forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt | 2 +- forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt | 2 +- forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/hullcarver.txt | 2 +- forge-gui/res/cardsfolder/upcoming/hylderblade.txt | 2 +- forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt | 2 +- forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt | 2 +- forge-gui/res/cardsfolder/upcoming/insight_engine.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt | 2 +- forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt | 2 +- forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt | 2 +- forge-gui/res/cardsfolder/upcoming/loading_zone.txt | 2 +- forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt | 2 +- forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt | 2 +- forge-gui/res/cardsfolder/upcoming/mechanozoa.txt | 2 +- forge-gui/res/cardsfolder/upcoming/melded_moxite.txt | 2 +- forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt | 2 +- forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt | 2 +- forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt | 2 +- forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt | 2 +- forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt | 2 +- forge-gui/res/cardsfolder/upcoming/nutrient_block.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ouroboroid.txt | 2 +- forge-gui/res/cardsfolder/upcoming/pain_for_all.txt | 2 +- forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt | 2 +- forge-gui/res/cardsfolder/upcoming/possibility_technician.txt | 2 +- forge-gui/res/cardsfolder/upcoming/radiant_summit.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt | 2 +- forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt | 2 +- forge-gui/res/cardsfolder/upcoming/roving_actuator.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rust_harvester.txt | 2 +- forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt | 2 +- forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt | 2 +- forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt | 2 +- forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt | 2 +- forge-gui/res/cardsfolder/upcoming/shattered_wings.txt | 2 +- forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt | 2 +- forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt | 2 +- forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt | 2 +- forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt | 2 +- forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt | 2 +- forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt | 2 +- forge-gui/res/cardsfolder/upcoming/starport_security.txt | 2 +- forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt | 2 +- forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt | 2 +- forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt | 2 +- .../res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt | 2 +- forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt | 2 +- forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt | 2 +- forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt | 2 +- forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt | 2 +- forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt | 2 +- forge-gui/res/cardsfolder/upcoming/the_endstone.txt | 2 +- forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt | 2 +- forge-gui/res/cardsfolder/upcoming/unravel.txt | 2 +- forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt | 2 +- forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt | 2 +- forge-gui/res/cardsfolder/upcoming/vernal_fen.txt | 2 +- forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt | 2 +- forge-gui/res/cardsfolder/upcoming/vote_out.txt | 2 +- forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt | 2 +- forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt | 2 +- forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt | 2 +- forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt | 2 +- 105 files changed, 105 insertions(+), 105 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt b/forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt index c570df2eec0..ba88cd050f8 100644 --- a/forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt +++ b/forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Artifact S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Deathtouch | Condition$ PlayerTurn | Description$ During your turn, NICKNAME has deathtouch. -Oracle:When Alpharael enters, draw two cards. Then discard two cards unless you discard an artifact card.\nDuring your turn, Alpharael has deathtouch. \ No newline at end of file +Oracle:When Alpharael enters, draw two cards. Then discard two cards unless you discard an artifact card.\nDuring your turn, Alpharael has deathtouch. diff --git a/forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt b/forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt index 6dd4e913a41..a28b7f4283f 100644 --- a/forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt +++ b/forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt @@ -7,4 +7,4 @@ T:Mode$ Attacks | ValidCard$ Card.Self | CheckSVar$ X | TriggerZones$ Battlefiel SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ Y SVar:X:Count$Void.1.0 SVar:Y:TriggeredDefendingPlayer$LifeTotal/HalfUp -Oracle:Ward—Discard a card at random.\nVoid — Whenever Alpharael attacks, if a nonland permanent left the battlefield this turn or a spell was warped this turn, defending player loses half their life, rounded up. \ No newline at end of file +Oracle:Ward—Discard a card at random.\nVoid — Whenever Alpharael attacks, if a nonland permanent left the battlefield this turn or a spell was warped this turn, defending player loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/upcoming/amy_rose.txt b/forge-gui/res/cardsfolder/upcoming/amy_rose.txt index 0c618787508..ba2f0948565 100644 --- a/forge-gui/res/cardsfolder/upcoming/amy_rose.txt +++ b/forge-gui/res/cardsfolder/upcoming/amy_rose.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Hedgehog Warrior PT:3/3 K:Haste T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, attach up to one target Equipment to her. Then up to one other target attacking creature gets +X/+0 until end of turn, where X is CARDNAME's power. -SVar:TrigAttach:DB$ Attach |ValidTgts$ Equipment | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target equipment to attach to CARDNAME | Object$ ThisTargetedCard | Defined$ Self | SubAbility$ DBPump +SVar:TrigAttach:DB$ Attach | ValidTgts$ Equipment | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target equipment to attach to CARDNAME | Object$ ThisTargetedCard | Defined$ Self | SubAbility$ DBPump SVar:DBPump:DB$ Pump | ValidTgts$ Creature.attacking+Other | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select another target attacking creature. | NumAtt$ +X SVar:X:Count$CardPower SVar:HasAttackEffect:TRUE diff --git a/forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt b/forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt index 3ec809e544d..c965912e7cf 100644 --- a/forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt +++ b/forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt @@ -7,4 +7,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.nonCreature+nonLand+YouOwn+cmcLEX K:Warp:2 W SVar:X:Count$CastTotalManaSpent -Oracle:Flying\nWhen this creature enters, return target noncreature, nonland permanent card with mana value X or less from your graveyard to the battlefield, where X is the amount of mana spent to cast this creature.\nWarp {2}{W} \ No newline at end of file +Oracle:Flying\nWhen this creature enters, return target noncreature, nonland permanent card with mana value X or less from your graveyard to the battlefield, where X is the amount of mana spent to cast this creature.\nWarp {2}{W} diff --git a/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt b/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt index 3ebedce383e..7d666f6ecf5 100644 --- a/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt +++ b/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt @@ -10,4 +10,4 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_4_4_beast | TokenTapp SVar:DBUntap:DB$ Untap A:AB$ GainLife | Cost$ 4 Sac<1/Land> | Defined$ You | LifeAmount$ 2 | SpellDescription$ You gain 2 life. DeckHas:Ability$Counters|Token|Lifegain -Oracle:This creature enters tapped with six stun counters on it. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nWhenever you sacrifice a land, create a tapped 4/4 green Beast creature token and untap this creature.\n{4}, Sacrifice a land: You gain 2 life. \ No newline at end of file +Oracle:This creature enters tapped with six stun counters on it. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nWhenever you sacrifice a land, create a tapped 4/4 green Beast creature token and untap this creature.\n{4}, Sacrifice a land: You gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt b/forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt index e157802a1dd..58cc5f25f9f 100644 --- a/forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt +++ b/forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt @@ -5,4 +5,4 @@ PT:2/1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigToken | TriggerDescription$ When this creature dies, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:TrigToken:DB$ Token | TokenScript$ c_a_lander_sac_search | TokenAmount$ 1 DeckHas:Ability$Token -Oracle:When this creature dies, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") \ No newline at end of file +Oracle:When this creature dies, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt b/forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt index d9d5a5a760e..49c6281f12a 100644 --- a/forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt +++ b/forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt @@ -2,4 +2,4 @@ Name:Beyond the Quiet ManaCost:3 W W Types:Sorcery A:SP$ ChangeZoneAll | ChangeType$ Creature,Spacecraft | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile all creatures and Spacecraft. -Oracle:Exile all creatures and Spacecraft. \ No newline at end of file +Oracle:Exile all creatures and Spacecraft. diff --git a/forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt b/forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt index cd59703b342..5b82ff657b8 100644 --- a/forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt +++ b/forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You A:AB$ Draw | Cost$ 8 | NumCards$ 2 | SubAbility$ DBToken | SpellDescription$ Draw two cards and create a 2/2 colorless Robot artifact creature token. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You -Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\n{8}: Draw two cards and create a 2/2 colorless Robot artifact creature token. \ No newline at end of file +Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\n{8}: Draw two cards and create a 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt b/forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt index 934b64d1177..41cec3a26ba 100644 --- a/forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt +++ b/forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You T:Mode$ Sacrificed | ValidCard$ Artifact | ValidPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice an artifact, this creature deals 2 damage to target opponent. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 2 -Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\nWhenever you sacrifice an artifact, this creature deals 2 damage to target opponent. \ No newline at end of file +Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\nWhenever you sacrifice an artifact, this creature deals 2 damage to target opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt b/forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt index a4bc43033a5..9d988ca42d6 100644 --- a/forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt +++ b/forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt @@ -8,4 +8,4 @@ SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Se K:Warp:X G SVar:X:Count$xPaid DeckHas:Ability$Counters -Oracle:This creature enters with X +1/+1 counters on it.\nWhen this creature leaves the battlefield, put its counters on target creature you control.\nWarp {X}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:This creature enters with X +1/+1 counters on it.\nWhen this creature leaves the battlefield, put its counters on target creature you control.\nWarp {X}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt b/forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt index 76cc1e1c349..23d46daae3f 100644 --- a/forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt +++ b/forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt @@ -3,4 +3,4 @@ ManaCost:9 Types:Artifact Creature Robot Giant PT:9/9 K:Warp:3 -Oracle:Warp {3} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Warp {3} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/close_encounter.txt b/forge-gui/res/cardsfolder/upcoming/close_encounter.txt index 1d24af6d8e7..fee206db5c0 100644 --- a/forge-gui/res/cardsfolder/upcoming/close_encounter.txt +++ b/forge-gui/res/cardsfolder/upcoming/close_encounter.txt @@ -5,4 +5,4 @@ S:Mode$ RaiseCost | ValidCard$ Card.Self | Activator$ You | Type$ Spell | Cost$ A:SP$ DealDamage | ValidTgts$ Creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the power of the chosen creature or card to target creature. SVar:X:Revealed$CardPower AI:RemoveDeck:All -Oracle:As an additional cost to cast this spell, choose a creature you control or a warped creature card you own in exile.\nCARDNAME deals damage equal to the power of the chosen creature or card to target creature. \ No newline at end of file +Oracle:As an additional cost to cast this spell, choose a creature you control or a warped creature card you own in exile.\nCARDNAME deals damage equal to the power of the chosen creature or card to target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt b/forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt index 875d06dbf7f..84eaeab27ec 100644 --- a/forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt +++ b/forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt @@ -5,4 +5,4 @@ K:Kicker:1 U A:SP$ Dig | DigNum$ X | ChangeNum$ Y | NoReveal$ True | RestRandomOrder$ True | SpellDescription$ Look at the top X cards of your library, where X is the number of lands you control. Put one of those cards into your hand. If this spell was kicked, put two of those cards into your hand instead. Put the rest on the bottom of your library in a random order. SVar:X:Count$Valid Land.YouCtrl SVar:Y:Count$Kicked.2.1 -Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.\nLook at the top X cards of your library, where X is the number of lands you control. Put one of those cards into your hand. If this spell was kicked, put two of those cards into your hand instead. Put the rest on the bottom of your library in a random order. \ No newline at end of file +Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.\nLook at the top X cards of your library, where X is the number of lands you control. Put one of those cards into your hand. If this spell was kicked, put two of those cards into your hand instead. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt b/forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt index cc8655f06df..b175fbbb0e3 100644 --- a/forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt +++ b/forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt @@ -5,4 +5,4 @@ PT:*/1+* S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | SetToughness$ Y | Description$ This creature's power is equal to the number of cards you own in exile and its toughness is equal to that number plus 1. SVar:X:Count$ValidExile Card.YouOwn SVar:Y:Count$ValidExile Card.YouOwn/Plus.1 -Oracle:This creature's power is equal to the number of cards you own in exile and its toughness is equal to that number plus 1. \ No newline at end of file +Oracle:This creature's power is equal to the number of cards you own in exile and its toughness is equal to that number plus 1. diff --git a/forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt b/forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt index 19b53709aee..290aee0c3e4 100644 --- a/forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt +++ b/forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt @@ -7,4 +7,4 @@ SVar:TrigCharm:DB$ Charm | Choices$ DBToken,DBPutCounterAll SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You | SpellDescription$ Create two 1/1 white Human Soldier creature tokens. SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each creature you control. DeckHas:Ability$Counters|Token -Oracle:Whenever you cast your second spell each turn, choose one —\n• Create two 1/1 white Human Soldier creature tokens.\n• Put a +1/+1 counter on each creature you control. \ No newline at end of file +Oracle:Whenever you cast your second spell each turn, choose one —\n• Create two 1/1 white Human Soldier creature tokens.\n• Put a +1/+1 counter on each creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt b/forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt index b492868cc26..492655bd797 100644 --- a/forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt +++ b/forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt @@ -6,4 +6,4 @@ SVar:X:Count$Compare W GE1.Y.Z SVar:Y:Targeted$CardPower/Times.2 SVar:Z:Targeted$CardPower SVar:W:Targeted$Valid Creature.withFlying -Oracle:Target creature deals damage to itself equal to its power. If that creature has flying, it deals twice that much damage to itself instead. \ No newline at end of file +Oracle:Target creature deals damage to itself equal to its power. If that creature has flying, it deals twice that much damage to itself instead. diff --git a/forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt b/forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt index 7bce9078729..f93b2df9b0e 100644 --- a/forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt +++ b/forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt @@ -7,4 +7,4 @@ SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 3 K:Station:8 S:Mode$ Continuous | Affected$ Card.Self+counters_GE8_CHARGE | AddType$ Creature | AddKeyword$ Flying | AddAbility$ CrusherPump | Description$ STATION 8+ Flying,,,{1}{R}: This Spacecraft gets +2/+0 until end of turn. SVar:CrusherPump:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | SpellDescription$ This Spacecraft gets +2/+0 until end of turn. -Oracle:When this Spacecraft enters, it deals 3 damage to any target.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 8+.)\nSTATION 8+\nFlying\n{1}{R}: This Spacecraft gets +2/+0 until end of turn. \ No newline at end of file +Oracle:When this Spacecraft enters, it deals 3 damage to any target.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 8+.)\nSTATION 8+\nFlying\n{1}{R}: This Spacecraft gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/dr_eggman.txt b/forge-gui/res/cardsfolder/upcoming/dr_eggman.txt index e5c61b04237..19ad8f14625 100644 --- a/forge-gui/res/cardsfolder/upcoming/dr_eggman.txt +++ b/forge-gui/res/cardsfolder/upcoming/dr_eggman.txt @@ -9,4 +9,4 @@ SVar:DBVillainousChoice:DB$ VillainousChoice | Defined$ Opponent | Choices$ DBDi SVar:DBDiscard:DB$ Discard | Defined$ Remembered | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Opponent discards a card. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Construct,Robot,Vehicle | ChangeNum$ 1 | SpellDescription$ You may put a Construct, Robot, or Vehicle card from your hand onto the battlefield. DeckHints:Type$Construct|Robot|Vehicle -Oracle:Flying\nAt the beginning of your end step, draw a card. Then each opponent faces a villainous choice — That player discards a card, or you may put a Construct, Robot, or Vehicle card from your hand onto the battlefield. \ No newline at end of file +Oracle:Flying\nAt the beginning of your end step, draw a card. Then each opponent faces a villainous choice — That player discards a card, or you may put a Construct, Robot, or Vehicle card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt b/forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt index 61f793179aa..e64b25e729e 100644 --- a/forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt @@ -8,4 +8,4 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ K:Warp:1 G SVar:PlayMain1:TRUE DeckHas:Ability$Counters -Oracle:When this creature enters, put a +1/+1 counter on target creature.\nEach creature you control with a +1/+1 counter on it has trample.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:When this creature enters, put a +1/+1 counter on target creature.\nEach creature you control with a +1/+1 counter on it has trample.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt b/forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt index 84ce26de565..5f21d0888cd 100644 --- a/forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt +++ b/forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt @@ -1,4 +1,4 @@ -Name:Dyadrine, Synthesis Amalgam +Name:Dyadrine, Synthesis Amalgam ManaCost:X G W Types:Legendary Artifact Creature Construct PT:0/1 diff --git a/forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt b/forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt index ca2cdca2c75..b8bae9148e6 100644 --- a/forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt +++ b/forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt @@ -10,4 +10,4 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You SVar:X:Count$Void.1.0 DeckHas:Ability$Token & Type$Robot -Oracle:Lifelink\nWhenever one or more creatures you control deal combat damage to a player, you draw a card and lose 1 life.\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, create a 2/2 colorless Robot artifact creature token. \ No newline at end of file +Oracle:Lifelink\nWhenever one or more creatures you control deal combat damage to a player, you draw a card and lose 1 life.\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, create a 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt b/forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt index 7da8242e132..7dea638fb09 100644 --- a/forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt +++ b/forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt @@ -2,4 +2,4 @@ Name:Embrace Oblivion ManaCost:B Types:Sorcery A:SP$ Destroy | Cost$ B Sac<1/Artifact;Creature/artifact or creature> | ValidTgts$ Creature,Spacecraft | TgtPrompt$ Select target creature or Spacecraft | SpellDescription$ Destroy target creature or Spacecraft. -Oracle:As an additional cost to cast this spell, sacrifice an artifact or creature.\nDestroy target creature or Spacecraft. \ No newline at end of file +Oracle:As an additional cost to cast this spell, sacrifice an artifact or creature.\nDestroy target creature or Spacecraft. diff --git a/forge-gui/res/cardsfolder/upcoming/emergency_eject.txt b/forge-gui/res/cardsfolder/upcoming/emergency_eject.txt index a0e4a32fbfc..b4d0621fca2 100644 --- a/forge-gui/res/cardsfolder/upcoming/emergency_eject.txt +++ b/forge-gui/res/cardsfolder/upcoming/emergency_eject.txt @@ -4,4 +4,4 @@ Types:Instant A:SP$ Destroy | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SubAbility$ DBToken | SpellDescription$ Destroy target nonland permanent. Its controller creates a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ TargetedController DeckHas:Ability$Token -Oracle:Destroy target nonland permanent. Its controller creates a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") \ No newline at end of file +Oracle:Destroy target nonland permanent. Its controller creates a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/emissary_escort.txt b/forge-gui/res/cardsfolder/upcoming/emissary_escort.txt index 3241a0fb3b3..2ce16aabb5b 100644 --- a/forge-gui/res/cardsfolder/upcoming/emissary_escort.txt +++ b/forge-gui/res/cardsfolder/upcoming/emissary_escort.txt @@ -5,4 +5,4 @@ PT:0/4 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | Description$ This creature gets +X/+0, where X is the greatest mana value among other artifacts you control. SVar:X:Count$Valid Artifact.Other+YouCtrl$GreatestCMC DeckHints:Type$Artifact -Oracle:This creature gets +X/+0, where X is the greatest mana value among other artifacts you control. \ No newline at end of file +Oracle:This creature gets +X/+0, where X is the greatest mana value among other artifacts you control. diff --git a/forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt b/forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt index e329ac0aaf4..f08da3dce03 100644 --- a/forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt +++ b/forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt @@ -7,4 +7,4 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ b_1_1_insect_flying | TokenOwner$ You SVar:X:Count$CardCounters.HATCHLING DeckHas:Ability$Counters|Token -Oracle:{T}, Pay 1 life: Add {B}. Put a hatchling counter on this land.\nWhen this land is put into a graveyard from the battlefield, for each hatchling counter on it, create a 1/1 black Insect creature token with flying. \ No newline at end of file +Oracle:{T}, Pay 1 life: Add {B}. Put a hatchling counter on this land.\nWhen this land is put into a graveyard from the battlefield, for each hatchling counter on it, create a 1/1 black Insect creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt b/forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt index 64e3db9096c..cc42b5db6ff 100644 --- a/forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt +++ b/forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt @@ -4,4 +4,4 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Landfall — Whenever a land you control enters, create a 2/2 colorless Robot artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You K:Warp:1 G -Oracle:Landfall — Whenever a land you control enters, create a 2/2 colorless Robot artifact creature token.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Landfall — Whenever a land you control enters, create a 2/2 colorless Robot artifact creature token.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt b/forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt index b9c61812082..19b30ed4715 100644 --- a/forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt +++ b/forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt @@ -7,4 +7,4 @@ SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | Destination S:Mode$ Continuous | Affected$ Card.ExiledWithSource | AffectedZone$ Exile | Condition$ PlayerTurn | MayPlay$ True | CheckSVar$ X | Description$ During your turn, as long as you've sacrificed a nontoken permanent this turn, you may play cards exiled with this creature. A:AB$ Mana | Cost$ T Sac<1/Land> | Produced$ R R | SpellDescription$ Add {R}{R}. SVar:X:PlayerCountPropertyYou$SacrificedThisTurn Permanent.!token -Oracle:Whenever you sacrifice a nontoken permanent, exile the top card of your library.\nDuring your turn, as long as you've sacrificed a nontoken permanent this turn, you may play cards exiled with this creature.\n{T}, Sacrifice a land: Add {R}{R}. \ No newline at end of file +Oracle:Whenever you sacrifice a nontoken permanent, exile the top card of your library.\nDuring your turn, as long as you've sacrificed a nontoken permanent this turn, you may play cards exiled with this creature.\n{T}, Sacrifice a land: Add {R}{R}. diff --git a/forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt b/forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt index 0cde02c12ec..5d9a80ddeec 100644 --- a/forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt +++ b/forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt @@ -8,4 +8,4 @@ K:Station:12 S:Mode$ Continuous | Affected$ Card.Self+counters_GE12_CHARGE | AddAbility$ EvendoMana | Description$ STATION 12+ {G}, {T}: Add {G} for each creature you control. SVar:EvendoMana:AB$ Mana | Cost$ G T | Produced$ G | Amount$ X | SpellDescription$ Add {G} for each creature you control. SVar:X:Count$Valid Creature.YouCtrl -Oracle:This land enters tapped.\n{T}: Add {G}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{G}, {T}: Add {G} for each creature you control. \ No newline at end of file +Oracle:This land enters tapped.\n{T}: Add {G}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{G}, {T}: Add {G} for each creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt b/forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt index b3994062aef..9ebc2c1a282 100644 --- a/forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt +++ b/forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt @@ -7,4 +7,4 @@ K:Lifelink R:Event$ CreateToken | ActiveZones$ Battlefield | ValidToken$ Card.YouCtrl | ReplaceWith$ DoubleToken | Description$ If one or more tokens would be created under your control, twice that many of those tokens are created instead. SVar:DoubleToken:DB$ ReplaceToken | Type$ Amount K:Warp:1 W -Oracle:Flying, lifelink\nIf one or more tokens would be created under your control, twice that many of those tokens are created instead.\nWarp {1}{W} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Flying, lifelink\nIf one or more tokens would be created under your control, twice that many of those tokens are created instead.\nWarp {1}{W} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt b/forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt index 68e03445262..8e35896fad1 100644 --- a/forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt +++ b/forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt @@ -8,4 +8,4 @@ SVar:DBDamageAll:DB$ DamageAll | ValidCards$ Creature | NumDmg$ 4 | ValidDescrip K:Station:5 S:Mode$ Continuous | Affected$ Card.Self+counters_GE5_CHARGE | AddType$ Creature | AddKeyword$ Flying & Trample | Description$ STATION 5+ Flying, trample SVar:PlayMain1:TRUE -Oracle:When this Spacecraft enters, destroy target noncreature permanent. Then this Spacecraft deals 4 damage to each creature.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 5+.)\nSTATION 5+\nFlying, trample \ No newline at end of file +Oracle:When this Spacecraft enters, destroy target noncreature permanent. Then this Spacecraft deals 4 damage to each creature.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 5+.)\nSTATION 5+\nFlying, trample diff --git a/forge-gui/res/cardsfolder/upcoming/festering_thicket.txt b/forge-gui/res/cardsfolder/upcoming/festering_thicket.txt index a41212f8489..97b3c45cd00 100644 --- a/forge-gui/res/cardsfolder/upcoming/festering_thicket.txt +++ b/forge-gui/res/cardsfolder/upcoming/festering_thicket.txt @@ -4,4 +4,4 @@ Types:Land Swamp Forest R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ This land enters tapped. SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True K:Cycling:2 -Oracle:({T}: Add {B} or {G}.)\nThis land enters tapped.\nCycling {2} ({2}, Discard this card: Draw a card.) \ No newline at end of file +Oracle:({T}: Add {B} or {G}.)\nThis land enters tapped.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt b/forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt index a0d3eadb7b5..474e3d08810 100644 --- a/forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt +++ b/forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt @@ -4,4 +4,4 @@ Types:Creature Human Scout PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You -Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") \ No newline at end of file +Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt b/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt index 36a31d9536a..4420024c1a9 100644 --- a/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt +++ b/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt @@ -5,4 +5,4 @@ PT:6/5 K:Station:3 S:Mode$ Continuous | Affected$ Card.Self+counters_GE3_CHARGE | AddType$ Creature | AddKeyword$ Flying & Haste | Description$ STATION 3+ Flying, haste SVar:X:Count$Valid Artifact.YouCtrl -Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 3+.)\nSTATION 3+\nFlying, haste \ No newline at end of file +Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 3+.)\nSTATION 3+\nFlying, haste diff --git a/forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt b/forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt index f2a461d4fdb..eac601afde1 100644 --- a/forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt +++ b/forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt @@ -8,4 +8,4 @@ SVar:TrigAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target cr SVar:X:Count$Valid Land.YouCtrl SVar:Y:Count$Compare X GE6.6.3 SVar:BuffedBy:Land -Oracle:Flying\nLandfall — Whenever a land you control enters, target creature has base power and toughness 3/3 until end of turn. If you control six or more lands, that creature has base power and toughness 6/6 until end of turn instead. \ No newline at end of file +Oracle:Flying\nLandfall — Whenever a land you control enters, target creature has base power and toughness 3/3 until end of turn. If you control six or more lands, that creature has base power and toughness 6/6 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt b/forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt index dbd22d462d7..5bc3ac1111b 100644 --- a/forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt +++ b/forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 2 K:Warp:1 G DeckHas:Ability$LifeGain -Oracle:When this creature enters, you gain 2 life.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:When this creature enters, you gain 2 life.\nWarp {1}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/glittering_massif.txt b/forge-gui/res/cardsfolder/upcoming/glittering_massif.txt index 14b20417327..a2087e1f6c6 100644 --- a/forge-gui/res/cardsfolder/upcoming/glittering_massif.txt +++ b/forge-gui/res/cardsfolder/upcoming/glittering_massif.txt @@ -4,4 +4,4 @@ Types:Land Mountain Plains R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ This land enters tapped. SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True K:Cycling:2 -Oracle:({T}: Add {R} or {W}.)\nThis land enters tapped.\nCycling {2} ({2}, Discard this card: Draw a card.) \ No newline at end of file +Oracle:({T}: Add {R} or {W}.)\nThis land enters tapped.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt b/forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt index dade9261b71..ce11f76d556 100644 --- a/forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt +++ b/forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt @@ -6,4 +6,4 @@ K:Ward:2 S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ This creature's power and toughness are each equal to the number of lands you control. SVar:X:Count$Valid Land.YouCtrl SVar:BuffedBy:Land -Oracle:Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.)\nThis creature's power and toughness are each equal to the number of lands you control. \ No newline at end of file +Oracle:Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.)\nThis creature's power and toughness are each equal to the number of lands you control. diff --git a/forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt b/forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt index 2c25c43afec..997653ecdf8 100644 --- a/forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt +++ b/forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt @@ -10,4 +10,4 @@ SVar:Exploration:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | Descrip S:Mode$ Continuous | Affected$ Card.Self+counters_GE8_CHARGE | AddType$ Creature | AddKeyword$ Flying & Vigilance & Haste | AddTrigger$ SacrificeTrig | Description$ STATION 8+ Flying, vigilance, haste,,,Whenever you sacrifice a land, each opponent loses 2 life. SVar:SacrificeTrig:Mode$ Sacrificed | ValidCard$ Land | ValidPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a land, each opponent loses 2 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 -Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 8+.)\nSTATION 2+\n{1}, {T}, Sacrifice a land: Draw two cards. You may play an additional land this turn.\nSTATION 8+\nFlying, vigilance, haste\nWhenever you sacrifice a land, each opponent loses 2 life. \ No newline at end of file +Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 8+.)\nSTATION 2+\n{1}, {T}, Sacrifice a land: Draw two cards. You may play an additional land this turn.\nSTATION 8+\nFlying, vigilance, haste\nWhenever you sacrifice a land, each opponent loses 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt b/forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt index e3dfce083ef..8902b676cec 100644 --- a/forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt +++ b/forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt @@ -7,4 +7,4 @@ SVar:ETBUntapped:DB$ Untap | ETB$ True | Defined$ ReplacedCard T:Mode$ AttackersDeclaredOneTarget | ValidAttackers$ Creature.YouCtrl | AttackedTarget$ Player | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack a player, create a Lander token. (It's an artifact with "{2}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You DeckHas:Ability$Token -Oracle:Lands you control enter untapped.\nWhenever you attack a player, create a Lander token. (It's an artifact with "{2}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") \ No newline at end of file +Oracle:Lands you control enter untapped.\nWhenever you attack a player, create a Lander token. (It's an artifact with "{2}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/hullcarver.txt b/forge-gui/res/cardsfolder/upcoming/hullcarver.txt index 79072a835ec..4e7ba7c24c7 100644 --- a/forge-gui/res/cardsfolder/upcoming/hullcarver.txt +++ b/forge-gui/res/cardsfolder/upcoming/hullcarver.txt @@ -3,4 +3,4 @@ ManaCost:B Types:Artifact Creature Robot Assassin PT:1/1 K:Deathtouch -Oracle:Deathtouch \ No newline at end of file +Oracle:Deathtouch diff --git a/forge-gui/res/cardsfolder/upcoming/hylderblade.txt b/forge-gui/res/cardsfolder/upcoming/hylderblade.txt index 85c74a4d265..0bff05dcbb3 100644 --- a/forge-gui/res/cardsfolder/upcoming/hylderblade.txt +++ b/forge-gui/res/cardsfolder/upcoming/hylderblade.txt @@ -6,4 +6,4 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control K:Equip:4 SVar:X:Count$Void.1.0 -Oracle:Equipped creature gets +3/+1.\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, attach this Equipment to target creature you control.\nEquip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) \ No newline at end of file +Oracle:Equipped creature gets +3/+1.\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, attach this Equipment to target creature you control.\nEquip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt b/forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt index cd741c73a27..4f54ea1295f 100644 --- a/forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt +++ b/forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt @@ -6,4 +6,4 @@ S:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | Description$ You may p S:Mode$ Continuous | Affected$ Land.YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands from your graveyard. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigMill | TriggerDescription$ Landfall — Whenever a land you control enters, mill a card. SVar:TrigMill:DB$ Mill | Defined$ You -Oracle:You may play an additional land on each of your turns.\nYou may play lands from your graveyard.\nLandfall — Whenever a land you control enters, mill a card. \ No newline at end of file +Oracle:You may play an additional land on each of your turns.\nYou may play lands from your graveyard.\nLandfall — Whenever a land you control enters, mill a card. diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt b/forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt index 8c38b98efb1..00fe1d59480 100644 --- a/forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt +++ b/forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt @@ -5,4 +5,4 @@ PT:1/1 K:Flash K:Flying A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | SpellDescription$ Draw a card. -Oracle:Flash\nFlying\n{2}, Sacrifice this creature: Draw a card. \ No newline at end of file +Oracle:Flash\nFlying\n{2}, Sacrifice this creature: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt b/forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt index 8784aa26356..6a9f58598a4 100644 --- a/forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt +++ b/forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt @@ -7,4 +7,4 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:X:Count$Void.1.0 DeckHas:Ability$Counters -Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, put a +1/+1 counter on this creature. \ No newline at end of file +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/insight_engine.txt b/forge-gui/res/cardsfolder/upcoming/insight_engine.txt index 63cd42c0892..0b05346e704 100644 --- a/forge-gui/res/cardsfolder/upcoming/insight_engine.txt +++ b/forge-gui/res/cardsfolder/upcoming/insight_engine.txt @@ -5,4 +5,4 @@ A:AB$ PutCounter | Cost$ 2 T | Defined$ Self | CounterType$ CHARGE | CounterNum$ SVar:DBDraw:DB$ Draw | NumCards$ X SVar:X:Count$CardCounters.CHARGE DeckHas:Ability$Counters -Oracle:{2}, {T}: Put a charge counter on this artifact, then draw a card for each charge counter on it. \ No newline at end of file +Oracle:{2}, {T}: Put a charge counter on this artifact, then draw a card for each charge counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt b/forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt index e7b71959ba0..b666edb85b5 100644 --- a/forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt +++ b/forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt @@ -8,4 +8,4 @@ K:Station:12 S:Mode$ Continuous | Affected$ Card.Self+counters_GE12_CHARGE | AddAbility$ KavaronToken | Description$ STATION 12+ {1}{R}, {T}: Sacrifice a land: Create a 2/2 colorless Robot artifact creature token, then creatures you control get +1/+0 and gain haste until end of turn. SVar:KavaronToken:AB$ Token | Cost$ 1 R T Sac<1/Land> | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You | SubAbility$ DBPumpAll | SpellDescription$ Create a 2/2 colorless Robot artifact creature token, then creatures you control get +1/+0 and gain haste until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Haste -Oracle:This land enters tapped.\n{T}: Add {R}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{1}{R}, {T}: Sacrifice a land: Create a 2/2 colorless Robot artifact creature token, then creatures you control get +1/+0 and gain haste until end of turn. \ No newline at end of file +Oracle:This land enters tapped.\n{T}: Add {R}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{1}{R}, {T}: Sacrifice a land: Create a 2/2 colorless Robot artifact creature token, then creatures you control get +1/+0 and gain haste until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt b/forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt index 0415a7eb8c3..7ce843099bd 100644 --- a/forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt +++ b/forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt @@ -7,4 +7,4 @@ T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescript SVar:TrigProliferate:DB$ Proliferate DeckHas:Ability$Proliferate DeckNeeds:Ability$Counters -Oracle:Haste\nWhenever Kilo becomes tapped, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.) \ No newline at end of file +Oracle:Haste\nWhenever Kilo becomes tapped, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.) diff --git a/forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt b/forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt index d2c3c34298c..4190be020eb 100644 --- a/forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt +++ b/forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt @@ -11,4 +11,4 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | PresentCompare$ GE30 | IsPres SVar:TrigWinsGame:DB$ WinsGame | Defined$ You DeckHas:Ability$Token DeckHints:Type$Artifact -Oracle:Double strike, trample, haste\nWhenever one or more creatures you control deal combat damage to a player, create a Treasure token.\nTreasure Hunter — At the beginning of your upkeep, if you control thirty or more artifacts, you win the game. \ No newline at end of file +Oracle:Double strike, trample, haste\nWhenever one or more creatures you control deal combat damage to a player, create a Treasure token.\nTreasure Hunter — At the beginning of your upkeep, if you control thirty or more artifacts, you win the game. diff --git a/forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt b/forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt index 25eea62cc5d..17c76aa646b 100644 --- a/forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt +++ b/forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigChangeZone:AB$ ChangeZone | Cost$ Sac<1/Land;Lander/land or Lander> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 2 | Tapped$ True K:Station:7 S:Mode$ Continuous | Affected$ Card.Self+counters_GE7_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 7+ Flying -Oracle:When this Spacecraft enters, you may sacrifice a land or Lander. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 7+.)\nSTATION 7+\nFlying \ No newline at end of file +Oracle:When this Spacecraft enters, you may sacrifice a land or Lander. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 7+.)\nSTATION 7+\nFlying diff --git a/forge-gui/res/cardsfolder/upcoming/loading_zone.txt b/forge-gui/res/cardsfolder/upcoming/loading_zone.txt index bf89f41d06f..3dcfd7997c3 100644 --- a/forge-gui/res/cardsfolder/upcoming/loading_zone.txt +++ b/forge-gui/res/cardsfolder/upcoming/loading_zone.txt @@ -5,4 +5,4 @@ R:Event$ AddCounter | ActiveZones$ Battlefield | ValidCard$ Creature.YouCtrl+inZ SVar:DoubleCounters:DB$ ReplaceCounter | Amount$ X SVar:X:ReplaceCount$CounterNum/Twice K:Warp:G -Oracle:If one or more counters would be put on a creature, Spacecraft, or Planet you control, twice that many of each of those kinds of counters are put on it instead.\nWarp {G} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:If one or more counters would be put on a creature, Spacecraft, or Planet you control, twice that many of each of those kinds of counters are put on it instead.\nWarp {G} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt b/forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt index 3b595fe23cb..3cf6308575e 100644 --- a/forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt +++ b/forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt @@ -5,4 +5,4 @@ T:Mode$ AttackersDeclaredOneTarget | ValidAttackers$ Creature.YouCtrl | Attacked SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 A:AB$ Discover | Cost$ 1 SubCounter<2/CHARGE> | Num$ 4 | SorcerySpeed$ True | SpellDescription$ Discover 4. Activate only as a sorcery. (Exile cards from the top of your library until you exile a nonland card with mana value 4 or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order.) DeckHas:Ability$Counters -Oracle:Whenever you attack a player, put a charge counter on this artifact.\n{1}, Remove two charge counters from this artifact: Discover 4. Activate only as a sorcery. (Exile cards from the top of your library until you exile a nonland card with mana value 4 or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order.) \ No newline at end of file +Oracle:Whenever you attack a player, put a charge counter on this artifact.\n{1}, Remove two charge counters from this artifact: Discover 4. Activate only as a sorcery. (Exile cards from the top of your library until you exile a nonland card with mana value 4 or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order.) diff --git a/forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt b/forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt index 6c1809b1f60..39d2b7eadfd 100644 --- a/forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt +++ b/forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt @@ -5,4 +5,4 @@ PT:2/2 K:etbCounter:P1P1:X:no Condition:This creature enters with a +1/+1 counter on it for each other creature and/or artifact you control. SVar:X:Count$Valid Artifact.Other+YouCtrl,Creature.Other+YouCtrl DeckHas:Ability$Counters -Oracle:This creature enters with a +1/+1 counter on it for each other creature and/or artifact you control. \ No newline at end of file +Oracle:This creature enters with a +1/+1 counter on it for each other creature and/or artifact you control. diff --git a/forge-gui/res/cardsfolder/upcoming/mechanozoa.txt b/forge-gui/res/cardsfolder/upcoming/mechanozoa.txt index b18c9ba6305..a9d5ccaebdf 100644 --- a/forge-gui/res/cardsfolder/upcoming/mechanozoa.txt +++ b/forge-gui/res/cardsfolder/upcoming/mechanozoa.txt @@ -7,4 +7,4 @@ SVar:TrigTap:DB$ Tap | ValidTgts$ Artifact.OppCtrl,Creature.OppCtrl | TgtPrompt$ SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 K:Warp:2 U DeckHas:Ability$Counters -Oracle:When this creature enters, tap target artifact or creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nWarp {2}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:When this creature enters, tap target artifact or creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nWarp {2}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/melded_moxite.txt b/forge-gui/res/cardsfolder/upcoming/melded_moxite.txt index d7275d596c4..108879a6aac 100644 --- a/forge-gui/res/cardsfolder/upcoming/melded_moxite.txt +++ b/forge-gui/res/cardsfolder/upcoming/melded_moxite.txt @@ -5,4 +5,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDiscard:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 2 A:AB$ Token | Cost$ 3 Sac<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenTapped$ True | TokenOwner$ You | SpellDescription$ Create a tapped 2/2 colorless Robot artifact creature token. DeckHas:Ability$Discard|Sacrifice|Token -Oracle:When this artifact enters, you may discard a card. If you do, draw two cards.\n{3}, Sacrifice this artifact: Create a tapped 2/2 colorless Robot artifact creature token. \ No newline at end of file +Oracle:When this artifact enters, you may discard a card. If you do, draw two cards.\n{3}, Sacrifice this artifact: Create a tapped 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt b/forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt index a96ae38afc7..e852cbf7761 100644 --- a/forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt +++ b/forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt @@ -4,4 +4,4 @@ Types:Creature Kavu Soldier PT:4/3 S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ 1 | Condition$ PlayerTurn | Description$ During your turn, other creatures you control get +1/+0. K:Warp:1 R -Oracle:During your turn, other creatures you control get +1/+0.\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:During your turn, other creatures you control get +1/+0.\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt b/forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt index f70a3eb76ce..fa4fbffbe7e 100644 --- a/forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt +++ b/forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt @@ -5,4 +5,4 @@ PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land you control enters, double the power of target creature you control until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ Double K:Warp:2 G -Oracle:Landfall — Whenever a land you control enters, double the power of target creature you control until end of turn.\nWarp {2}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Landfall — Whenever a land you control enters, double the power of target creature you control until end of turn.\nWarp {2}{G} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt b/forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt index f4bb0642e49..9ac4d9864dc 100644 --- a/forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt +++ b/forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt @@ -11,4 +11,4 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ SVar:X:TriggeredCard$Valid Card.withFlying DeckHas:Ability$Counters DeckHints:Type$Vehicle -Oracle:Flash\nFlying\nWhenever a Vehicle you control enters, draw a card if it has flying. Otherwise, put a flying counter on it. \ No newline at end of file +Oracle:Flash\nFlying\nWhenever a Vehicle you control enters, draw a card if it has flying. Otherwise, put a flying counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt b/forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt index 7fca177790d..e5976716add 100644 --- a/forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt +++ b/forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt @@ -6,4 +6,4 @@ DeckHints:Type$Creature|Artifact R:Event$ CreateToken | ActiveZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ0 | ValidPlayer$ You | Optional$ True | Layer$ Copy | ReplaceWith$ DBCopy | Description$ The first time you would create one or more tokens each turn, you may instead create that many tokens that are copies of enchanted permanent. SVar:DBCopy:DB$ ReplaceToken | Type$ ReplaceToken | ValidChoices$ Creature.EnchantedBy | TokenScript$ Chosen SVar:X:Count$ThisTurnEntered_Battlefield_Card.tokenCreated+YouOwn -Oracle:Enchant artifact or creature you control\nThe first time you would create one or more tokens each turn, you may instead create that many tokens that are copies of enchanted permanent. \ No newline at end of file +Oracle:Enchant artifact or creature you control\nThe first time you would create one or more tokens each turn, you may instead create that many tokens that are copies of enchanted permanent. diff --git a/forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt b/forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt index 718e0150ddd..04db3c7a9c8 100644 --- a/forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt +++ b/forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt @@ -4,4 +4,4 @@ Types:Sorcery A:SP$ ChooseEvenOdd | StackDescription$ SpellDescription | SubAbility$ DBDestroyAll | SpellDescription$ Choose odd or even. Destroy each creature with mana value of the chosen quality. Then gain control of all creatures until end of turn. Untap them. They gain haste until end of turn. (Zero is even.) SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.cmcChosenEvenOdd | SubAbility$ DBGainControl SVar:DBGainControl:DB$ GainControl | AllValid$ Creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT -Oracle:Choose odd or even. Destroy each creature with mana value of the chosen quality. Then gain control of all creatures until end of turn. Untap them. They gain haste until end of turn. (Zero is even.) \ No newline at end of file +Oracle:Choose odd or even. Destroy each creature with mana value of the chosen quality. Then gain control of all creatures until end of turn. Untap them. They gain haste until end of turn. (Zero is even.) diff --git a/forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt b/forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt index 6cf92935059..d4d52f9692c 100644 --- a/forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt +++ b/forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt @@ -7,4 +7,4 @@ K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this creature enters, it deals 1 damage to target creature an opponent controls. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 1 K:Warp:2 R -Oracle:Flying, haste\nWhen this creature enters, it deals 1 damage to target creature an opponent controls.\nWarp {2}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Flying, haste\nWhen this creature enters, it deals 1 damage to target creature an opponent controls.\nWarp {2}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/nutrient_block.txt b/forge-gui/res/cardsfolder/upcoming/nutrient_block.txt index a237e80b6eb..2bd6938ffeb 100644 --- a/forge-gui/res/cardsfolder/upcoming/nutrient_block.txt +++ b/forge-gui/res/cardsfolder/upcoming/nutrient_block.txt @@ -6,4 +6,4 @@ A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | Spel T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this artifact is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$ Draw DeckHas:Ability$LifeGain -Oracle:Indestructible (Effects that say "destroy" don't destroy this artifact.)\n{2}, {T}, Sacrifice this artifact: You gain 3 life.\nWhen this artifact is put into a graveyard from the battlefield, draw a card. \ No newline at end of file +Oracle:Indestructible (Effects that say "destroy" don't destroy this artifact.)\n{2}, {T}, Sacrifice this artifact: You gain 3 life.\nWhen this artifact is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ouroboroid.txt b/forge-gui/res/cardsfolder/upcoming/ouroboroid.txt index 3ce026834ca..2cbca559f4f 100644 --- a/forge-gui/res/cardsfolder/upcoming/ouroboroid.txt +++ b/forge-gui/res/cardsfolder/upcoming/ouroboroid.txt @@ -6,4 +6,4 @@ T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ X SVar:X:Count$CardPower DeckHas:Ability$Counters -Oracle:At the beginning of combat on your turn, put X +1/+1 counters on each creature you control, where X is this creature's power. \ No newline at end of file +Oracle:At the beginning of combat on your turn, put X +1/+1 counters on each creature you control, where X is this creature's power. diff --git a/forge-gui/res/cardsfolder/upcoming/pain_for_all.txt b/forge-gui/res/cardsfolder/upcoming/pain_for_all.txt index 1c24f46619c..eb10d8e19eb 100644 --- a/forge-gui/res/cardsfolder/upcoming/pain_for_all.txt +++ b/forge-gui/res/cardsfolder/upcoming/pain_for_all.txt @@ -10,4 +10,4 @@ SVar:TrigDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | NumDmg$ Y | DamageSo SVar:X:Enchanted$CardPower SVar:Y:TriggerCount$DamageAmount SVar:PlayMain1:TRUE -Oracle:Enchant creature you control\nWhen this Aura enters, enchanted creature deals damage equal to its power to any other target.\nWhenever enchanted creature is dealt damage, it deals that much damage to each opponent. \ No newline at end of file +Oracle:Enchant creature you control\nWhen this Aura enters, enchanted creature deals damage equal to its power to any other target.\nWhenever enchanted creature is dealt damage, it deals that much damage to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt b/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt index 3924c375b25..752da34ffed 100644 --- a/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt +++ b/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt @@ -7,4 +7,4 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_a_drone_flying_bl K:Warp:UR SVar:BuffedBy:Artifact DeckHints:Type$Artifact -Oracle:Whenever you cast an artifact spell, create a 1/1 colorless Drone artifact creature token with flying and "This token can block only creatures with flying."\nWarp {U/R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Whenever you cast an artifact spell, create a 1/1 colorless Drone artifact creature token with flying and "This token can block only creatures with flying."\nWarp {U/R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt b/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt index 88bbb2f400e..6c9eabf71ba 100644 --- a/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt +++ b/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt @@ -9,4 +9,4 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | CheckSVar$ X | Affected$ Card.IsR SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Kavu.YouCtrl K:Warp:1 R -Oracle:Whenever this creature or another Kavu you control enters, exile the top card of your library. For as long as that card remains exiled, you may play it if you control a Kavu.\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Whenever this creature or another Kavu you control enters, exile the top card of your library. For as long as that card remains exiled, you may play it if you control a Kavu.\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_summit.txt b/forge-gui/res/cardsfolder/upcoming/radiant_summit.txt index 7de34157538..3fd7fcd4425 100644 --- a/forge-gui/res/cardsfolder/upcoming/radiant_summit.txt +++ b/forge-gui/res/cardsfolder/upcoming/radiant_summit.txt @@ -3,4 +3,4 @@ ManaCost:no cost Types:Land Mountain Plains R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | ReplacementResult$ Updated | Description$ This land enters tapped unless you control two or more basic lands. SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Land.Basic+YouCtrl | ConditionCompare$ LE1 -Oracle:({T}: Add {R} or {W}.)\nThis land enters tapped unless you control two or more basic lands. \ No newline at end of file +Oracle:({T}: Add {R} or {W}.)\nThis land enters tapped unless you control two or more basic lands. diff --git a/forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt b/forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt index fca6b547c98..fce7952ea1f 100644 --- a/forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt +++ b/forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt @@ -8,4 +8,4 @@ A:AB$ DealDamage | Cost$ 1 T Sac<1/Food> | NumDmg$ 3 | Defined$ Player.Opponent T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigUntap | TriggerDescription$ At the beginning of each end step, if you gained life this turn, untap NICKNAME. SVar:TrigUntap:DB$ Untap | Defined$ Self SVar:X:Count$LifeYouGainedThisTurn -Oracle:Artifacts you control are Foods in addition to their other types and have "{2}, {T}, Sacrifice this artifact: You gain 3 life."\n{1}, {T}, Sacrifice a Food: Ragost deals 3 damage to each opponent.\nAt the beginning of each end step, if you gained life this turn, untap Ragost. \ No newline at end of file +Oracle:Artifacts you control are Foods in addition to their other types and have "{2}, {T}, Sacrifice this artifact: You gain 3 life."\n{1}, {T}, Sacrifice a Food: Ragost deals 3 damage to each opponent.\nAt the beginning of each end step, if you gained life this turn, untap Ragost. diff --git a/forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt b/forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt index 5138aec3556..82d6da2934c 100644 --- a/forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt +++ b/forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt @@ -4,4 +4,4 @@ Types:Artifact Creature Robot Cat PT:3/3 K:Haste K:Warp:1 R -Oracle:Haste\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Haste\nWarp {1}{R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/roving_actuator.txt b/forge-gui/res/cardsfolder/upcoming/roving_actuator.txt index e8157912963..1de99f43269 100644 --- a/forge-gui/res/cardsfolder/upcoming/roving_actuator.txt +++ b/forge-gui/res/cardsfolder/upcoming/roving_actuator.txt @@ -7,4 +7,4 @@ SVar:TrigExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidSA$ Spell | Optional$ True | CopyCard$ True | WithoutManaCost$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Void.1.0 -Oracle:Void — When this creature enters, if a nonland permanent left the battlefield this turn or a spell was warped this turn, exile up to one target instant or sorcery card with mana value 2 or less from your graveyard. Copy it. You may cast the copy without paying its mana cost. \ No newline at end of file +Oracle:Void — When this creature enters, if a nonland permanent left the battlefield this turn or a spell was warped this turn, exile up to one target instant or sorcery card with mana value 2 or less from your graveyard. Copy it. You may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt b/forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt index f4f270ba4db..7655e234b28 100644 --- a/forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt +++ b/forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt @@ -4,4 +4,4 @@ Types:Sorcery A:SP$ Charm | Choices$ DBDealDamage,DBExile | CharmNum$ 1 SVar:DBDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to each opponent. SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Artifact.cmcLE3 | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile all artifacts with mana value 3 or less. -Oracle:Choose one —\n• Ruinous Rampage deals 3 damage to each opponent.\n• Exile all artifacts with mana value 3 or less. \ No newline at end of file +Oracle:Choose one —\n• Ruinous Rampage deals 3 damage to each opponent.\n• Exile all artifacts with mana value 3 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/rust_harvester.txt b/forge-gui/res/cardsfolder/upcoming/rust_harvester.txt index f8bc97406f7..9b53b40b3c2 100644 --- a/forge-gui/res/cardsfolder/upcoming/rust_harvester.txt +++ b/forge-gui/res/cardsfolder/upcoming/rust_harvester.txt @@ -6,4 +6,4 @@ K:Menace A:AB$ PutCounter | Cost$ 2 T ExileFromGrave<1/Artifact/artifact card> | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDamage | SpellDescription$ Put a +1/+1 counter on this creature, then it deals damage equal to its power to any target. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X SVar:X:Count$CardPower -Oracle:Menace\n{2}, {T}, Exile an artifact card from your graveyard: Put a +1/+1 counter on this creature, then it deals damage equal to its power to any target. \ No newline at end of file +Oracle:Menace\n{2}, {T}, Exile an artifact card from your graveyard: Put a +1/+1 counter on this creature, then it deals damage equal to its power to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt b/forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt index ceeea4663aa..5b9c2e16447 100644 --- a/forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt +++ b/forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt @@ -5,4 +5,4 @@ PT:2/4 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, create a tapped 2/2 colorless Robot artifact creature token. SVar:TrigToken:DB$ Token | TokenScript$ c_2_2_a_robot | TokenTapped$ True DeckHas:Ability$Token & Type$Robot -Oracle:At the beginning of your end step, if you control two or more tapped creatures, create a tapped 2/2 colorless Robot artifact creature token. \ No newline at end of file +Oracle:At the beginning of your end step, if you control two or more tapped creatures, create a tapped 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt b/forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt index b95a08e7489..8e8c86038bd 100644 --- a/forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt +++ b/forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt @@ -5,7 +5,7 @@ PT:1/1 K:Flying T:Mode$ Sacrificed | ValidCard$ Land | Execute$ TrigBranch | TriggerZones$ Battlefield | ValidPlayer$ You | TriggerDescription$ Whenever you sacrifice a land, create a tapped token that's a copy of this creature if seven or more land cards are in your graveyard. Otherwise, create a tapped 1/1 black Insect creature token with flying. SVar:TrigBranch:DB$ Branch | BranchConditionSVar$ X | BranchConditionSVarCompare$ GE7 | TrueSubAbility$ DBCopy | FalseSubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_insect_flying | TokenTapped$ True | TokenOwner$ You +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_insect_flying | TokenTapped$ True | TokenOwner$ You SVar:DBCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1 | TokenTapped$ True SVar:X:Count$ValidGraveyard Land.YouOwn DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt b/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt index 40e7a5592a8..28f92fd7a6d 100644 --- a/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt +++ b/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt @@ -4,4 +4,4 @@ Types:Sorcery A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ 3 | MaxTotalTargetCMC$ 3 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select up to three target creature cards with total mana value 3 or less | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Targeted DeckHas:Ability$Counters -Oracle:Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. \ No newline at end of file +Oracle:Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. diff --git a/forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt b/forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt index a826ba0d203..dc76426177f 100644 --- a/forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt +++ b/forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt @@ -5,4 +5,4 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Pump | Cost$ 2 T tapXType | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SorcerySpeed$ True | SpellDescription$ Target creature gets +X/+0 until end of turn. Activate only as a sorcery. A:AB$ Token | Cost$ 5 T | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | SpellDescription$ Create a 2/2 colorless Robot artifact creature token. SVar:X:Count$xPaid -Oracle:{T}: Add {C}.\n{2}, {T}, Tap X untapped artifacts you control: Target creature gets +X/+0 until end of turn. Activate only as a sorcery.\n{5}, {T}: Create a 2/2 colorless Robot artifact creature token. \ No newline at end of file +Oracle:{T}: Add {C}.\n{2}, {T}, Tap X untapped artifacts you control: Target creature gets +X/+0 until end of turn. Activate only as a sorcery.\n{5}, {T}: Create a 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt b/forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt index 4f533874665..cd59c45d161 100644 --- a/forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt +++ b/forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt @@ -7,4 +7,4 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDraw:DB$ Draw S:Mode$ Continuous | Affected$ Card.wasCastByYou+CastSa Spell.ManaFromArtifact | AffectedZone$ Stack | AddKeyword$ Split second | Description$ Chaos Control — Each spell you cast has split second if mana from an artifact was spent to cast it. (As long as it's on the stack, players can't cast spells or activate abilities that aren't mana abilities.) DeckHints:Ability$Flash|Haste & Type$Artifact -Oracle:Haste\nWhenever Shadow the Hedgehog or another creature you control with flash or haste dies, draw a card.\nChaos Control — Each spell you cast has split second if mana from an artifact was spent to cast it. (As long as it's on the stack, players can't cast spells or activate abilities that aren't mana abilities.) \ No newline at end of file +Oracle:Haste\nWhenever Shadow the Hedgehog or another creature you control with flash or haste dies, draw a card.\nChaos Control — Each spell you cast has split second if mana from an artifact was spent to cast it. (As long as it's on the stack, players can't cast spells or activate abilities that aren't mana abilities.) diff --git a/forge-gui/res/cardsfolder/upcoming/shattered_wings.txt b/forge-gui/res/cardsfolder/upcoming/shattered_wings.txt index 830a2a80175..5b64a4bcb42 100644 --- a/forge-gui/res/cardsfolder/upcoming/shattered_wings.txt +++ b/forge-gui/res/cardsfolder/upcoming/shattered_wings.txt @@ -4,4 +4,4 @@ Types:Sorcery A:SP$ Destroy | ValidTgts$ Artifact,Enchantment,Creature.withFlying | TgtPrompt$ Select target artifact, enchantment, or creature with flying | SubAbility$ DBSurveil | SpellDescription$ Destroy target artifact, enchantment, or creature with flying. Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) SVar:DBSurveil:DB$ Surveil | Amount$ 1 DeckHas:Ability$Surveil|Graveyard -Oracle:Destroy target artifact, enchantment, or creature with flying. Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) \ No newline at end of file +Oracle:Destroy target artifact, enchantment, or creature with flying. Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt b/forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt index 2ceed4b6bde..94f659dbcf9 100644 --- a/forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt +++ b/forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt @@ -8,4 +8,4 @@ SVar:DBMill:DB$ Mill | Defined$ Remembered | NumCards$ X SVar:X:Count$ValidLibrary Card.RememberedPlayerOwn/HalfDown SVar:MaxTgt:PlayerCountPlayers$Amount DeckHas:Ability$Mill -Oracle:Destroy all creatures, then any number of target players each mill half their library, rounded down. \ No newline at end of file +Oracle:Destroy all creatures, then any number of target players each mill half their library, rounded down. diff --git a/forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt b/forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt index f8de4640fcf..ba270c97000 100644 --- a/forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt +++ b/forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt @@ -3,4 +3,4 @@ ManaCost:2 W U Types:Sorcery A:SP$ Mill | NumCards$ X | ValidTgts$ Opponent | SpellDescription$ Target opponent mills cards equal to your life total. SVar:X:Count$YourLifeTotal -Oracle:Target opponent mills cards equal to your life total. \ No newline at end of file +Oracle:Target opponent mills cards equal to your life total. diff --git a/forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt b/forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt index 4ad175640b1..d322858fefd 100644 --- a/forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt +++ b/forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt @@ -7,4 +7,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 K:Warp:1 U DeckHas:Ability$Surveil|Graveyard -Oracle:Flying\nWhen this creature enters, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.)\nWarp {1}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Flying\nWhen this creature enters, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.)\nWarp {1}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt b/forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt index dcae2cb80ca..c08c8b96fba 100644 --- a/forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt +++ b/forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt @@ -6,4 +6,4 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When this creature enters, search your library for a basic Plains card or a creature card with mana value 1 or less, reveal it, put it into your hand, then shuffle. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Plains.Basic,Creature.cmcLE1 | ChangeNum$ 1 K:Warp:1 W -Oracle:Flying\nWhen this creature enters, search your library for a basic Plains card or a creature card with mana value 1 or less, reveal it, put it into your hand, then shuffle.\nWarp {1}{W} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Flying\nWhen this creature enters, search your library for a basic Plains card or a creature card with mana value 1 or less, reveal it, put it into your hand, then shuffle.\nWarp {1}{W} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt b/forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt index 9fb3caed6c6..7f10b6f2052 100644 --- a/forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt +++ b/forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt @@ -4,4 +4,4 @@ Types:Creature Human Bard PT:3/4 S:Mode$ Panharmonicon | ValidMode$ ChangesZone,ChangesZoneAll | ValidCard$ Permanent.YouCtrl | ValidCause$ Permanent | Destination$ Battlefield | Description$ If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. K:Warp:1 U -Oracle:If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nWarp {1}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nWarp {1}{U} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt b/forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt index 0fb346516eb..78feb70e75a 100644 --- a/forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt +++ b/forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt @@ -5,4 +5,4 @@ PT:2/2 T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ Whenever this creature becomes tapped, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 DeckHas:Ability$Surveil|Graveyard -Oracle:Whenever this creature becomes tapped, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) \ No newline at end of file +Oracle:Whenever this creature becomes tapped, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/starport_security.txt b/forge-gui/res/cardsfolder/upcoming/starport_security.txt index bdb8ebef3e2..c12aae4780f 100644 --- a/forge-gui/res/cardsfolder/upcoming/starport_security.txt +++ b/forge-gui/res/cardsfolder/upcoming/starport_security.txt @@ -5,4 +5,4 @@ PT:1/1 A:AB$ Tap | Cost$ 3 W T | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | ReduceCost$ X | SpellDescription$ Tap another target creature. This ability costs {2} less to activate if you control a creature with a +1/+1 counter on it. SVar:X:Count$Compare Y GE1.2.0 SVar:Y:Count$Valid Creature.YouCtrl+counters_GE1_P1P1 -Oracle:{3}{W}, {T}: Tap another target creature. This ability costs {2} less to activate if you control a creature with a +1/+1 counter on it. \ No newline at end of file +Oracle:{3}{W}, {T}: Tap another target creature. This ability costs {2} less to activate if you control a creature with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt b/forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt index fa4c6bfdffc..b661fde74d5 100644 --- a/forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt +++ b/forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt @@ -6,4 +6,4 @@ K:Menace K:Ward:Discard<1/Card> T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever this creature attacks, put a +1/+1 counter on target creature an opponent controls. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | CounterType$ P1P1 | CounterNum$ 1 -Oracle:Menace\nWard—Discard a card.\nWhenever this creature attacks, put a +1/+1 counter on target creature an opponent controls. \ No newline at end of file +Oracle:Menace\nWard—Discard a card.\nWhenever this creature attacks, put a +1/+1 counter on target creature an opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt b/forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt index 9f747da10e2..c49b047f701 100644 --- a/forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt +++ b/forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt @@ -8,4 +8,4 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 K:Warp:B SVar:PlayMain1:TRUE DeckHas:Ability$LifeGain -Oracle:Whenever this creature or another creature or artifact you control dies, target opponent loses 1 life and you gain 1 life.\nWarp {B} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Whenever this creature or another creature or artifact you control dies, target opponent loses 1 life and you gain 1 life.\nWarp {B} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt b/forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt index 2108d4aaf73..2bd6f2ae8c0 100644 --- a/forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt +++ b/forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt @@ -8,4 +8,4 @@ SVar:CombatTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZon SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.Other+YouCtrl | TgtPrompt$ Select another target artifact you control | TargetMin$ 0 | TargetMax$ 1 | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature | Keywords$ Flying S:Mode$ Continuous | Affected$ Card.Self+counters_GE9_CHARGE | AddType$ Creature | AddKeyword$ Flying & Vigilance | Description$ STATION 9+ Flying, vigilance SVar:PlayMain1:TRUE -Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 9+.)\nSTATION 2+\nAt the beginning of combat on your turn, up to one other target artifact you control becomes an artifact creature with base power and toughness 2/2 and gains flying until end of turn.\nSTATION 9+\nFlying, vigilance \ No newline at end of file +Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 9+.)\nSTATION 2+\nAt the beginning of combat on your turn, up to one other target artifact you control becomes an artifact creature with base power and toughness 2/2 and gains flying until end of turn.\nSTATION 9+\nFlying, vigilance diff --git a/forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt b/forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt index 831585be9f2..3a818d12212 100644 --- a/forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt +++ b/forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt @@ -10,4 +10,4 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard,Exile | ValidCard$ Card.Self+powerGE4 | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When NICKNAME dies or is put into exile while its power is 4 or greater, destroy up to one target nonland permanent. SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent DeckHas:Ability$Counters -Oracle:Vigilance, menace\nWhenever another creature you control dies or is put into exile, put a +1/+1 counter on Syr Vondam and you gain 1 life.\nWhen Syr Vondam dies or is put into exile while its power is 4 or greater, destroy up to one target nonland permanent. \ No newline at end of file +Oracle:Vigilance, menace\nWhenever another creature you control dies or is put into exile, put a +1/+1 counter on Syr Vondam and you gain 1 life.\nWhen Syr Vondam dies or is put into exile while its power is 4 or greater, destroy up to one target nonland permanent. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt b/forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt index cd73dd5118e..64837466e97 100644 --- a/forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt +++ b/forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt @@ -8,4 +8,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever NICKNAME enters or attacks, other creatures you control get +1/+0 and gain deathtouch until end of turn. SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+StrictlyOther | NumAtt$ +1 | KW$ Deathtouch SVar:HasAttackEffect:TRUE -Oracle:Deathtouch, lifelink\nWhenever Syr Vondam enters or attacks, other creatures you control get +1/+0 and gain deathtouch until end of turn. \ No newline at end of file +Oracle:Deathtouch, lifelink\nWhenever Syr Vondam enters or attacks, other creatures you control get +1/+0 and gain deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt b/forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt index a0192a77df4..d22eaf17efb 100644 --- a/forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt +++ b/forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt @@ -7,4 +7,4 @@ S:Mode$ Continuous | Affected$ Land.YouOwn | MayPlay$ True | AffectedZone$ Grave T:Mode$ Sacrificed | ValidCard$ Permanent.Other+!token | ValidPlayer$ You | PlayerTurn$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice another nontoken permanent during your turn, put a number of +1/+1 counters equal to NICKNAME's power on up to one other target creature. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target creature you control | CounterType$ P1P1 | CounterNum$ X SVar:X:Count$CardPower -Oracle:Flying\nYou may play lands from your graveyard.\nWhenever you sacrifice another nontoken permanent during your turn, put a number of +1/+1 counters equal to Szarel's power on up to one other target creature. \ No newline at end of file +Oracle:Flying\nYou may play lands from your graveyard.\nWhenever you sacrifice another nontoken permanent during your turn, put a number of +1/+1 counters equal to Szarel's power on up to one other target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt b/forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt index 5a3524e09f9..e6d3a74fd6d 100644 --- a/forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt +++ b/forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.Y SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | ConditionCheckSVar$ Resolved | ConditionSVarCompare$ EQ2 SVar:Resolved:Count$ResolvedThisTurn -Oracle:Landfall — Whenever a land you control enters, Tannuk deals 1 damage to each opponent. If this is the second time this ability has resolved this turn, draw a card. \ No newline at end of file +Oracle:Landfall — Whenever a land you control enters, Tannuk deals 1 damage to each opponent. If this is the second time this ability has resolved this turn, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt b/forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt index 0d3c41b08d5..7f4627c2528 100644 --- a/forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt +++ b/forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt @@ -4,4 +4,4 @@ Types:Sorcery S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | CheckSVar$ X | Description$ Void — This spell costs {2} less to cast if a nonland permanent left the battlefield this turn or a spell was warped this turn. A:SP$ Discard | ValidTgts$ Player | NumCards$ 1 | DiscardValid$ Card.nonLand | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. SVar:X:Count$Void.1.0 -Oracle:Void — This spell costs {2} less to cast if a nonland permanent left the battlefield this turn or a spell was warped this turn.\nTarget opponent reveals their hand. You choose a nonland card from it. That player discards that card. \ No newline at end of file +Oracle:Void — This spell costs {2} less to cast if a nonland permanent left the battlefield this turn or a spell was warped this turn.\nTarget opponent reveals their hand. You choose a nonland card from it. That player discards that card. diff --git a/forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt b/forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt index ea47f49fb93..40db1777ab0 100644 --- a/forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt +++ b/forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ TerrapactToken,TerrapactPutCounter SVar:TerrapactToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You | SpellDescription$ CARDNAME's controller creates two Lander tokens. SVar:TerrapactPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ CARDNAME's controller puts two +1/+1 counters on it. -Oracle:When this creature enters, target opponent may have you create two Lander tokens. If they don't, put two +1/+1 counters on this creature. (A Lander token is an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") \ No newline at end of file +Oracle:When this creature enters, target opponent may have you create two Lander tokens. If they don't, put two +1/+1 counters on this creature. (A Lander token is an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/the_endstone.txt b/forge-gui/res/cardsfolder/upcoming/the_endstone.txt index ec46596fe1b..462b10df642 100644 --- a/forge-gui/res/cardsfolder/upcoming/the_endstone.txt +++ b/forge-gui/res/cardsfolder/upcoming/the_endstone.txt @@ -7,4 +7,4 @@ SVar:TrigDraw:DB$ Draw T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSetLife | TriggerDescription$ At the beginning of your end step, your life total becomes half your starting life total, rounded up. SVar:TrigSetLife:DB$ SetLife | Defined$ You | LifeAmount$ X SVar:X:Count$YourStartingLife/HalfUp -Oracle:Whenever you play a land or cast a spell, draw a card.\nAt the beginning of your end step, your life total becomes half your starting life total, rounded up. \ No newline at end of file +Oracle:Whenever you play a land or cast a spell, draw a card.\nAt the beginning of your end step, your life total becomes half your starting life total, rounded up. diff --git a/forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt b/forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt index de7f7d636b7..d80da291443 100644 --- a/forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt +++ b/forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt @@ -3,4 +3,4 @@ ManaCost:B Types:Sorcery A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. Void — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. SVar:X:Count$Void.10.2 -Oracle:Target creature gets -2/-2 until end of turn.\nVoid — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. \ No newline at end of file +Oracle:Target creature gets -2/-2 until end of turn.\nVoid — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/unravel.txt b/forge-gui/res/cardsfolder/upcoming/unravel.txt index d8eec16bf5e..376ad13328d 100644 --- a/forge-gui/res/cardsfolder/upcoming/unravel.txt +++ b/forge-gui/res/cardsfolder/upcoming/unravel.txt @@ -5,4 +5,4 @@ A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ SVar:DBDraw:DB$ Draw | ConditionCheckSVar$ X | ConditionSVarCompare$ LTY SVar:X:Targeted$CastTotalManaSpent SVar:Y:Targeted$CardManaCost -Oracle:Counter target spell. If the amount of mana spent to cast that spell was less than its mana value, you draw a card. \ No newline at end of file +Oracle:Counter target spell. If the amount of mana spent to cast that spell was less than its mana value, you draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt b/forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt index 95461d0bf76..7a6d3241a3f 100644 --- a/forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt +++ b/forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt @@ -10,4 +10,4 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CHARGE | Counter S:Mode$ Continuous | Affected$ Card.Self+counters_GE12_CHARGE | AddType$ Creature | AddKeyword$ Flying | AddStaticAbility$ CraftStatic | Description$ STATION 12+ Flying,,,This Spacecraft gets +1/+0 for each artifact you control. SVar:CraftStatic:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | Description$ This Spacecraft gets +1/+0 for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl -Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 12+.)\nSTATION 3+\nWhenever you cast an artifact spell, draw a card. Put a charge counter on this Spacecraft.\nSTATION 12+\nFlying\nThis Spacecraft gets +1/+0 for each artifact you control. \ No newline at end of file +Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 12+.)\nSTATION 3+\nWhenever you cast an artifact spell, draw a card. Put a charge counter on this Spacecraft.\nSTATION 12+\nFlying\nThis Spacecraft gets +1/+0 for each artifact you control. diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt b/forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt index fab14f35b81..88c2f6e6361 100644 --- a/forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt +++ b/forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt @@ -8,4 +8,4 @@ K:Station:12 S:Mode$ Continuous | Affected$ Card.Self+counters_GE12_CHARGE | AddAbility$ UthrosMana | Description$ STATION 12+ {U}, {T}: Add {U} for each artifact you control. SVar:UthrosMana:AB$ Mana | Cost$ U T | Produced$ U | Amount$ X | SpellDescription$ Add {U} for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl -Oracle:This land enters tapped.\n{T}: Add {U}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{U}, {T}: Add {U} for each artifact you control. \ No newline at end of file +Oracle:This land enters tapped.\n{T}: Add {U}.\nStation (Tap another creature you control: Put charge counters equal to its power on this Planet. Station only as a sorcery.)\nSTATION 12+\n{U}, {T}: Add {U} for each artifact you control. diff --git a/forge-gui/res/cardsfolder/upcoming/vernal_fen.txt b/forge-gui/res/cardsfolder/upcoming/vernal_fen.txt index a57c225c022..12654b2570c 100644 --- a/forge-gui/res/cardsfolder/upcoming/vernal_fen.txt +++ b/forge-gui/res/cardsfolder/upcoming/vernal_fen.txt @@ -3,4 +3,4 @@ ManaCost:no cost Types:Land Swamp Forest R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | ReplacementResult$ Updated | Description$ This land enters tapped unless you control two or more basic lands. SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Land.Basic+YouCtrl | ConditionCompare$ LE1 -Oracle:({T}: Add {B} or {G}.)\nThis land enters tapped unless you control two or more basic lands. \ No newline at end of file +Oracle:({T}: Add {B} or {G}.)\nThis land enters tapped unless you control two or more basic lands. diff --git a/forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt b/forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt index 80f194ba1ff..daa529ab575 100644 --- a/forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt +++ b/forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt @@ -7,4 +7,4 @@ SVar:TrigDraw:DB$ Draw | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 SVar:X:Count$Void.1.0 DeckHas:Ability$Counters -Oracle:Void — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, you draw a card and lose 1 life. \ No newline at end of file +Oracle:Void — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, you draw a card and lose 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/vote_out.txt b/forge-gui/res/cardsfolder/upcoming/vote_out.txt index 017f7e3a5bf..5106a7a2132 100644 --- a/forge-gui/res/cardsfolder/upcoming/vote_out.txt +++ b/forge-gui/res/cardsfolder/upcoming/vote_out.txt @@ -3,4 +3,4 @@ ManaCost:3 B Types:Instant K:Convoke A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nDestroy target creature. \ No newline at end of file +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nDestroy target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt b/forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt index 2e1fb956ddc..71399ea0e1e 100644 --- a/forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt +++ b/forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt @@ -7,4 +7,4 @@ SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select K:Station:6 S:Mode$ Continuous | Affected$ Card.Self+counters_GE6_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 6+ Flying SVar:X:Count$Valid Artifact.YouCtrl -Oracle:When this Spacecraft enters, it deals damage equal to the number of artifacts you control to target creature an opponent controls.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 6+.)\nSTATION 6+\nFlying \ No newline at end of file +Oracle:When this Spacecraft enters, it deals damage equal to the number of artifacts you control to target creature an opponent controls.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 6+.)\nSTATION 6+\nFlying diff --git a/forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt b/forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt index bae46e74339..035431c478e 100644 --- a/forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt +++ b/forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt @@ -5,4 +5,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifa SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ munitions | TokenOwner$ You SVar:BuffedBy:Artifact DeckHas:Ability$Token -Oracle:Whenever a nontoken artifact you control enters, create a colorless artifact token named Munitions with "When this token leaves the battlefield, it deals 2 damage to any target." \ No newline at end of file +Oracle:Whenever a nontoken artifact you control enters, create a colorless artifact token named Munitions with "When this token leaves the battlefield, it deals 2 damage to any target." diff --git a/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt b/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt index 95d1a66095e..16239be4f45 100644 --- a/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt +++ b/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt @@ -5,4 +5,4 @@ PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl,Artifact.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent. SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 K:Warp:R -Oracle:Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent.\nWarp {R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) \ No newline at end of file +Oracle:Whenever another creature or artifact you control enters, this creature deals 1 damage to each opponent.\nWarp {R} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt b/forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt index 3c375580fa2..c581d857c0f 100644 --- a/forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt +++ b/forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 K:Station:4 S:Mode$ Continuous | Affected$ Card.Self+counters_GE4_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 4+ Flying -Oracle:When this Spacecraft enters, surveil 2.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 4+.)\nSTATION 4+\nFlying \ No newline at end of file +Oracle:When this Spacecraft enters, surveil 2.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 4+.)\nSTATION 4+\nFlying From d3e6932a235fb69419566aa443d8a7e8e62e9efe Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 18 Jul 2025 04:40:10 -0400 Subject: [PATCH 029/183] Fix Dionus' power (#8100) --- forge-gui/res/cardsfolder/d/dionus_elvish_archdruid.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/dionus_elvish_archdruid.txt b/forge-gui/res/cardsfolder/d/dionus_elvish_archdruid.txt index bb084d4525d..169a34d87cf 100644 --- a/forge-gui/res/cardsfolder/d/dionus_elvish_archdruid.txt +++ b/forge-gui/res/cardsfolder/d/dionus_elvish_archdruid.txt @@ -1,7 +1,7 @@ Name:Dionus, Elvish Archdruid ManaCost:3 G Types:Legendary Creature Elf Druid -PT:2/3 +PT:3/3 S:Mode$ Continuous | Affected$ Elf.YouCtrl | AddTrigger$ TrigTapped | Description$ Elves you control have "Whenever this creature becomes tapped during your turn, untap it and put a +1/+1 counter on it. This ability triggers only once each turn." SVar:TrigTapped:Mode$ Taps | ValidCard$ Card.Self | TriggerZones$ Battlefield | ActivationLimit$ 1 | PlayerTurn$ True | Execute$ TrigUntap | TriggerDescription$ Whenever this creature becomes tapped during your turn, untap it and put a +1/+1 counter on it. This ability triggers only once each turn. SVar:TrigUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPutCounter From 48247f7d3b70d5e2ba01ab8e640dc44d99bdc733 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:58:56 +0100 Subject: [PATCH 030/183] Edition updates --- forge-gui/res/editions/Edge of Eternities.txt | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index 6d6858940d1..589ca097d93 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -40,12 +40,16 @@ ScryfallCode=EOE 43 U Wedgelight Rammer @Nadia Hurianova 46 U Annul @Carlos Palma Cruchaga 47 U Atomic Microsizer @Gabor Szikszai +48 U Cerebral Download @Antonio José Manzanedo +50 U Codecracker Hound @Julia Metzger 51 R Consult the Star Charts @Antonio José Manzanedo 52 C Cryogen Relic @Eelis Kyttanen 54 U Desculpting Blast @Jeremy Wilson 56 R Emissary Escort @Igor Grechanyi +57 U Gigastorm Titan @Bryan Sola 58 C Illvoi Galeblade @Nathaniel Himawan 63 U Mechan Assembler @Mirko Failoni +64 U Mechan Navigator @Konstantin Porubov 66 C Mechanozoa @Daarken 68 R Mm'menon, the Right Hand @Joshua Raphael 69 R Moonlit Meditation @Liiga Smilshkalne @@ -64,12 +68,14 @@ ScryfallCode=EOE 86 M Weftwalking @Rovina Cai 87 M Alpharael, Stonechosen @Kieran Yanner 88 R Archenemy's Charm @Brigitte Roka & Clifton Stommel +90 U Blade of the Swarm @Nino Is 91 R Chorale of the Void @Alix Branwyn 94 C Decode Transmissions @Josh Hass 96 U Dubious Delicacy @Tianxing Xu 97 R Elegy Acolyte @Diana Franco 98 C Embrace Oblivion @Andreas Zafiratos 99 R Entropic Battlecruiser @Josiah "Jo" Cameron +100 U Faller's Faithful @Lie Setiawan 101 U Fell Gravship @David Álvarez 103 C Gravkill @Dominik Mayer 105 C Hullcarver @Michal Ivan @@ -99,6 +105,7 @@ ScryfallCode=EOE 142 U Lithobraking @Andrew Mar 143 C Melded Moxite @Alexandr Leskinen 144 U Memorial Team Leader @Andrew Mar +145 R "Forgotten Sock Closet" @Javier Charro 148 R Nova Hellkite @Raymond Swanland 151 R Pain for All @Dmitry Burmak 152 C Plasma Bolt @Viko Menezes @@ -109,6 +116,7 @@ ScryfallCode=EOE 158 U Ruinous Rampage @David Astruga 159 R Rust Harvester @Jake Murray 161 U Systems Override @Hardy Fowler +162 M Tannuk, Steadfast Second @Raymond Swanland 164 U Terrapact Intimidator @Slawomir Maniak 167 R Warmaker Gunship @Julian Kok Joon Wen 168 R Weapons Manufacturing @Marco Gorlei @@ -124,15 +132,22 @@ ScryfallCode=EOE 183 R Frenzied Baloth @Diana Franco 184 C Fungal Colossus @Sergey Glushakov 185 C Galactic Wayfarer @Quintin Gleim +188 U Glacier Godmaw @ 189 U Harmonious Grovestrider @Ron Spencer 190 U Hemosymbic Mite @Amanda Lee +192 R Icetill Explorer @Warren Mahy +194 U Larval Scoutlander @Javier Charro +195 U Lashwhip Predator @Brian Valeza 196 R Loading Zone @Matt Stewart 197 U Meltstrider Eulogist @Jason A. Engle +199 U Meltstrider's Resolve @Carlos Palma Cruchaga 200 R Mightform Harmonizer @Bartek Fedyczak 201 M Ouroboroid @Samuel Perin +202 U Pull Through the Weft @Andrew Mar 203 C Sami's Curiosity @Tuan Duong Chu 205 U Seedship Impact @Constantin Marin 206 C Shattered Wings @Sergey Glushakov +208 R Sledge-Class Seedship @Leon Tukker 209 U Tapestry Warden @Andreas Zafiratos 210 R Terrasymbiosis @Viko Menezes 212 U Alpharael, Dreaming Acolyte @Cristi Balanescu @@ -144,6 +159,7 @@ ScryfallCode=EOE 218 U Haliya, Ascendant Cadet @Justyna Dura 219 R Infinite Guideline Station @Piotr Dura 220 U Interceptor Mechan @Leonardo Santanna +221 U Mm'menon, Uthros Exile @Fajareka Setiawan 222 R Mutinous Massacre @Quintin Gleim 223 R Pinnacle Emissary @Alejandro Pacheco 224 R Ragost, Deft Gastronaut @Zack Stella @@ -217,6 +233,7 @@ ScryfallCode=EOE 293 R Elegy Acolyte @Justin Hernandez & Alexis Hernandez 294 R Xu-Ifit, Osteoharmonist @Ashley Mackenzie 295 R Possibility Technician @Matthew G. Lewis +296 M Tannuk, Steadfast Second @Pascal Blanché 297 R Mightform Harmonizer @Jessica Fong 298 R Dyadrine, Synthesis Amalgam @Matthew G. Lewis 299 R Genemorph Imago @Benjamin Ee @@ -236,11 +253,12 @@ ScryfallCode=EOE 313 R Cosmogoyf @Princess Hidir 314 R Mutinous Massacre @Jack Hughes 315 R Space-Time Anomaly @Princess Hidir -316 R Secluded Starforge @ +316 R Secluded Starforge @Jaime A. Zuverza 317 R Anticausal Vestige @Chase Stone 318 M Exalted Sunborn @Scott M. Fischer 319 R Hardlight Containment @Dominik Mayer 321 R Lumen-Class Frigate @Zezhou Chen +322 R Pinnacle Starcage @Leon Tukker 323 R The Seriema @Sergey Glushakov 324 R Sunstar Chaplain @Valera Lutfullina 325 R Consult the Star Charts @Antonio José Manzanedo @@ -260,7 +278,9 @@ ScryfallCode=EOE 340 R Bioengineered Future @Constantin Marin 341 M Famished Worldsire @Kev Walker 342 R Frenzied Baloth @Diana Franco +343 R Icetill Explorer @Warren Mahy 345 M Ouroboroid @Samuel Perin +346 R Sledge-Class Seedship @Leon Tukker 347 R Biotech Specialist @Alexandre Honoré 348 R Infinite Guideline Station @Piotr Dura 349 R Pinnacle Emissary @Alejandro Pacheco @@ -276,9 +296,11 @@ ScryfallCode=EOE 359 M Starfield Vocalist @nina 360 M Sothera, the Supervoid @Mateusz Urbanowicz 361 M Devastating Onslaught @Naochika Morishita +362 M Icetill Explorer @Raimaru 363 M Mutinous Massacre @Aogachou 364 M The Dominion Bracelet @Mai Minamiura 365 M The Endstone @Hidetaka Tenjin +366 M Secluded Starforge @Makoto Yukimura 367 L Plains @Adam Paquette 368 L Island @Adam Paquette 369 L Swamp @Adam Paquette @@ -299,10 +321,11 @@ ScryfallCode=EOE 384 M Exalted Sunborn @Makoron 385 M Starfield Vocalist @nina 386 M Sothera, the Supervoid @Mateusz Urbanowicz +388 M Icetill Explorer @Raimaru 389 M Mutinous Massacre @Aogachou 390 M The Dominion Bracelet @Mai Minamiura 391 M The Endstone @Hidetaka Tenjin -392 M Secluded Starforge @ +392 M Secluded Starforge @Makoto Yukimura 393 U Starfield Shepherd @Marta Nael 394 U Annul @Carlos Palma Cruchaga 395 U Umbral Collar Zealot @Dmitry Burmak From 1d2852fff6d528f875416858ae40c71741550c47 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Fri, 18 Jul 2025 10:03:29 +0100 Subject: [PATCH 031/183] Update Edge of Eternities Stellar Sights.txt --- forge-gui/res/editions/Edge of Eternities Stellar Sights.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt index 18f449540ac..11aa4327a05 100644 --- a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt +++ b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt @@ -62,6 +62,7 @@ ScryfallCode=EOS 57 M Dust Bowl @Aeron Ng 58 R Echoing Deeps @Sam Chivers 59 R Eldrazi Temple @BEMOCS +60 R Endless Sands @WFlemming Illustration 61 M Gemstone Caverns @BEMOCS 62 M Grove of the Burnwillows @Sam Chivers 63 R High Market @WFlemming Illustration From f889abd57a273a47db8e73fc2b230cb485075e57 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Fri, 18 Jul 2025 10:11:28 +0100 Subject: [PATCH 032/183] Update Secret Lair Drop Series.txt --- forge-gui/res/editions/Secret Lair Drop Series.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 4fcab61e344..7dcd7789aff 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -793,6 +793,7 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi 814 R Seven Dwarves @Wojtek Łebski 815 R Seven Dwarves @Michelle Ku 816 R Seven Dwarves @Lisa Hanawalt +817 R Seven Dwarves @S.Britt 820 R Arcane Signet @Rovina Cai 820★ R Arcane Signet @Rovina Cai 821 R Echo of Eons @Alex Petty @@ -804,6 +805,7 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi 827 R Norin the Wary @Jarel Threat 827b R Norin the Wary @Jarel Threat 828 R Keen Duelist @Thanh Tuấn +834 R Cleaver Skaab @Johann Bodin 835 R Fatestitcher @E. M. Gist 836 R Undead Alchemist @Michael C. Hayes 837 R Champion of the Perished @Kekai Kotaki @@ -816,13 +818,17 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi 844 R Headless Rider @E. M. Gist 845 R Liliana's Standard Bearer @Josh Hass 846 M Mikaeus, the Unhallowed @Chris Rahn +847 R Phyrexian Crusader @Eric Deschamps 848 R Pontiff of Blight @Seb McKinnon 849 R Ravenous Rotbelly @Nils Hamm 850 M Relentless Dead @Ryan Yee +851 M Rot Hulk @Grzegorz Rutkowski 852 R Rotting Regisaur @Randy Vargas +853 R Stitcher's Supplier @Chris Seaman 854 R Tomb Tyrant @Chris Cold 855 R Tormod, the Desecrator @Grzegorz Rutkowski 856 R Vindictive Lich @Toma Feizo Gas +857 R Neheb, Dreadhorde Champion @Igor Kieryluk 858 R Diregraf Captain @Slawomir Maniak 859 M Havengul Lich @James Ryman 860 M Nekusar, the Mindrazer @Mark Winters @@ -2031,6 +2037,11 @@ F1540 M Rainbow Dash @John Thacker 7010 R Counterspell @Tyler Walpole 7011 R Dismember @Gregg Schigiel 7012 R Command Tower @Jon Vermilyea +7022 R Goblin Bombardment @Phil Foglio +7023 M Consecrated Sphinx @Imiri Sakabashira +7024 R Resculpt @Imiri Sakabashira +7025 R Mirage Mirror @Imiri Sakabashira +7026 M Scion of Draco @Imiri Sakabashira 7027 R Tibalt's Trickery @Babs Webb 7028 R Minds Aglow @Evan Geltosky 7029 R Command Tower @Dan Black From 2ff0c6b92d0bb9a02a8d38446ae1f8721bec37f2 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 18 Jul 2025 11:10:30 +0100 Subject: [PATCH 033/183] Add files via upload (#8102) --- forge-gui/res/cardsfolder/upcoming/baloth_prime.txt | 2 +- forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt | 2 +- forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt b/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt index 7d666f6ecf5..b6d48c64f59 100644 --- a/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt +++ b/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt @@ -9,5 +9,5 @@ T:Mode$ Sacrificed | ValidCard$ Land | Execute$ TrigToken | TriggerZones$ Battle SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_4_4_beast | TokenTapped$ True | SubAbility$ DBUntap | TokenOwner$ You SVar:DBUntap:DB$ Untap A:AB$ GainLife | Cost$ 4 Sac<1/Land> | Defined$ You | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -DeckHas:Ability$Counters|Token|Lifegain +DeckHas:Ability$Counters|Token|LifeGain Oracle:This creature enters tapped with six stun counters on it. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nWhenever you sacrifice a land, create a tapped 4/4 green Beast creature token and untap this creature.\n{4}, Sacrifice a land: You gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt b/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt index 752da34ffed..3f173c8e11d 100644 --- a/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt +++ b/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt @@ -1,4 +1,4 @@ -Name:Pinnacle Emisary +Name:Pinnacle Emissary ManaCost:1 U R Types:Artifact Creature Robot PT:3/3 diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt b/forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt index a15ab5eac6b..c69c6a1b769 100644 --- a/forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt +++ b/forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigExile:DB$ ChangeZoneAll | ChangeType$ Artifact.cmcLE2,Creature.cmcLE2 | Duration$ UntilHostLeavesPlay | Origin$ Battlefield | Destination$ Exile A:AB$ ChangeZoneAll | Cost$ 6 W W | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Graveyard | RememberChanged$ True | SubAbility$ DBToken | SpellDescription$ Put each card exiled with this artifact into its owner's graveyard, then create a 2/2 colorless Robot artifact creature token for each card put into a graveyard this way. Sacrifice this artifact. SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_2_2_a_robot | TokenOwner$ You | SubAbility$ DBSac -SVar:DBSac:DB$ Sacrifice | SacValid$ Self | SubSbility$ DBCleanup +SVar:DBSac:DB$ Sacrifice | SacValid$ Self | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Valid Card.inZoneGraveyard SVar:OblivionRing:TRUE diff --git a/forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt b/forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt index d2800ae45ea..fcdd1926b80 100644 --- a/forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt +++ b/forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt @@ -3,7 +3,7 @@ ManaCost:5 W Types:Artifact Spacecraft PT:5/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this Spacecraft enters, return target creature or enchantment card from your graveyard to the battlefield. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Batlefield | ValidTgts$ Creature.YouOwn,Enchantment.YouOwn | TgtPrompt$ Select target creature or enchantment card in your graveyard +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn,Enchantment.YouOwn | TgtPrompt$ Select target creature or enchantment card in your graveyard K:Station:10 S:Mode$ Continuous | Affected$ Card.Self+counters_GE10_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 10+ Flying Oracle:When this Spacecraft enters, return target creature or enchantment card from your graveyard to the battlefield.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 10+.)\nSTATION 10+\nFlying From fce67b847c544a5e060cdcafbfdf8e6bd56f26dc Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Fri, 18 Jul 2025 08:48:48 -0400 Subject: [PATCH 034/183] moxite_refinery.txt and support (#7997) --- .../main/java/forge/ai/AiCostDecision.java | 12 +++- .../src/main/java/forge/game/GameEntity.java | 11 ++++ .../java/forge/game/ability/AbilityUtils.java | 11 +--- .../main/java/forge/game/card/CardLists.java | 5 +- .../forge/game/cost/CostRemoveCounter.java | 42 +++++++----- .../cardsfolder/upcoming/moxite_refinery.txt | 10 +++ .../upcoming/scout_for_survivors.txt | 2 +- .../java/forge/player/HumanCostDecision.java | 66 ++++++++++++++++--- 8 files changed, 122 insertions(+), 37 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 92fe7fc1252..52d9ad4f90a 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -767,6 +767,12 @@ public class AiCostDecision extends CostDecisionMakerBase { public PaymentDecision visit(CostRemoveCounter cost) { final String amount = cost.getAmount(); final String type = cost.getType(); + final GameEntityCounterTable counterTable = new GameEntityCounterTable(); + + // TODO Help AI filter card with most useless counters and put those counters in countertable for things like + // Moxite Refinery, similar to CostRemoveAnyCounter + // Probably a lot of that decision making can be re-used or pulled out for both PaymentDecisions to use + if (cost.counter == null) return null; int c; @@ -795,7 +801,8 @@ public class AiCostDecision extends CostDecisionMakerBase { } for (Card card : typeList) { if (card.getCounters(cost.counter) >= c) { - return PaymentDecision.card(card, c); + counterTable.put(null, card, cost.counter, c); + return PaymentDecision.counters(counterTable); } } return null; @@ -806,7 +813,8 @@ public class AiCostDecision extends CostDecisionMakerBase { return null; } - return PaymentDecision.card(source, c); + counterTable.put(null, source, cost.counter, c); + return PaymentDecision.counters(counterTable); } @Override diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 3c4981f8736..966c4382799 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -290,6 +290,17 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { return counters; } + // get total number of all counters on an entity + public final int getNumAllCounters() { + int count = 0; + for (Integer i : getCounters().values()) { + if (i != null && i > 0) { + count += i; + } + } + return count; + } + public final int getCounters(final CounterType counterName) { Integer value = counters.get(counterName); return value == null ? 0 : value; diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 1f7da6d1470..28f26ae520a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2114,15 +2114,8 @@ public class AbilityUtils { if (sq[0].contains("CardCounters")) { // CardCounters.ALL to be used for Kinsbaile Borderguard and anything that cares about all counters int count = 0; - if (sq[1].equals("ALL")) { - for (Integer i : c.getCounters().values()) { - if (i != null && i > 0) { - count += i; - } - } - } else { - count = c.getCounters(CounterType.getType(sq[1])); - } + if (sq[1].equals("ALL")) count = c.getNumAllCounters(); + else count = c.getCounters(CounterType.getType(sq[1])); return doXMath(count, expr, c, ctb); } diff --git a/forge-game/src/main/java/forge/game/card/CardLists.java b/forge-game/src/main/java/forge/game/card/CardLists.java index a31f2fe2805..279499db015 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -63,6 +63,10 @@ public class CardLists { return CardLists.filter(in, c -> c.getNetPower() <= lessthanPower); } + public static CardCollection filterAnyCounters(final Iterable in, final int atLeastCounters) { + return CardLists.filter(in, c -> c.getNumAllCounters() >= atLeastCounters); + } + public static final Comparator ToughnessComparator = Comparator.comparingInt(Card::getNetToughness); public static final Comparator ToughnessComparatorInv = Comparator.comparingInt(Card::getNetToughness).reversed(); public static final Comparator PowerComparator = Comparator.comparingInt(Card::getNetCombatDamage); @@ -419,7 +423,6 @@ public class CardLists { * Given a list of cards, return their combined power * * @param cardList the list of creature cards for which to sum the power - * @param crew for cards that crew with toughness rather than power */ public static int getTotalPower(Iterable cardList, CardTraitBase ctb) { int total = 0; diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index 8a199a3f196..289fcc62f23 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -18,6 +18,7 @@ package forge.game.cost; import com.google.common.collect.Lists; +import forge.game.GameEntity; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CounterEnumType; @@ -28,6 +29,8 @@ import forge.game.zone.ZoneType; import forge.util.Lang; import java.util.List; +import java.util.Map; +import java.util.Optional; /** * The Class CostRemoveCounter. @@ -72,9 +75,10 @@ public class CostRemoveCounter extends CostPart { final CounterType cntrs = this.counter; final Card source = ability.getHostCard(); final String type = this.getType(); + final boolean anyCounters = cntrs == null; if (this.payCostFromSource()) { - return source.getCounters(cntrs); + return anyCounters ? source.getNumAllCounters() : source.getCounters(cntrs); } List typeList; @@ -87,7 +91,7 @@ public class CostRemoveCounter extends CostPart { // Single Target int maxcount = 0; for (Card c : typeList) { - maxcount = Math.max(maxcount, c.getCounters(cntrs)); + maxcount = anyCounters ? Math.max(maxcount, c.getNumAllCounters()) : Math.max(maxcount, c.getCounters(cntrs)); } return maxcount; } @@ -100,22 +104,26 @@ public class CostRemoveCounter extends CostPart { @Override public final String toString() { final StringBuilder sb = new StringBuilder(); - if (this.counter.is(CounterEnumType.LOYALTY) && payCostFromSource()) { + final boolean anyCounter = this.counter == null; + final String ctrName = anyCounter ? "counters" : this.counter.getName().toLowerCase() + " counters"; + if (this.counter != null && this.counter.is(CounterEnumType.LOYALTY) && payCostFromSource()) { sb.append("-").append(this.getAmount()); } else { sb.append("Remove "); if (this.getAmount().equals("X")) { if (oneOrMore) { sb.append("one or more "); + } else if (anyCounter) { + sb.append ("X "); } else { sb.append("any number of "); } - sb.append(this.counter.getName().toLowerCase()).append(" counters"); + sb.append(ctrName); } else if (this.getAmount().equals("All")) { - sb.append("all ").append(this.counter.getName().toLowerCase()).append(" counters"); + sb.append("all ").append(ctrName); } else { sb.append(Lang.nounWithNumeralExceptOne(this.getAmount(), - this.counter.getName().toLowerCase() + " counter")); + anyCounter ? "counter" : this.counter.getName().toLowerCase() + " counter")); } sb.append(" from "); @@ -142,15 +150,16 @@ public class CostRemoveCounter extends CostPart { final CounterType cntrs = this.counter; final Card source = ability.getHostCard(); final String type = this.getType(); + final boolean anyCounters = cntrs == null; final int amount; if (getAmount().equals("All")) { - amount = source.getCounters(cntrs); + amount = anyCounters ? source.getNumAllCounters() : source.getCounters(cntrs); } else { amount = getAbilityAmount(ability); } if (this.payCostFromSource()) { - return !source.isPhasedOut() && (source.getCounters(cntrs) - amount) >= 0; + return !source.isPhasedOut() && ((anyCounters ? source.getNumAllCounters() : source.getCounters(cntrs)) - amount) >= 0; } List typeList; @@ -162,7 +171,7 @@ public class CostRemoveCounter extends CostPart { // (default logic) remove X counters from a single permanent for (Card c : typeList) { - if (c.getCounters(cntrs) - amount >= 0) { + if ((anyCounters ? c.getNumAllCounters() : c.getCounters(cntrs)) - amount >= 0) { return true; } } @@ -173,13 +182,14 @@ public class CostRemoveCounter extends CostPart { @Override public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility ability, final boolean effect) { int removed = 0; - final int toRemove = decision.c; - - // for this cost, the list should be only one - for (Card c : decision.cards) { - removed += toRemove; - c.subtractCounter(counter, toRemove, ai); - c.getGame().updateLastStateForCard(c); + for (Map.Entry> e : decision.counterTable.row(Optional.empty()).entrySet()) { + for (Map.Entry v : e.getValue().entrySet()) { + removed += v.getValue(); + e.getKey().subtractCounter(v.getKey(), v.getValue(), ai); + } + if (e.getKey() instanceof Card) { + e.getKey().getGame().updateLastStateForCard((Card) e.getKey()); + } } ability.setSVar("CostCountersRemoved", Integer.toString(removed)); diff --git a/forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt b/forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt new file mode 100644 index 00000000000..a978f22c9ca --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt @@ -0,0 +1,10 @@ +Name:Moxite Refinery +ManaCost:2 +Types:Artifact +A:AB$ Charm | Cost$ 2 T SubCounter | Choices$ Artifact,Creature | CharmNum$ 1 | SorcerySpeed$ True | AdditionalDescription$ . Activate only as a sorcery. +SVar:Artifact:DB$ PutCounter | ValidTgts$ Artifact | CounterType$ CHARGE | CounterNum$ X | SpellDescription$ Put X charge counters on target artifact. +SVar:Creature:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ X | SpellDescription$ Put X +1/+1 counters on target creature. +SVar:X:Count$xPaid +DeckNeeds:Ability$Counters +DeckHas:Ability$Counters +Oracle:{2}, {T}, Remove X counters from an artifact or creature you control: Choose one. Activate only as a sorcery.\n• Put X charge counters on target artifact.\n• Put X +1/+1 counters on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt b/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt index 28f92fd7a6d..015e2b37d00 100644 --- a/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt +++ b/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt @@ -3,5 +3,5 @@ ManaCost:2 W Types:Sorcery A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ 3 | MaxTotalTargetCMC$ 3 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select up to three target creature cards with total mana value 3 or less | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Targeted -DeckHas:Ability$Counters +DeckHas:Ability$Counters|Graveyard Oracle:Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 9eef2afd608..75696abf7a2 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -1,5 +1,6 @@ package forge.player; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import forge.card.CardType; @@ -10,6 +11,7 @@ import forge.game.card.*; import forge.game.cost.*; import forge.game.player.Player; import forge.game.player.PlayerCollection; +import forge.game.player.PlayerController; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; @@ -1096,6 +1098,9 @@ public class HumanCostDecision extends CostDecisionMakerBase { public PaymentDecision visit(final CostRemoveCounter cost) { final String amount = cost.getAmount(); final String type = cost.getType(); + final CounterType cntrs = cost.counter; + final boolean anyCounters = cntrs == null; + GameEntityCounterTable counterTable; int cntRemoved = 1; if (!amount.equals("All")) { @@ -1103,9 +1108,10 @@ public class HumanCostDecision extends CostDecisionMakerBase { } if (cost.payCostFromSource()) { - final int maxCounters = source.getCounters(cost.counter); + final int maxCounters = anyCounters ? source.getNumAllCounters() : source.getCounters(cntrs); if (amount.equals("All")) { - if (!InputConfirm.confirm(controller, ability, Localizer.getInstance().getMessage("lblRemoveAllCountersConfirm"))) { + String prompt = Localizer.getInstance().getMessage("lblRemoveAllCountersConfirm") + (anyCounters ? "" : " (" + cntrs.getName() + ")"); + if (!InputConfirm.confirm(controller, ability, prompt)) { return null; } cntRemoved = maxCounters; @@ -1114,7 +1120,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (maxCounters < cntRemoved) { return null; } - if (!confirmAction(cost, Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm", amount, cost.counter.getName().toLowerCase(), CardTranslation.getTranslatedName(source.getName())))) { + if (!confirmAction(cost, Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm", amount, anyCounters ? "" : cntrs.getName().toLowerCase(), CardTranslation.getTranslatedName(source.getName())))) { return null; } } @@ -1122,10 +1128,13 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (maxCounters < cntRemoved) { return null; } - return PaymentDecision.card(source, cntRemoved >= 0 ? cntRemoved : maxCounters); + counterTable = generateCounterTable(source, cntrs, cntRemoved >= 0 ? cntRemoved : maxCounters, ability); + if (counterTable.isEmpty()) return null; + return PaymentDecision.counters(counterTable); } else if (type.equals("OriginalHost")) { - final int maxCounters = ability.getOriginalHost().getCounters(cost.counter); + final Card origHost = ability.getOriginalHost(); + final int maxCounters = anyCounters ? origHost.getNumAllCounters() : origHost.getCounters(cntrs); if (amount.equals("All")) { cntRemoved = maxCounters; } @@ -1133,12 +1142,15 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } - return PaymentDecision.card(ability.getOriginalHost(), cntRemoved >= 0 ? cntRemoved : maxCounters); + counterTable = generateCounterTable(origHost, cntrs, cntRemoved >= 0 ? cntRemoved : maxCounters, ability); + if (counterTable.isEmpty()) return null; + return PaymentDecision.counters(counterTable); } CardCollectionView validCards = CardLists.getValidCards(player.getCardsIn(cost.zone), type.split(";"), player, source, ability); // you can only select 1 card to remove N counters from - validCards = CardLists.filter(validCards, CardPredicates.hasCounter(cost.counter, cntRemoved)); + validCards = anyCounters ? CardLists.filterAnyCounters(validCards, cntRemoved) : + CardLists.filter(validCards, CardPredicates.hasCounter(cntrs, cntRemoved)); if (validCards.isEmpty()) { return null; } @@ -1157,7 +1169,45 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } - return PaymentDecision.card(selected, cntRemoved); + counterTable = generateCounterTable(selected, cntrs, cntRemoved, ability); + if (counterTable.isEmpty()) return null; + return PaymentDecision.counters(counterTable); + } + + private GameEntityCounterTable generateCounterTable (final Card c, final CounterType cType, int cntToRemove, final SpellAbility sa) { + final GameEntityCounterTable counterTable = new GameEntityCounterTable(); + if (cType != null) { + counterTable.put(null, c, cType, cntToRemove); + } else { + Map cMap = counterTable.filterToRemove(c); + for (CounterType ct : ImmutableList.copyOf(cMap.keySet())) { + if (!c.canRemoveCounters(ct)) { + cMap.remove(ct); + } + } + if (cMap.isEmpty()) return counterTable; + if (cMap.size() == 1) { + counterTable.put(null, c, cMap.entrySet().iterator().next().getKey(), cntToRemove); + } else while (cntToRemove > 0) { + final PlayerController pc = c.getController().getController(); + + String prompt = Localizer.getInstance().getMessage("lblSelectCountersTypeToRemove"); + CounterType chosen = pc.chooseCounterType(Lists.newArrayList(cMap.keySet()), sa, prompt, null); + + int max = Math.min(cntToRemove, cMap.get(chosen)); + int remaining = Aggregates.sum(cMap.values()); + int min = Math.max(1, max - remaining); + prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", chosen.getName()); + int chosenAmount = pc.chooseNumber(sa, prompt, min, max, null); + + if (chosenAmount > 0) { + counterTable.put(null, c, chosen, chosenAmount); + cMap = counterTable.filterToRemove(c); + } + cntToRemove -= chosenAmount; + } + } + return counterTable; } @Override From 71882fe83cd2ad620d81e8f897dfc068ff9b463d Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:32:30 +0100 Subject: [PATCH 035/183] EOE: Memorial Vault (#8108) --- forge-gui/res/cardsfolder/upcoming/memorial_vault.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/memorial_vault.txt diff --git a/forge-gui/res/cardsfolder/upcoming/memorial_vault.txt b/forge-gui/res/cardsfolder/upcoming/memorial_vault.txt new file mode 100644 index 00000000000..d9a701cf3bb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/memorial_vault.txt @@ -0,0 +1,10 @@ +Name:Memorial Vault +ManaCost:3 R +Types:Artifact +A:AB$ Dig | Cost$ T Sac<1/Artifact.Other/another artifact> | Defined$ You | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBMayPlay | SpellDescription$ Exile the top X cards of your library, where X is one plus the mana value of the sacrificed artifact. You may play those cards this turn. +SVar:DBMayPlay:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | Description$ You may play the exiled cards this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Sacrificed$CardManaCost/Plus.1 +DeckHas:Ability$Sacrifice +Oracle:{T}, Sacrifice another artifact: Exile the top X cards of your library, where X is one plus the mana value of the sacrificed artifact. You may play those cards this turn. From 0e0811a1ac8a43baaa97a9c9e6fd307b3eb377e0 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Sat, 19 Jul 2025 09:51:55 +0200 Subject: [PATCH 036/183] Final EOE batch (part 1) (#8103) --- forge-gui/res/cardsfolder/d/desynchronize.txt | 4 +- .../upcoming/auxiliary_boosters.txt | 11 ++ .../upcoming/brightspear_zealot.txt | 8 ++ .../upcoming/cloudsculpt_technician.txt | 9 ++ .../res/cardsfolder/upcoming/cryoshatter.txt | 10 ++ .../upcoming/dawnstrike_vanguard.txt | 9 ++ .../cardsfolder/upcoming/divert_disaster.txt | 6 ++ .../cardsfolder/upcoming/dockworker_drone.txt | 10 ++ .../cardsfolder/upcoming/dual_sun_adepts.txt | 7 ++ .../cardsfolder/upcoming/exosuit_savior.txt | 8 ++ .../upcoming/flight_deck_coordinator.txt | 8 ++ .../upcoming/illvoi_infiltrator.txt | 9 ++ .../upcoming/illvoi_light_jammer.txt | 10 ++ .../cardsfolder/upcoming/illvoi_operative.txt | 9 ++ .../cardsfolder/upcoming/knight_luminary.txt | 8 ++ .../cardsfolder/upcoming/lost_in_space.txt | 7 ++ .../res/cardsfolder/upcoming/seam_rip.txt | 8 ++ .../upcoming/squires_lightblade.txt | 10 ++ .../upcoming/sunstar_lightsmith.txt | 10 ++ .../upcoming/weftblade_enhancer.txt | 8 ++ .../cardsfolder/upcoming/zealous_display.txt | 6 ++ .../Counter Intelligence [EOC] [2025].dck | 102 ++++++++++++++++++ 22 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cryoshatter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/divert_disaster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/knight_luminary.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lost_in_space.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/seam_rip.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/zealous_display.txt create mode 100644 forge-gui/res/quest/commanderprecons/Counter Intelligence [EOC] [2025].dck diff --git a/forge-gui/res/cardsfolder/d/desynchronize.txt b/forge-gui/res/cardsfolder/d/desynchronize.txt index e33a8985072..25d11e30f01 100644 --- a/forge-gui/res/cardsfolder/d/desynchronize.txt +++ b/forge-gui/res/cardsfolder/d/desynchronize.txt @@ -1,6 +1,6 @@ Name:Desynchronize ManaCost:4 U Types:Instant -A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | AlternativeDecider$ TargetedOwner | Origin$ Battlefield | Destination$ Library | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | SubAbility$ DBScry | StackDescription$ {p:TargetedOwner} puts {c:Targeted} on the top or bottom of their library. | SpellDescription$ Target nonland permanent's owner puts it on the top or bottom of their library. +A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | AlternativeDecider$ TargetedOwner | Origin$ Battlefield | Destination$ Library | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | SubAbility$ DBScry | StackDescription$ {p:TargetedOwner} puts {c:Targeted} on the top or bottom of their library. | SpellDescription$ Target nonland permanent's owner puts it on their choice of the top or bottom of their library. SVar:DBScry:DB$ Scry | ScryNum$ 2 | SpellDescription$ Scry 2. -Oracle:Target nonland permanent's owner puts it on the top or bottom of their library. Scry 2. +Oracle:Target nonland permanent's owner puts it on their choice of the top or bottom of their library. Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt b/forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt new file mode 100644 index 00000000000..03e5d5cb690 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt @@ -0,0 +1,11 @@ +Name:Auxiliary Boosters +ManaCost:4 W +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this Equipment enters, create a 2/2 colorless Robot artifact creature token and attach this Equipment to it. +SVar:TrigToken:DB$ Token | TokenScript$ c_2_2_a_robot | RememberTokens$ True | SubAbility$ DBAttach +SVar:DBAttach:DB$ Attach | Defined$ Remembered | Object$ Self | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Flying | Description$ Equipped creature gets +1/+2 and has flying. +K:Equip:3 +DeckHas:Ability$Token +Oracle:When this Equipment enters, create a 2/2 colorless Robot artifact creature token and attach this Equipment to it.\nEquipped creature gets +1/+2 and has flying.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt b/forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt new file mode 100644 index 00000000000..84e060efa41 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt @@ -0,0 +1,8 @@ +Name:Brightspear Zealot +ManaCost:2 W +Types:Creature Human Soldier +PT:2/4 +K:Vigilance +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | CheckSVar$ X | SVarCompare$ GE2 | Description$ This creature gets +2/+0 as long as you've cast two or more spells this turn. +SVar:X:Count$ThisTurnCast_Card.YouCtrl +Oracle:Vigilance\nThis creature gets +2/+0 as long as you've cast two or more spells this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt b/forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt new file mode 100644 index 00000000000..a9a52392751 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt @@ -0,0 +1,9 @@ +Name:Cloudsculpt Technician +ManaCost:2 U +Types:Creature Jellyfish Artificer +PT:1/4 +K:Flying +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | IsPresent$ Artifact.YouCtrl | Description$ As long as you control an artifact, this creature gets +1/+0. +SVar:BuffedBy:Artifact +DeckHints:Type$Artifact +Oracle:Flying\nAs long as you control an artifact, this creature gets +1/+0. diff --git a/forge-gui/res/cardsfolder/upcoming/cryoshatter.txt b/forge-gui/res/cardsfolder/upcoming/cryoshatter.txt new file mode 100644 index 00000000000..d28bec1e0e9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cryoshatter.txt @@ -0,0 +1,10 @@ +Name:Cryoshatter +ManaCost:U +Types:Enchantment Aura +K:Enchant:Creature +SVar:AttachAILogic:Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -5 | Description$ Enchanted creature gets -5/-0. +T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When enchanted creature becomes tapped or is dealt damage, destroy it. +T:Mode$ DamageDoneOnce | ValidTarget$ Creature.EnchantedBy | Execute$ TrigDestroy | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When enchanted creature becomes tapped or is dealt damage, destroy it. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy +Oracle:Enchant creature\nEnchanted creature gets -5/-0.\nWhen enchanted creature becomes tapped or is dealt damage, destroy it. diff --git a/forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt b/forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt new file mode 100644 index 00000000000..b906fb0bb74 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt @@ -0,0 +1,9 @@ +Name:Dawnstrike Vanguard +ManaCost:5 W +Types:Creature Human Knight +PT:4/5 +K:Lifelink +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, put a +1/+1 counter on each creature you control other than this creature. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl+StrictlyOther | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Lifelink\nAt the beginning of your end step, if you control two or more tapped creatures, put a +1/+1 counter on each creature you control other than this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/divert_disaster.txt b/forge-gui/res/cardsfolder/upcoming/divert_disaster.txt new file mode 100644 index 00000000000..3d4bf5ec0c6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/divert_disaster.txt @@ -0,0 +1,6 @@ +Name:Divert Disaster +ManaCost:1 U +Types:Instant +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | UnlessResolveSubs$ WhenPaid | SubAbility$ DBToken | SpellDescription$ Counter target spell unless its controller pays {2}. If they do, you create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You +Oracle:Counter target spell unless its controller pays {2}. If they do, you create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt b/forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt new file mode 100644 index 00000000000..5f50e96dd40 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt @@ -0,0 +1,10 @@ +Name:Dockworker Drone +ManaCost:1 W +Types:Artifact Creature Robot +PT:0/0 +K:etbCounter:P1P1:1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature dies, put its counters on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ EachFromSource | EachFromSource$ TriggeredCardLKICopy +SVar:SacMe:2 +DeckHas:Ability$Counters +Oracle:This creature enters with a +1/+1 counter on it.\nWhen this creature dies, put its counters on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt b/forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt new file mode 100644 index 00000000000..3d93e0eb8e5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt @@ -0,0 +1,7 @@ +Name:Dual-Sun Adepts +ManaCost:2 W +Types:Creature Human Soldier +PT:2/2 +K:Double Strike +A:AB$ PumpAll | Cost$ 5 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. +Oracle:Double strike\n{5}: Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt b/forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt new file mode 100644 index 00000000000..cfed67db95f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt @@ -0,0 +1,8 @@ +Name:Exosuit Savior +ManaCost:2 W +Types:Creature Human Soldier +PT:2/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When this creature enters, return up to one other target permanent you control to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Permanent.Other+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Select up to one other target permanent you control +Oracle:Flying\nWhen this creature enters, return up to one other target permanent you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt b/forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt new file mode 100644 index 00000000000..10a2adaa93c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt @@ -0,0 +1,8 @@ +Name:Flight-Deck Coordinator +ManaCost:2 W +Types:Creature Human Soldier +PT:3/3 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, you gain 2 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +DeckHas:Ability$LifeGain +Oracle:At the beginning of your end step, if you control two or more tapped creatures, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt b/forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt new file mode 100644 index 00000000000..c0aa33ec10c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt @@ -0,0 +1,9 @@ +Name:Illvoi Infiltrator +ManaCost:2 U +Types:Creature Jellyfish Rogue +PT:1/3 +S:Mode$ CantBlockBy | ValidAttacker$ Card.Self | CheckSVar$ X | SVarCompare$ GE2 | Description$ This creature can't be blocked if you've cast two or more spells this turn. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever this creature deals combat damage to an opponent, draw a card. +SVar:TrigDraw:DB$ Draw +SVar:X:Count$ThisTurnCast_Card.YouCtrl +Oracle:This creature can't be blocked if you've cast two or more spells this turn.\nWhenever this creature deals combat damage to an opponent, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt b/forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt new file mode 100644 index 00000000000..74bf34a60dc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt @@ -0,0 +1,10 @@ +Name:Illvoi Light Jammer +ManaCost:1 U +Types:Artifact Equipment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When this Equipment enters, attach it to target creature you control. That creature gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Hexproof +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Equipped creature gets +1/+2. +K:Equip:3 +Oracle:Flash\nWhen this Equipment enters, attach it to target creature you control. That creature gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)\nEquipped creature gets +1/+2.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt b/forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt new file mode 100644 index 00000000000..6868b9be54e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt @@ -0,0 +1,9 @@ +Name:Illvoi Operative +ManaCost:1 U +Types:Creature Jellyfish Rogue +PT:2/1 +T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ DBPutCounter | ActivatorThisTurnCast$ EQ2 | TriggerDescription$ Whenever you cast your second spell each turn, put a +1/+1 counter on this creature. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Card +DeckHas:Ability$Counters +Oracle:Whenever you cast your second spell each turn, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/knight_luminary.txt b/forge-gui/res/cardsfolder/upcoming/knight_luminary.txt new file mode 100644 index 00000000000..8aded02cf8f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knight_luminary.txt @@ -0,0 +1,8 @@ +Name:Knight Luminary +ManaCost:3 W +Types:Creature Human Knight +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a 1/1 white Human Soldier creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You +K:Warp:1 W +Oracle:When this creature enters, create a 1/1 white Human Soldier creature token.\nWarp {1}{W} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/lost_in_space.txt b/forge-gui/res/cardsfolder/upcoming/lost_in_space.txt new file mode 100644 index 00000000000..3c78f897bb6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lost_in_space.txt @@ -0,0 +1,7 @@ +Name:Lost in Space +ManaCost:3 U +Types:Instant +A:SP$ ChangeZone | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | AlternativeDecider$ TargetedOwner | Origin$ Battlefield | Destination$ Library | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | SubAbility$ DBSurveil | SpellDescription$ Target artifact or creature's owner puts it on their choice of the top or bottom of their library. Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) +SVar:DBSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil|Graveyard +Oracle:Target artifact or creature's owner puts it on their choice of the top or bottom of their library. Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/seam_rip.txt b/forge-gui/res/cardsfolder/upcoming/seam_rip.txt new file mode 100644 index 00000000000..f754a2873e3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seam_rip.txt @@ -0,0 +1,8 @@ +Name:Seam Rip +ManaCost:W +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this enchantment enters, exile target nonland permanent an opponent controls with mana value 2 or less until this enchantment leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl+cmcLE2 | TgtPrompt$ Select target nonland permanent an opponent controls with mana value 2 or less | Duration$ UntilHostLeavesPlay +SVar:PlayMain1:TRUE +SVar:OblivionRing:TRUE +Oracle:When this enchantment enters, exile target nonland permanent an opponent controls with mana value 2 or less until this enchantment leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt b/forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt new file mode 100644 index 00000000000..2057ee52357 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt @@ -0,0 +1,10 @@ +Name:Squire's Lightblade +ManaCost:W +Types:Artifact Equipment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When this Equipment enters, attach it to target creature you control. That creature gains first strike until end of turn. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ First Strike +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | Description$ Equipped creature gets +1/+0. +K:Equip:3 +Oracle:Flash\nWhen this Equipment enters, attach it to target creature you control. That creature gains first strike until end of turn.\nEquipped creature gets +1/+0.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt b/forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt new file mode 100644 index 00000000000..efecdfd88f7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt @@ -0,0 +1,10 @@ +Name:Sunstar Lightsmith +ManaCost:3 W +Types:Creature Human Artificer +PT:3/3 +T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | ActivatorThisTurnCast$ EQ2 | TriggerDescription$ Whenever you cast your second spell each turn, put a +1/+1 counter on this creature and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +SVar:BuffedBy:Card +DeckHas:Ability$Counters +Oracle:Whenever you cast your second spell each turn, put a +1/+1 counter on this creature and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt b/forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt new file mode 100644 index 00000000000..71d94f44473 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt @@ -0,0 +1,8 @@ +Name:Weftblade Enhancer +ManaCost:5 W +Types:Creature Drix Artificer +PT:3/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature enters, put a +1/+1 counter on each of up to two target creatures. +SVar:TrigPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ 1 +K:Warp:2 W +Oracle:When this creature enters, put a +1/+1 counter on each of up to two target creatures.\nWarp {2}{W} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/zealous_display.txt b/forge-gui/res/cardsfolder/upcoming/zealous_display.txt new file mode 100644 index 00000000000..c7cd6b377ea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/zealous_display.txt @@ -0,0 +1,6 @@ +Name:Zealous Display +ManaCost:2 W +Types:Instant +A:SP$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +2/+0 until end of turn. If it's not your turn, untap those creatures. +SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ False +Oracle:Creatures you control get +2/+0 until end of turn. If it's not your turn, untap those creatures. diff --git a/forge-gui/res/quest/commanderprecons/Counter Intelligence [EOC] [2025].dck b/forge-gui/res/quest/commanderprecons/Counter Intelligence [EOC] [2025].dck new file mode 100644 index 00000000000..70f3e8721e8 --- /dev/null +++ b/forge-gui/res/quest/commanderprecons/Counter Intelligence [EOC] [2025].dck @@ -0,0 +1,102 @@ +[metadata] +Name=Counter Intelligence [EOC] [2025] +[Commander] +1 Inspirit, Flagship Vessel|EOC|1 +[Main] +1 Insight Engine|EOC|1 +1 Uthros Research Craft|EOC|1 +1 Long-Range Sensor|EOC|1 +1 Moxite Refinery|EOC|1 +1 Solar Array|EOC|1 +1 Cloud Key|EOC|1 +1 Gavel of the Righteous|EOC|1 +1 Astral Cornucopia|EOC|1 +1 Darksteel Reactor|EOC|1 +1 Empowered Autogenerator|EOC|1 +1 Lux Artillery|EOC|1 +1 Lux Cannon|EOC|1 +1 Titan Forge|EOC|1 +1 Arcane Signet|EOC|1 +1 Pentad Prism|EOC|1 +1 Sol Ring|EOC|1 +1 Everflowing Chalice|EOC|1 +1 Golem Foundry|EOC|1 +1 Soul-Guide Lantern|EOC|1 +1 Kilo, Apogee Mind|EOC|1 +1 Patrolling Peacemaker|EOC|1 +1 Depthshaker Titan|EOC|1 +1 Surge Conductor|EOC|1 +1 Angel of the Ruins|EOC|1 +1 Chrome Host Seedshark|EOC|1 +1 Cyberdrive Awakener|EOC|1 +1 Deepglow Skate|EOC|1 +1 Emry, Lurker of the Loch|EOC|1 +1 Kappa Cannoneer|EOC|1 +1 Phyrexian Metamorph|EOC|1 +1 Tekuthal, Inquiry Dominus|EOC|1 +1 Thought Monitor|EOC|1 +1 Alibou, Ancient Witness|EOC|1 +1 Jhoira, Weatherlight Captain|EOC|1 +1 Crystalline Crawler|EOC|1 +1 Hangarback Walker|EOC|1 +1 Steel Overseer|EOC|1 +1 Threefold Thunderhulk|EOC|1 +1 Etherium Sculptor|EOC|1 +1 Thrummingbird|EOC|1 +1 Enthusiastic Mechanaut|EOC|1 +1 Coretapper|EOC|1 +1 Etched Oracle|EOC|1 +1 Mindless Automaton|EOC|1 +1 Swan Song|EOC|1 +1 Chaos Warp|EOC|1 +1 Pull from Tomorrow|EOC|1 +1 Ripples of Potential|EOC|1 +1 Swords to Plowshares|EOC|1 +1 Thirst for Knowledge|EOC|1 +1 Dispatch|EOC|1 +1 Experimental Augury|EOC|1 +1 Fumigate|EOC|1 +1 Organic Extinction|EOC|1 +1 Universal Surveillance|EOC|1 +1 Chain Reaction|EOC|1 +1 Wake the Past|EOC|1 +1 Tezzeret's Gambit|EOC|1 +1 Resourceful Defense|EOC|1 +1 Glittering Massif|EOC|1 +1 Radiant Summit|EOC|1 +1 Battlefield Forge|EOC|1 +1 Adarkar Wastes|EOC|1 +1 Cascade Bluffs|EOC|1 +1 Clifftop Retreat|EOC|1 +1 Exotic Orchard|EOC|1 +1 Glacial Fortress|EOC|1 +1 Irrigated Farmland|EOC|1 +1 Karn's Bastion|EOC|1 +1 The Mycosynth Gardens|EOC|1 +1 Rugged Prairie|EOC|1 +1 Shivan Reef|EOC|1 +1 Skycloud Expanse|EOC|1 +1 Spire of Industry|EOC|1 +1 Sulfur Falls|EOC|1 +1 Temple of Enlightenment|EOC|1 +1 Temple of Epiphany|EOC|1 +1 Temple of Triumph|EOC|1 +1 Command Tower|EOC|1 +1 Ancient Den|EOC|1 +1 Buried Ruin|EOC|1 +1 Evolving Wilds|EOC|1 +1 Great Furnace|EOC|1 +1 Lonely Sandbar|EOC|1 +1 Mystic Monastery|EOC|1 +1 Razortide Bridge|EOC|1 +1 Rustvale Bridge|EOC|1 +1 Seat of the Synod|EOC|1 +1 Secluded Steppe|EOC|1 +1 Silverbluff Bridge|EOC|1 +2 Plains|EOE|2 +1 Plains|EOE|3 +2 Island|EOE|2 +1 Island|EOE|3 +2 Mountain|EOE|2 +1 Mountain|EOE|3 +[Sideboard] \ No newline at end of file From 4f662a5651d73f8fc8b40c5ac7ff549b4fd63588 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Sat, 19 Jul 2025 09:56:02 +0200 Subject: [PATCH 037/183] Final EOE batch (part 2) (#8105) --- forge-gui/res/cardsfolder/a/against_all_odds.txt | 2 +- forge-gui/res/cardsfolder/b/black_dragon.txt | 2 +- forge-gui/res/cardsfolder/e/evolution_charm.txt | 2 +- .../res/cardsfolder/upcoming/comet_crawler.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/dark_endurance.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/depressurize.txt | 6 ++++++ .../res/cardsfolder/upcoming/drill_too_deep.txt | 7 +++++++ .../cardsfolder/upcoming/frontline_war_rager.txt | 9 +++++++++ .../cardsfolder/upcoming/galvanizing_sawship.txt | 1 - .../res/cardsfolder/upcoming/gravblade_heavy.txt | 8 ++++++++ .../res/cardsfolder/upcoming/gravpack_monoist.txt | 9 +++++++++ .../res/cardsfolder/upcoming/kavaron_skywarden.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/kavaron_turbodrone.txt | 6 ++++++ .../res/cardsfolder/upcoming/mechan_shieldmate.txt | 8 ++++++++ .../res/cardsfolder/upcoming/mental_modulation.txt | 7 +++++++ .../res/cardsfolder/upcoming/monoist_sentry.txt | 6 ++++++ .../res/cardsfolder/upcoming/nanoform_sentinel.txt | 7 +++++++ .../res/cardsfolder/upcoming/perigee_beckoner.txt | 13 +++++++++++++ .../res/cardsfolder/upcoming/scour_for_scrap.txt | 7 +++++++ .../cardsfolder/upcoming/scrounge_for_eternity.txt | 6 ++++++ .../res/cardsfolder/upcoming/selfcraft_mechan.txt | 11 +++++++++++ .../cardsfolder/upcoming/sinister_cryologist.txt | 8 ++++++++ .../cardsfolder/upcoming/susurian_dirgecraft.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/swarm_culler.txt | 9 +++++++++ 24 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/comet_crawler.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dark_endurance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/depressurize.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mental_modulation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/swarm_culler.txt diff --git a/forge-gui/res/cardsfolder/a/against_all_odds.txt b/forge-gui/res/cardsfolder/a/against_all_odds.txt index d4fa1a1e82e..a15043af7ea 100644 --- a/forge-gui/res/cardsfolder/a/against_all_odds.txt +++ b/forge-gui/res/cardsfolder/a/against_all_odds.txt @@ -5,6 +5,6 @@ A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBFlicker,DBReturnArtifact SVar:DBFlicker:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl,Artifact.YouCtrl | TgtPrompt$ Select target creature or artifact you control | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SpellDescription$ Exile target artifact or creature you control, then return it to the battlefield under its owner's control. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:DBReturnArtifact:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.YouCtrl+cmcLE3,Creature.YouCtrl+cmcLE3 | TgtPrompt$ Select target artifact or creature to return from your graveyard | SpellDescription$ Return target artifact or creature card with mana value 3 or less from your graveyard to the battlefield. +SVar:DBReturnArtifact:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.YouCtrl+cmcLE3,Creature.YouCtrl+cmcLE3 | TgtPrompt$ Select target artifact or creature card with mana value 3 or less in your graveyard | SpellDescription$ Return target artifact or creature card with mana value 3 or less from your graveyard to the battlefield. DeckHas:Ability$Graveyard Oracle:Choose one or both —\n• Exile target artifact or creature you control, then return it to the battlefield under its owner's control.\n• Return target artifact or creature card with mana value 3 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/b/black_dragon.txt b/forge-gui/res/cardsfolder/b/black_dragon.txt index f4868c32e18..dcc8bda7425 100644 --- a/forge-gui/res/cardsfolder/b/black_dragon.txt +++ b/forge-gui/res/cardsfolder/b/black_dragon.txt @@ -4,5 +4,5 @@ Types:Creature Dragon PT:4/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Acid Breath — When CARDNAME enters, target creature an opponent controls gets -3/-3 until end of turn. -SVar:TrigPump:DB$ Pump | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature +SVar:TrigPump:DB$ Pump | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls Oracle:Flying\nAcid Breath — When Black Dragon enters, target creature an opponent controls gets -3/-3 until end of turn. diff --git a/forge-gui/res/cardsfolder/e/evolution_charm.txt b/forge-gui/res/cardsfolder/e/evolution_charm.txt index ae362bee8a9..8946fd1b636 100644 --- a/forge-gui/res/cardsfolder/e/evolution_charm.txt +++ b/forge-gui/res/cardsfolder/e/evolution_charm.txt @@ -2,7 +2,7 @@ Name:Evolution Charm ManaCost:1 G Types:Instant A:SP$ Charm | Choices$ SearchLand,Return,DoPump | CharmNum$ 1 -SVar:SearchLand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | PrecostDesc$ Choose one — | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle. +SVar:SearchLand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle. SVar:Return:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. SVar:DoPump:DB$ Pump | ValidTgts$ Creature | KW$ Flying | TgtPrompt$ Select target creature | SpellDescription$ Target creature gains flying until end of turn. AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/comet_crawler.txt b/forge-gui/res/cardsfolder/upcoming/comet_crawler.txt new file mode 100644 index 00000000000..29679f1aeb4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/comet_crawler.txt @@ -0,0 +1,10 @@ +Name:Comet Crawler +ManaCost:2 B +Types:Creature Insect Horror +PT:2/3 +K:Lifelink +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature attacks, you may sacrifice another creature or artifact. If you do, this creature gets +2/+0 until end of turn. +SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Artifact.Other;Creature.Other/another creature or artifact> | Defined$ Self | NumAtt$ +2 +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Sacrifice +Oracle:Lifelink\nWhenever this creature attacks, you may sacrifice another creature or artifact. If you do, this creature gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/dark_endurance.txt b/forge-gui/res/cardsfolder/upcoming/dark_endurance.txt new file mode 100644 index 00000000000..ef6f02110ec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dark_endurance.txt @@ -0,0 +1,6 @@ +Name:Dark Endurance +ManaCost:1 B +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | ValidTarget$ Creature.blocking | EffectZone$ All | Description$ This spell costs {1} less to cast if it targets a blocking creature. +A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ Indestructible | SpellDescription$ Target creature gets +2/+0 and gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) +Oracle:This spell costs {1} less to cast if it targets a blocking creature.\nTarget creature gets +2/+0 and gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/depressurize.txt b/forge-gui/res/cardsfolder/upcoming/depressurize.txt new file mode 100644 index 00000000000..c6e3359cf4e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/depressurize.txt @@ -0,0 +1,6 @@ +Name:Depressurize +ManaCost:1 B +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | SubAbility$ DBDestroy | SpellDescription$ Target creature gets -3/-0 until end of turn. Then if that creature's power is 0 or less, destroy it. +SVar:DBDestroy:DB$ Destroy | Defined$ Targeted.powerLE0 +Oracle:Target creature gets -3/-0 until end of turn. Then if that creature's power is 0 or less, destroy it. diff --git a/forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt b/forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt new file mode 100644 index 00000000000..1c3d9377dcc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt @@ -0,0 +1,7 @@ +Name:Drill Too Deep +ManaCost:1 R +Types:Instant +A:SP$ Charm | Choices$ DBPutCounter,DBDestroy +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Spacecraft.YouCtrl,Planet.YouCtrl | TgtPrompt$ Select target Spacecraft or Planet you control | CounterType$ CHARGE | CounterNum$ 5 | SpellDescription$ Put five charge counters on target Spacecraft or Planet you control. +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. +Oracle:Choose one —\n• Put five charge counters on target Spacecraft or Planet you control.\n• Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt b/forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt new file mode 100644 index 00000000000..c313b1f74fc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt @@ -0,0 +1,9 @@ +Name:Frontline War-Rager +ManaCost:2 R +Types:Creature Kavu Soldier +PT:4/5 +K:Lifelink +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, put a +1/+1 counter on this creature. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:At the beginning of your end step, if you control two or more tapped creatures, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt b/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt index 4420024c1a9..13ed85e5e89 100644 --- a/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt +++ b/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt @@ -4,5 +4,4 @@ Types:Artifact Spacecraft PT:6/5 K:Station:3 S:Mode$ Continuous | Affected$ Card.Self+counters_GE3_CHARGE | AddType$ Creature | AddKeyword$ Flying & Haste | Description$ STATION 3+ Flying, haste -SVar:X:Count$Valid Artifact.YouCtrl Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 3+.)\nSTATION 3+\nFlying, haste diff --git a/forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt b/forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt new file mode 100644 index 00000000000..a3591ac1c5c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt @@ -0,0 +1,8 @@ +Name:Gravblade Heavy +ManaCost:3 B +Types:Creature Human Soldier +PT:3/4 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddKeyword$ Deathtouch | IsPresent$ Artifact.YouCtrl | Description$ As long as you control an artifact, this creature gets +1/+0 and has deathtouch. +SVar:BuffedBy:Artifact +DeckHints:Type$Artifact +Oracle:As long as you control an artifact, this creature gets +1/+0 and has deathtouch. diff --git a/forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt b/forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt new file mode 100644 index 00000000000..12d5477f5c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt @@ -0,0 +1,9 @@ +Name:Gravpack Monoist +ManaCost:2 B +Types:Creature Human Scout +PT:2/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ When this creature dies, create a tapped 2/2 colorless Robot artifact creature token. +SVar:TrigToken:DB$ Token | TokenScript$ c_2_2_a_robot | TokenTapped$ True +DeckHas:Ability$Token +Oracle:Flying\nWhen this creature dies, create a tapped 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt b/forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt new file mode 100644 index 00000000000..3b73c60a3f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt @@ -0,0 +1,10 @@ +Name:Kavaron Skywarden +ManaCost:4 R +Types:Creature Kavu Soldier +PT:4/5 +K:Reach +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | Execute$ TrigPutCounter | TriggerDescription$ Void — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, put a +1/+1 counter on this creature. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:X:Count$Void.1.0 +DeckHas:Ability$Counters +Oracle:Reach\nVoid — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt b/forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt new file mode 100644 index 00000000000..97594fcd0c6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt @@ -0,0 +1,6 @@ +Name:Kavaron Turbodrone +ManaCost:2 R +Types:Artifact Creature Robot Scout +PT:2/3 +A:AB$ Pump | Cost$ T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +1 | NumDef$ +1 | KW$ Haste | SorcerySpeed$ True | TgtPrompt$ Select target creature you control | SpellDescription$ Target creature you control gets +1/+1 and gains haste until end of turn. Activate only as a sorcery. +Oracle:{T}: Target creature you control gets +1/+1 and gains haste until end of turn. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt b/forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt new file mode 100644 index 00000000000..7803e6ffef4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt @@ -0,0 +1,8 @@ +Name:Mechan Shieldmate +ManaCost:1 U +Types:Artifact Creature Robot Soldier +PT:3/2 +K:Defender +S:Mode$ CanAttackDefender | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as an artifact entered the battlefield under your control this turn, this creature can attack as though it didn't have defender. +SVar:X:Count$ThisTurnEntered_Battlefield_Artifact.YouCtrl +Oracle:Defender\nAs long as an artifact entered the battlefield under your control this turn, this creature can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/upcoming/mental_modulation.txt b/forge-gui/res/cardsfolder/upcoming/mental_modulation.txt new file mode 100644 index 00000000000..bb8e5f3aeed --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mental_modulation.txt @@ -0,0 +1,7 @@ +Name:Mental Modulation +ManaCost:1 U +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | PlayerTurn$ You | EffectZone$ All | Description$ This spell costs {1} less to cast during your turn. +A:SP$ Tap | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SubAbility$ DBDraw | SpellDescription$ Tap target artifact or creature. Draw a card. +SVar:DBDraw:DB$ Draw +Oracle:This spell costs {1} less to cast during your turn.\nTap target artifact or creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt b/forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt new file mode 100644 index 00000000000..762f7ffc592 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt @@ -0,0 +1,6 @@ +Name:Monoist Sentry +ManaCost:B +Types:Artifact Creature Robot +PT:4/1 +K:Defender +Oracle:Defender diff --git a/forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt new file mode 100644 index 00000000000..04c9cced66e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt @@ -0,0 +1,7 @@ +Name:Nanoform Sentinel +ManaCost:2 U +Types:Artifact Creature Robot +PT:3/2 +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigUntap | ActivationLimit$ 1 | TriggerDescription$ Whenever this creature becomes tapped, untap another target permanent. This ability triggers only once each turn. +SVar:TrigUntap:DB$ Untap | ValidTgts$ Permanent.Other | TgtPrompt$ Choose another target permanent +Oracle:Whenever this creature becomes tapped, untap another target permanent. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt b/forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt new file mode 100644 index 00000000000..1dbec857dec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt @@ -0,0 +1,13 @@ +Name:Perigee Beckoner +ManaCost:4 B +Types:Creature Horror +PT:4/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When this creature enters, until end of turn, another target creature you control gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control." +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | NumAtt$ +2 | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Triggers$ PerigeeBeckonerChangeZone | Defined$ ParentTarget +SVar:PerigeeBeckonerChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ PerigeeBeckonerTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. +SVar:PerigeeBeckonerTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy +K:Warp:1 B +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +Oracle:When this creature enters, until end of turn, another target creature you control gets +2/+0 and gains "When this creature dies, return it to the battlefield tapped under its owner's control."\nWarp {1}{B} (You may cast this card from your hand for its warp cost. Exile this creature at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt b/forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt new file mode 100644 index 00000000000..a66f7c0548b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt @@ -0,0 +1,7 @@ +Name:Scour for Scrap +ManaCost:3 U +Types:Instant +A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBSearch,DBReturn +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card, reveal it, put it into your hand, then shuffle. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.YouOwn | TgtPrompt$ Select target artifact card in your graveyard | SpellDescription$ Return target artifact card from your graveyard to your hand. +Oracle:Choose one or both —\n• Search your library for an artifact card, reveal it, put it into your hand, then shuffle.\n• Return target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt b/forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt new file mode 100644 index 00000000000..cc91f03ecd6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt @@ -0,0 +1,6 @@ +Name:Scrounge for Eternity +ManaCost:2 B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 2 B Sac<1/Artifact;Creature/artifact or creature> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcLE5,Spacecraft.YouOwn+cmcLE5 | TgtPrompt$ Choose target creature or Spacecraft card with mana value 5 or less in your graveyard | SubAbility$ DBToken | SpellDescription$ Return target creature or Spacecraft card with mana value 5 or less from your graveyard to the battlefield. Then create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You +Oracle:As an additional cost to cast this spell, sacrifice an artifact or creature.\nReturn target creature or Spacecraft card with mana value 5 or less from your graveyard to the battlefield. Then create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt b/forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt new file mode 100644 index 00000000000..d7747cecc25 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt @@ -0,0 +1,11 @@ +Name:Selfcraft Mechan +ManaCost:3 U +Types:Artifact Creature Robot Artificer +PT:3/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When this creature enters, you may sacrifice an artifact. When you do, put a +1/+1 counter on target creature and draw a card. +SVar:TrigSac:AB$ ImmediateTrigger | Cost$ Sac<1/Artifact/artifact> | Execute$ TrigPutCounter | TriggerDescription$ When you do, put a +1/+1 counter on target creature and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | CounterNum$ 1 | CounterType$ P1P1 | ValidTgts$ Creature | SubAbility$ DBDraw | TgtPrompt$ Select target creature +SVar:DBDraw:DB$ Draw +DeckHas:Ability$Counters|Sacrifice +DeckHints:Type$Artifact +Oracle:When this creature enters, you may sacrifice an artifact. When you do, put a +1/+1 counter on target creature and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt b/forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt new file mode 100644 index 00000000000..78a84547d16 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt @@ -0,0 +1,8 @@ +Name:Sinister Cryologist +ManaCost:2 U +Types:Creature Jellyfish Wizard +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When this creature enters, target creature an opponent controls gets -3/-0 until end of turn. +SVar:TrigPump:DB$ Pump | NumAtt$ -3 | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls +K:Warp:U +Oracle:When this creature enters, target creature an opponent controls gets -3/-0 until end of turn.\nWarp {U} (You may cast this card from your hand for its warp cost. Exile this enchantment at the beginning of the next end step, then you may cast it from exile on a later turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt b/forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt new file mode 100644 index 00000000000..2120ce3dadf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt @@ -0,0 +1,10 @@ +Name:Susurian Dirgecraft +ManaCost:4 B +Types:Artifact Spacecraft +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When this Spacecraft enters, each opponent sacrifices a nontoken creature. +SVar:TrigSac:DB$ Sacrifice | Defined$ Opponent | SacValid$ Creature.!token +K:Station:7 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE7_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 7+ Flying +DeckHas:Ability$Sacrifice +Oracle:When this Spacecraft enters, each opponent sacrifices a nontoken creature.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 7+.)\nSTATION 7+\nFlying diff --git a/forge-gui/res/cardsfolder/upcoming/swarm_culler.txt b/forge-gui/res/cardsfolder/upcoming/swarm_culler.txt new file mode 100644 index 00000000000..631374f0f3d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/swarm_culler.txt @@ -0,0 +1,9 @@ +Name:Swarm Culler +ManaCost:3 B +Types:Creature Insect Warrior +PT:2/4 +K:Flying +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever this creature becomes tapped, you may sacrifice another creature or artifact. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/Creature.Other;Artifact.Other/another creature or artifact> +DeckHas:Ability$Sacrifice +Oracle:Flying\nWhenever this creature becomes tapped, you may sacrifice another creature or artifact. If you do, draw a card. From 3cdbb8f1dd9228eea8c1c0a0201f76815ed4ece2 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Sat, 19 Jul 2025 09:57:24 +0200 Subject: [PATCH 038/183] Final EOE batch (part 3) (#8106) --- .../res/cardsfolder/upcoming/biosynthic_burst.txt | 8 ++++++++ .../res/cardsfolder/upcoming/blooming_stinger.txt | 8 ++++++++ .../res/cardsfolder/upcoming/molecular_modifier.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt | 8 ++++++++ .../res/cardsfolder/upcoming/orbital_plunge.txt | 7 +++++++ .../res/cardsfolder/upcoming/oreplate_pangolin.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/rig_for_war.txt | 5 +++++ .../res/cardsfolder/upcoming/slagdrill_scrapper.txt | 6 ++++++ .../res/cardsfolder/upcoming/territorial_bruntar.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/vaultguard_trooper.txt | 7 +++++++ .../res/cardsfolder/upcoming/zookeeper_mechan.txt | 7 +++++++ 11 files changed, 85 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rig_for_war.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt b/forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt new file mode 100644 index 00000000000..85c49cad514 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt @@ -0,0 +1,8 @@ +Name:Biosynthic Burst +ManaCost:1 G +Types:Instant +A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature you control. It gains reach, trample, and indestructible until end of turn. Untap it. (Damage and effects that say "destroy" don't destroy it.) +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Reach & Trample & Indestructible | SubAbility$ DBUntap +SVar:DBUntap:DB$ Untap | Defined$ Targeted +DeckHas:Ability$Counters & Keyword$Reach|Trample|Hexproof|Indestructible +Oracle:Put a +1/+1 counter on target creature you control. It gains reach, trample, and indestructible until end of turn. Untap it. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt b/forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt new file mode 100644 index 00000000000..a7e8b8d18f2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt @@ -0,0 +1,8 @@ +Name:Blooming Stinger +ManaCost:1 G +Types:Creature Plant Scorpion +PT:2/2 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When this creature enters, another target creature you control gains deathtouch until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | KW$ Deathtouch +Oracle:Deathtouch\nWhen this creature enters, another target creature you control gains deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt b/forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt new file mode 100644 index 00000000000..4240b701324 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt @@ -0,0 +1,8 @@ +Name:Molecular Modifier +ManaCost:2 R +Types:Creature Kavu Artificer +PT:2/2 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, target creature you control gets +1/+0 and gains first strike until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +1 | KW$ First Strike +SVar:PlayMain1:TRUE +Oracle:At the beginning of combat on your turn, target creature you control gets +1/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt b/forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt new file mode 100644 index 00000000000..058139e1b2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt @@ -0,0 +1,8 @@ +Name:Nebula Dragon +ManaCost:6 R +Types:Creature Dragon +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When this creature enters, it deals 3 damage to any target. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 3 +Oracle:Flying\nWhen this creature enters, it deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt b/forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt new file mode 100644 index 00000000000..73fa12b2c39 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt @@ -0,0 +1,7 @@ +Name:Orbital Plunge +ManaCost:3 R +Types:Sorcery +A:SP$ DealDamage | ValidTgts$ Creature | NumDmg$ 5 | ExcessSVar$ Excess | SubAbility$ DBToken | SpellDescription$ CARDNAME deals 6 damage to target creature. If excess damage was dealt this way, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:DBToken:DB$ Token | TokenScript$ c_a_lander_sac_search | TokenAmount$ 1 | ConditionCheckSVar$ Excess +DeckHas:Ability$Token +Oracle:Orbital Plunge deals 6 damage to target creature. If excess damage was dealt this way, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") diff --git a/forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt b/forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt new file mode 100644 index 00000000000..67b611bc3a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt @@ -0,0 +1,9 @@ +Name:Oreplate Pangolin +ManaCost:1 R +Types:Artifact Creature Robot Pangolin +PT:2/2 +T:Mode$ ChangesZone | ValidCard$ Artifact.YouCtrl+Other | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another artifact you control enters, you may pay {1}. If you do, put a +1/+1 counter on this creature. +SVar:TrigPutCounter:AB$ PutCounter | Cost$ 1 | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Artifact +DeckHints:Type$Artifact +Oracle:Whenever another artifact you control enters, you may pay {1}. If you do, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/rig_for_war.txt b/forge-gui/res/cardsfolder/upcoming/rig_for_war.txt new file mode 100644 index 00000000000..f4072036d44 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rig_for_war.txt @@ -0,0 +1,5 @@ +Name:Rig for War +ManaCost:1 R +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ +3 | KW$ First Strike & Reach | SpellDescription$ Target creature gets +3/+0 and gains first strike and reach until end of turn. +Oracle:Target creature gets +3/+0 and gains first strike and reach until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt b/forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt new file mode 100644 index 00000000000..bd4363fe30b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt @@ -0,0 +1,6 @@ +Name:Slagdrill Scrapper +ManaCost:R +Types:Artifact Creature Robot Scout +PT:1/2 +A:AB$ Draw | Cost$ 2 T Sac<1/Artifact.Other;Land.Other/another artifact or land> | SpellDescription$ Draw a card. +Oracle:{2}, {T}, Sacrifice another artifact or land: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt b/forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt new file mode 100644 index 00000000000..1563bf20510 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt @@ -0,0 +1,12 @@ +Name:Territorial Bruntar +ManaCost:4 R R +Types:Creature Beast +PT:6/6 +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land you control enters, exile cards from the top of your library until you exile a nonland card. You may cast that card this turn. +SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.nonLand | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile +SVar:Play:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:BuffedBy:Land +Oracle:Reach\nLandfall — Whenever a land you control enters, exile cards from the top of your library until you exile a nonland card. You may cast that card this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt b/forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt new file mode 100644 index 00000000000..7730abb6b91 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt @@ -0,0 +1,7 @@ +Name:Vaultguard Trooper +ManaCost:4 R +Types:Creature Kavu Soldier +PT:5/5 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, you may discard your hand. If you do, draw two cards. +SVar:TrigDraw:AB$ Draw | Cost$ Discard<0/Hand> | NumCards$ 2 +Oracle:At the beginning of your end step, if you control two or more tapped creatures, you may discard your hand. If you do, draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt b/forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt new file mode 100644 index 00000000000..5b5221a73ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt @@ -0,0 +1,7 @@ +Name:Zookeeper Mechan +ManaCost:1 R +Types:Artifact Creature Robot +PT:1/3 +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Pump | Cost$ 6 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +4 | SorcerySpeed$ True | SpellDescription$ Target creature you control gets +4/+0 until end of turn. Activate only as a sorcery. +Oracle:{T}: Add {R}.\n{6}{R}: Target creature you control gets +4/+0 until end of turn. Activate only as a sorcery. From 08135545da6b57406cc56d951352886f03f9e0da Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Sat, 19 Jul 2025 09:57:37 +0200 Subject: [PATCH 039/183] Final EOE batch (part 4) (#8112) --- .../res/cardsfolder/upcoming/diplomatic_relations.txt | 7 +++++++ .../cardsfolder/upcoming/eumidian_terrabotanist.txt | 8 ++++++++ .../res/cardsfolder/upcoming/gene_pollinator.txt | 6 ++++++ .../res/cardsfolder/upcoming/icecave_crasher.txt | 9 +++++++++ .../res/cardsfolder/upcoming/intrepid_tenderfoot.txt | 6 ++++++ .../res/cardsfolder/upcoming/meltstriders_gear.txt | 8 ++++++++ .../res/cardsfolder/upcoming/seedship_agrarian.txt | 11 +++++++++++ forge-gui/res/cardsfolder/upcoming/skystinger.txt | 8 ++++++++ .../res/cardsfolder/upcoming/thaumaton_torpedo.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/thawbringer.txt | 9 +++++++++ 10 files changed, 79 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skystinger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thawbringer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt b/forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt new file mode 100644 index 00000000000..d358780b37d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt @@ -0,0 +1,7 @@ +Name:Diplomatic Relations +ManaCost:2 G +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Vigilance | SubAbility$ DBDealDamage | AILogic$ Fight | SpellDescription$ Target creature gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature an opponent controls | NumDmg$ X | DamageSource$ ParentTarget +SVar:X:ParentTargeted$CardPower +Oracle:Target creature gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt b/forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt new file mode 100644 index 00000000000..5c2fa0d24e3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt @@ -0,0 +1,8 @@ +Name:Eumidian Terrabotanist +ManaCost:1 G +Types:Creature Insect Druid +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigGainLife | TriggerDescription$ Landfall — Whenever a land you control enters, you gain 1 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$LifeGain +Oracle:Landfall — Whenever a land you control enters, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt b/forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt new file mode 100644 index 00000000000..6e7924bdc28 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt @@ -0,0 +1,6 @@ +Name:Gene Pollinator +ManaCost:G +Types:Artifact Creature Robot Insect +PT:1/2 +A:AB$ Mana | Cost$ T tapXType<1/Permanent> | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:{T}, Tap an untapped permanent you control: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt b/forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt new file mode 100644 index 00000000000..3ea8510e24a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt @@ -0,0 +1,9 @@ +Name:Icecave Crasher +ManaCost:3 G +Types:Creature Beast +PT:4/4 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land you control enters, this creature gets +1/+0 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 +SVar:BuffedBy:Land +Oracle:Trample\nLandfall — Whenever a land you control enters, this creature gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt b/forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt new file mode 100644 index 00000000000..8a3b0ab820f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt @@ -0,0 +1,6 @@ +Name:Intrepid Tenderfoot +ManaCost:1 G +Types:Creature Insect Citizen +PT:2/2 +A:AB$ PutCounter | Cost$ 3 | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on this creature. Activate only as a sorcery. +Oracle:{3}: Put a +1/+1 counter on this creature. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt b/forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt new file mode 100644 index 00000000000..a2c95e10bd2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt @@ -0,0 +1,8 @@ +Name:Meltstrider's Gear +ManaCost:G +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When this Equipment enters, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | AddKeyword$ Reach | Description$ Equipped creature gets +2/+1 and has reach. +K:Equip:5 +Oracle:When this Equipment enters, attach it to target creature you control.\nEquipped creature gets +2/+1 and has reach.\nEquip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt b/forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt new file mode 100644 index 00000000000..76a491d0237 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt @@ -0,0 +1,11 @@ +Name:Seedship Agrarian +ManaCost:3 G +Types:Creature Insect Scientist +PT:3/3 +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever this creature becomes tapped, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land you control enters, put a +1/+1 counter on this creature. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Land +DeckHas:Ability$Token +Oracle:Whenever this creature becomes tapped, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\nLandfall — Whenever a land you control enters, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/skystinger.txt b/forge-gui/res/cardsfolder/upcoming/skystinger.txt new file mode 100644 index 00000000000..3b6e6d8891c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skystinger.txt @@ -0,0 +1,8 @@ +Name:Skystinger +ManaCost:2 G +Types:Creature Insect Warrior +PT:3/3 +K:Reach +T:Mode$ AttackerBlocked | ValidCard$ Creature.withFlying | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature blocks a creature with flying, this creature gets +5/+0 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +5 +Oracle:Reach\nWhenever this creature blocks a creature with flying, this creature gets +5/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt b/forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt new file mode 100644 index 00000000000..6def0024fb8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt @@ -0,0 +1,7 @@ +Name:Thaumaton Torpedo +ManaCost:1 +Types:Artifact +A:AB$ Destroy | Cost$ 6 T Sac<1/CARDNAME> | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | ReduceCost$ X | SpellDescription$ Destroy target nonland permanent. This ability costs {3} less to activate if you attacked with a Spacecraft this turn. +SVar:X:Count$Compare Y GE1.3.0 +SVar:Y:Count$CreaturesAttackedThisTurn Spacecraft.YouCtrl +Oracle:{6}, {T}, Sacrifice this artifact: Destroy target nonland permanent. This ability costs {3} less to activate if you attacked with a Spacecraft this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/thawbringer.txt b/forge-gui/res/cardsfolder/upcoming/thawbringer.txt new file mode 100644 index 00000000000..70ef1591500 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thawbringer.txt @@ -0,0 +1,9 @@ +Name:Thawbringer +ManaCost:2 G +Types:Creature Insect Scout +PT:4/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When this creature enters or dies, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSurveil | Secondary$ True | TriggerDescription$ When this creature enters or dies, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) +SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 1 +DeckHas:Ability$Surveil|Graveyard +Oracle:When this creature enters or dies, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) From 8ce5272e95b43b60253aad069f117543677c3e1a Mon Sep 17 00:00:00 2001 From: Eradev Date: Sat, 19 Jul 2025 04:33:43 -0400 Subject: [PATCH 040/183] More console commands (#8096) --- .../stage/ConsoleCommandInterpreter.java | 62 +++++++++++++++++-- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index 2e3e8290a25..ceccdffda23 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -11,11 +11,13 @@ import forge.adventure.data.EnemyData; import forge.adventure.data.PointOfInterestData; import forge.adventure.data.WorldData; import forge.adventure.pointofintrest.PointOfInterest; +import forge.adventure.util.AdventureEventController; import forge.adventure.util.Current; import forge.adventure.util.Paths; import forge.adventure.world.WorldSave; import forge.card.CardEdition; import forge.card.ColorSet; +import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckProxy; import forge.game.GameType; @@ -260,7 +262,53 @@ public class ConsoleCommandInterpreter { catch(NumberFormatException ignored) {} } Current.player().addCard(card); - return "Added card: "+ card.getName(); + return "Added card: " + card.getName(); + }); + registerCommand(new String[]{"give", "set"}, s -> { + if (s.length < 1) return "Command needs 1 parameter: Edition code."; + CardEdition edition = StaticData.instance().getCardEdition(s[0]); + if (edition == null) return "Cannot find edition: " + s[0]; + + for(CardEdition.EditionEntry entry : edition.getObtainableCards()) { + PaperCard card = StaticData.instance().fetchCard(entry.name(), edition.getCode(), entry.collectorNumber()); + + if (card != null) { + Current.player().addCard(card.getNoSellVersion(), 4); + } else { + System.out.println("Card " + entry.name() + " (" + entry.collectorNumber() + ") does not exist."); + } + } + + return "Added all cards from: " + edition.getCode(); + }); + registerCommand(new String[]{"give", "boosters"}, s -> { + if (s.length < 1) + return "Command needs at least 1 parameter: Edition code."; + CardEdition edition = StaticData.instance().getCardEdition(s[0]); + if (edition == null) + return "Cannot find edition: " + s[0]; + if (!edition.hasBoosterTemplate()) + return edition.getCode() + " doesn't have a booster template."; + + int amount = 1; + if (s.length >= 2) { + try { + amount = Integer.parseInt(s[1]); + } catch (NumberFormatException ignored) {} + } + + for(int i=0; i { + CardPool cards = Current.player().getCards(); + for(PaperCard c : cards.getFilteredPool(c -> c.getMarkedFlags().noSellValue).toFlatList()) { + cards.remove(c); + } + return "Removed all no sell flagged cards."; }); registerCommand(new String[]{"give", "item"}, s -> { if (s.length < 1) return "Command needs 1 parameter: Item name."; @@ -386,12 +434,16 @@ public class ConsoleCommandInterpreter { return "Debug OFF"; }); registerCommand(new String[]{"remove", "enemy", "all"}, s -> { - //TODO: Remove all overworld enemies if not inside a map. if (!MapStage.getInstance().isInMap()) { - return "Only supported for PoI"; + WorldStage ws = WorldStage.getInstance(); + int enemiesCount = ws.enemies.size(); + for(int i = 0; i < enemiesCount; i++) { + ws.removeNearestEnemy(); + } + } else { + MapStage.getInstance().removeAllEnemies(); } - MapStage.getInstance().removeAllEnemies(); - return "removed all enemies"; + return "Removed all enemies"; }); registerCommand(new String[]{"hide"}, s -> { From 0fb37bf2d4700e4325d977b6ff8802a8206b3528 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 11:02:20 +0100 Subject: [PATCH 041/183] DRAFT: Edition updates --- forge-gui/res/editions/Edge of Eternities Commander.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Edge of Eternities Commander.txt b/forge-gui/res/editions/Edge of Eternities Commander.txt index 32f8d94e797..99063b0c8f5 100644 --- a/forge-gui/res/editions/Edge of Eternities Commander.txt +++ b/forge-gui/res/editions/Edge of Eternities Commander.txt @@ -199,6 +199,7 @@ ScryfallCode=EOC 191 C Wastes @Raymond Swanland [tokens] +2 c_x_x_shapeshifter_changeling_deathtouch @Carlos Palma Cruchaga 3 u_2_2_bird_flying @Alessandra Pisano 4 g_1_1_insect_flying @Deruchenko Alexander 5 g_3_3_beast @Dave Allsop @@ -215,4 +216,4 @@ ScryfallCode=EOC 16 c_1_1_a_thopter_flying @Svetlin Velinov [other] -1 copy @Martin de Diego Sádaba \ No newline at end of file +1 copy @Martin de Diego Sádaba From b4922ce353f86c117f6a37f6d8e1833a2441629a Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 11:06:39 +0100 Subject: [PATCH 042/183] EOS --- .../Edge of Eternities Stellar Sights.txt | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt index 11aa4327a05..bbb393c1eaa 100644 --- a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt +++ b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt @@ -7,6 +7,7 @@ ScryfallCode=EOS [cards] 1 M Ancient Tomb @Bruce Brenneise +2 R Blast Zone @Chad Weatherford 3 R Blinkmoth Nexus @Calder Moore 4 R Bonders' Enclave @Eleonor Piteira 5 R Cascading Cataracts @Andrew Mar @@ -51,11 +52,13 @@ ScryfallCode=EOS 44 R Thespian's Stage @Bruce Brenneise 45 R Wandering Fumarole @Cristi Balanescu 46 M Ancient Tomb @Meel Tamphanon +47 R Blast Zone @William Phifer 48 R Blinkmoth Nexus @Meel Tamphanon 49 R Bonders' Enclave @BEMOCS 50 R Cascading Cataracts @Sam Chivers 51 R Cathedral of War @William Phifer 52 R Celestial Colonnade @Ann-Sophie De Steur +53 R Contested War Zone @Aeron Ng 54 R Creeping Tar Pit @Matteo Bassini 55 R Crystal Quarry @Jack Hughes 56 M Deserted Temple @BEMOCS @@ -85,7 +88,7 @@ ScryfallCode=EOS 80 R Raging Ravine @BEMOCS 81 M Reflecting Pool @Sam Chivers 82 R Scavenger Grounds @BEMOCS -83 R Shambling Vent @ +83 R Shambling Vent @Denis Freitas 84 R Stirring Wildwood @Hurca! 85 M Strip Mine @Matteo Bassini 86 R Sunken Citadel @Lazare Gvimradze @@ -94,21 +97,26 @@ ScryfallCode=EOS 89 R Thespian's Stage @William Phifer 90 R Wandering Fumarole @Sam Chivers 91 M Ancient Tomb @Bruce Brenneise +92 R Blast Zone @Chad Weatherford 93 R Blinkmoth Nexus @Calder Moore 94 R Bonders' Enclave @Eleonor Piteira +95 R Cascading Cataracts @Andrew Mar 96 R Cathedral of War @Jason A. Engle 97 R Celestial Colonnade @Andrew Mar +98 R Contested War Zone @Josu Solano 99 R Creeping Tar Pit @Calder Moore 100 R Crystal Quarry @Craig Elliott 101 M Deserted Temple @Jason A. Engle 102 M Dust Bowl @Jonas De Ro 103 R Echoing Deeps @Alayna Danner 104 R Eldrazi Temple @Calder Moore +105 R Endless Sands @Tim Brumley 106 M Gemstone Caverns @Mark Poole 107 M Grove of the Burnwillows @Aenami 108 R High Market @Andrew Theophilopoulos 109 R Hissing Quagmire @John Thacker 110 M Inkmoth Nexus @Piotr Dura +111 M Inventors' Fair @Finnian MacManus 112 R Lavaclaw Reaches @Jinho Bae 113 M Lotus Field @Andrew Mar 114 R Lumbering Falls @Daniel Romanovsky @@ -119,9 +127,12 @@ ScryfallCode=EOS 119 R Mystifying Maze @Pierre Loyvet 120 R Needle Spires @Lorenzo Lanfranconi 121 R Nesting Grounds @John Thacker +122 M Petrified Field @Finnian MacManus 123 M Plaza of Heroes @John Thacker +124 R Power Depot @Daniel Romanovsky 125 R Raging Ravine @Calder Moore 126 M Reflecting Pool @Craig Elliott +127 R Scavenger Grounds @Andrew Theophilopoulos 128 R Shambling Vent @Mark Poole 129 R Stirring Wildwood @Erikas Perl 130 M Strip Mine @Daniel Romanovsky @@ -131,21 +142,26 @@ ScryfallCode=EOS 134 R Thespian's Stage @Bruce Brenneise 135 R Wandering Fumarole @Cristi Balanescu 136 M Ancient Tomb @Meel Tamphanon +137 R Blast Zone @William Phifer 138 R Blinkmoth Nexus @Meel Tamphanon 139 R Bonders' Enclave @BEMOCS +140 R Cascading Cataracts @Sam Chivers 141 R Cathedral of War @William Phifer 142 R Celestial Colonnade @Ann-Sophie De Steur +143 R Contested War Zone @Aeron Ng 144 R Creeping Tar Pit @Matteo Bassini 145 R Crystal Quarry @Jack Hughes 146 M Deserted Temple @BEMOCS 147 M Dust Bowl @Aeron Ng 148 R Echoing Deeps @Sam Chivers 149 R Eldrazi Temple @BEMOCS +150 R Endless Sands @WFlemming Illustration 151 M Gemstone Caverns @BEMOCS 152 M Grove of the Burnwillows @Sam Chivers 153 R High Market @WFlemming Illustration 154 R Hissing Quagmire @William Phifer 155 M Inkmoth Nexus @Matteo Bassini +156 M Inventors' Fair @Sylvia Liu 157 R Lavaclaw Reaches @Matteo Bassini 158 M Lotus Field @Jack Hughes 159 R Lumbering Falls @Aeron Ng @@ -156,14 +172,17 @@ ScryfallCode=EOS 164 R Mystifying Maze @Lee Art 165 R Needle Spires @BEMOCS 166 R Nesting Grounds @WFlemming Illustration +167 M Petrified Field @WFlemming Illustration 168 M Plaza of Heroes @Elaine Lee +169 R Power Depot @Lazare Gvimradze 170 R Raging Ravine @BEMOCS 171 M Reflecting Pool @Sam Chivers -173 M Strip Mine @Matteo Bassini -174 R Stirring Wildwood @ +172 R Scavenger Grounds @BEMOCS +173 R Shambling Vent @Denis Freitas +174 R Stirring Wildwood @Hurca! 175 M Strip Mine @Matteo Bassini 176 R Sunken Citadel @Lazare Gvimradze 177 R Swarmyard @Matteo Bassini -178 R Terrain Generator @ +178 R Terrain Generator @BEMOCS 179 R Thespian's Stage @William Phifer 180 R Wandering Fumarole @Sam Chivers From 6115eaf6dadecdfcf172f8c6fe0dc2d142ab52fb Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 11:11:42 +0100 Subject: [PATCH 043/183] EOE --- forge-gui/res/editions/Edge of Eternities.txt | 85 ++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index 589ca097d93..ab348e25437 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -10,17 +10,25 @@ ScryfallCode=EOE 2 M Tezzeret, Cruel Captain @Chris Rahn 3 U All-Fates Stalker @Lius Lasahido 4 R Astelli Reclaimer @Carly Milligan +5 C Auxiliary Boosters @Dmitry Burmak 6 C Banishing Light @Rovina Cai 7 R Beyond the Quiet @Yohann Schepacz +8 C Brightspear Zealot @Bryan Sola 9 M Cosmogrand Zenith @Anna Steinbauer +10 U Dawnstrike Vanguard @Arif Wijaya +11 C Dockworker Drone @Marco Gorlei +12 U Dual-Sun Adepts @Ioannis Fiore 13 U Dual-Sun Technique @Ioannis Fiore 14 U Emergency Eject @Leon Tukker 15 M Exalted Sunborn @Scott M. Fischer +16 C Exosuit Savior @Benjamin Ee +17 C Flight-Deck Coordinator @Diego Gisbert 18 C Focus Fire @Borja Pindado 19 R Haliya, Guided by Light @Kieran Yanner 20 R Hardlight Containment @Dominik Mayer 21 U Honor @Eli Minaya 22 U Honored Knight-Captain @Forrest Imel +23 C Knight Luminary @Aaron Miller 24 R Lightstall Inquisitor @Arif Wijaya 25 R Lumen-Class Frigate @Zezhou Chen 26 C Luxknight Breacher @Cristi Balanescu @@ -31,30 +39,48 @@ ScryfallCode=EOE 31 U Reroute Systems @Sergey Glushakov 32 U Rescue Skiff @Viko Menezes 33 U Scout for Survivors @Greg Staples +34 U Seam Rip @Sam Guay 35 R The Seriema @Sergey Glushakov +36 C Squire's Lightblade @Edgar Sánchez Hidalgo 37 U Starfield Shepherd @Marta Nael 38 C Starfighter Pilot @Nathaniel Himawan 39 C Starport Security @Lie Setiawan 40 R Sunstar Chaplain @Valera Lutfullina 41 U Sunstar Expansionist @Mark Poole +42 U Sunstar Lightsmith @Jarel Threat 43 U Wedgelight Rammer @Nadia Hurianova +44 C Weftblade Enhancer @Nathaniel Himawan +45 C Zealous Display @Chris Rallis 46 U Annul @Carlos Palma Cruchaga 47 U Atomic Microsizer @Gabor Szikszai 48 U Cerebral Download @Antonio José Manzanedo +49 C Cloudsculpt Technician @Elizabeth Peiró 50 U Codecracker Hound @Julia Metzger 51 R Consult the Star Charts @Antonio José Manzanedo 52 C Cryogen Relic @Eelis Kyttanen +53 C Cryoshatter @Jeremy Wilson 54 U Desculpting Blast @Jeremy Wilson +55 C Divert Disaster @David Álvarez 56 R Emissary Escort @Igor Grechanyi 57 U Gigastorm Titan @Bryan Sola 58 C Illvoi Galeblade @Nathaniel Himawan +59 U Illvoi Infiltrator @Paolo Parente +60 C Illvoi Light Jammer @David Álvarez +61 C Illvoi Operative @Quintin Gleim +62 C Lost in Space @Allen Panakal 63 U Mechan Assembler @Mirko Failoni 64 U Mechan Navigator @Konstantin Porubov +65 C Mechan Shieldmate @Daniel Ljunggren 66 C Mechanozoa @Daarken +67 C Mental Modulation @Andreia Ugrai 68 R Mm'menon, the Right Hand @Joshua Raphael 69 R Moonlit Meditation @Liiga Smilshkalne 70 U Mouth of the Storm @Domenico Cava +71 C Nanoform Sentinel @Tianxing Xu 72 M Quantum Riddler @Izzy +73 U Scour for Scrap @Filip Burburan +74 C Selfcraft Mechan @Milivoj Ćeran +75 C Sinister Cryologist @Domenico Cava 76 U Specimen Freighter @Sergey Glushakov 77 C Starbreach Whale @Sam Burley 78 R Starfield Vocalist @Nathaniel Himawan @@ -68,88 +94,129 @@ ScryfallCode=EOE 86 M Weftwalking @Rovina Cai 87 M Alpharael, Stonechosen @Kieran Yanner 88 R Archenemy's Charm @Brigitte Roka & Clifton Stommel +89 C Beamsaw Prospector @Aurore Folny 90 U Blade of the Swarm @Nino Is 91 R Chorale of the Void @Alix Branwyn +92 C Comet Crawler @Cristi Balanescu +93 C Dark Endurance @Leon Tukker 94 C Decode Transmissions @Josh Hass +95 C Depressurize @Danny Schwartz 96 U Dubious Delicacy @Tianxing Xu 97 R Elegy Acolyte @Diana Franco 98 C Embrace Oblivion @Andreas Zafiratos 99 R Entropic Battlecruiser @Josiah "Jo" Cameron 100 U Faller's Faithful @Lie Setiawan 101 U Fell Gravship @David Álvarez +102 C Gravblade Heavy @Andrew Mar 103 C Gravkill @Dominik Mayer +104 C Gravpack Monoist @Edgar Sánchez Hidalgo 105 C Hullcarver @Michal Ivan 106 U Hylderblade @Viko Menezes 107 U Hymn of the Faller @Danny Schwartz 108 C Insatiable Skittermaw @Diego Gisbert 109 U Lightless Evangel @Viko Menezes 110 U Monoist Circuit-Feeder @Quintin Gleim +111 U Monoist Sentry @Nino Is +112 C Perigee Beckoner @Dmitry Burmak 113 R Requiem Monolith @Warren Mahy +114 U Scrounge for Eternity @Konstantin Porubov 115 M Sothera, the Supervoid @Dominik Mayer 116 R Sunset Saboteur @Mirko Failoni +117 U Susurian Dirgecraft @Mark Poole +118 U Susurian Voidborn @Jehan Choo +119 C Swarm Culler @April Prime 120 C Temporal Intervention @Chris Rallis 121 U Timeline Culler @Alfonso Santano 122 U Tragic Trajectory @Ovidio Cartagena 123 U Umbral Collar Zealot @Dmitry Burmak 124 C Virus Beetle @Leesha Hannigan 125 U Voidforged Titan @Diego Gisbert +126 U Vote Out @David Álvarez 127 R Xu-Ifit, Osteoharmonist @Michal Ivan +128 R Zero Point Ballad @David Astruga +129 C Bombard @Diego Gisbert 130 U Cut Propulsion @Andrea Piparo 131 U Debris Field Crusher @David Álvarez 132 M Devastating Onslaught @Chris Seaman +133 C Drill Too Deep @Bartek Fedyczak +134 C Frontline War-Rager @Jason Rainville 135 U Full Bore @Olivier Bernard 136 U Galvanizing Sawship @Constantin Marin 137 U Invasive Maneuvers @Leon Tukker 138 C Kav Landseeker @Karl Kopinski 139 U Kavaron Harrier @Hardy Fowler +140 C Kavaron Skywarden @Diana Franco +141 C Kavaron Turbodrone @Leesha Hannigan 142 U Lithobraking @Andrew Mar 143 C Melded Moxite @Alexandr Leskinen 144 U Memorial Team Leader @Andrew Mar -145 R "Forgotten Sock Closet" @Javier Charro +145 R Memorial Vault @Javier Charro +146 U Molecular Modifier @Konstantin Porubov +147 C Nebula Dragon @Greg Staples 148 R Nova Hellkite @Raymond Swanland +149 C Orbital Plunge @Inkognit +150 C Oreplate Pangolin @Dmitry Burmak 151 R Pain for All @Dmitry Burmak 152 C Plasma Bolt @Viko Menezes 153 R Possibility Technician @Antonio José Manzanedo 154 C Red Tiger Mechan @Simon Dominic 155 U Remnant Elemental @Nereida +156 C Rig for War @Diana Franco 157 U Roving Actuator @Sergey Glushakov 158 U Ruinous Rampage @David Astruga 159 R Rust Harvester @Jake Murray +160 C Slagdrill Scrapper @Edgar Sánchez Hidalgo 161 U Systems Override @Hardy Fowler 162 M Tannuk, Steadfast Second @Raymond Swanland +163 R Terminal Velocity @Xabi Gaztelua 164 U Terrapact Intimidator @Slawomir Maniak +165 U Territorial Bruntar @Julie Dillon +166 U Vaultguard Trooper @David Palumbo 167 R Warmaker Gunship @Julian Kok Joon Wen 168 R Weapons Manufacturing @Marco Gorlei 169 U Weftstalker Ardent @Valera Lutfullina +170 C Zookeeper Mechan @Justyna Dura 171 U Atmospheric Greenhouse @Sergey Glushakov 172 R Bioengineered Future @Constantin Marin +173 C Biosynthic Burst @Loïc Canavaggia +174 C Blooming Stinger @Alexandre Honoré 175 U Broodguard Elite @Paolo Parente 176 U Close Encounter @Inkognit +177 C Diplomatic Relations @Néstor Ossandón Leal 178 C Drix Fatemaker @Anna Pavleeva 179 U Edge Rover @Francisco Badilla +180 U Eumidian Terrabotanist @Loïc Canavaggia 181 U Eusocial Engineering @Francisco Badilla 182 M Famished Worldsire @Kev Walker 183 R Frenzied Baloth @Diana Franco 184 C Fungal Colossus @Sergey Glushakov 185 C Galactic Wayfarer @Quintin Gleim -188 U Glacier Godmaw @ +186 C Gene Pollinator @Milivoj Ćeran +187 C Germinating Wurm @Monztre +188 U Glacier Godmaw @Bruce Brenneise 189 U Harmonious Grovestrider @Ron Spencer 190 U Hemosymbic Mite @Amanda Lee +191 C Icecave Crasher @Julia Metzger 192 R Icetill Explorer @Warren Mahy +193 C Intrepid Tenderfoot @Xavier Ribeiro 194 U Larval Scoutlander @Javier Charro 195 U Lashwhip Predator @Brian Valeza 196 R Loading Zone @Matt Stewart 197 U Meltstrider Eulogist @Jason A. Engle +198 C Meltstrider's Gear @Camille Alquier 199 U Meltstrider's Resolve @Carlos Palma Cruchaga 200 R Mightform Harmonizer @Bartek Fedyczak 201 M Ouroboroid @Samuel Perin 202 U Pull Through the Weft @Andrew Mar 203 C Sami's Curiosity @Tuan Duong Chu +204 U Seedship Agrarian @Helge C. Balzer 205 U Seedship Impact @Constantin Marin 206 C Shattered Wings @Sergey Glushakov +207 C Skystinger @Carlos Palma Cruchaga 208 R Sledge-Class Seedship @Leon Tukker 209 U Tapestry Warden @Andreas Zafiratos 210 R Terrasymbiosis @Viko Menezes +211 C Thawbringer @Olivier Bernard 212 U Alpharael, Dreaming Acolyte @Cristi Balanescu 213 U Biomechan Engineer @Monztre 214 R Biotech Specialist @Alexandre Honoré @@ -184,6 +251,7 @@ ScryfallCode=EOE 243 C Nutrient Block @Francisco Miyara 244 C Pinnacle Kill-Ship @Alexandre Honoré 245 U Survey Mechan @Johann Bodin +246 C Thaumaton Torpedo @Madeline Boni 247 R Thrumming Hivepool @Rob Rey 248 U Virulent Silencer @Kenn Yap 249 C Wurmwall Sweeper @Hardy Fowler @@ -257,6 +325,7 @@ ScryfallCode=EOE 317 R Anticausal Vestige @Chase Stone 318 M Exalted Sunborn @Scott M. Fischer 319 R Hardlight Containment @Dominik Mayer +320 R Lightstall Inquisitor @Arif Wijaya 321 R Lumen-Class Frigate @Zezhou Chen 322 R Pinnacle Starcage @Leon Tukker 323 R The Seriema @Sergey Glushakov @@ -272,6 +341,7 @@ ScryfallCode=EOE 333 R Requiem Monolith @Warren Mahy 334 R Sunset Saboteur @Mirko Failoni 335 R Zero Point Ballad @David Astruga +336 R Memorial Vault @Javier Charro 337 R Pain for All @Dmitry Burmak 338 R Terminal Velocity @Xabi Gaztelua 339 R Warmaker Gunship @Julian Kok Joon Wen @@ -279,6 +349,7 @@ ScryfallCode=EOE 341 M Famished Worldsire @Kev Walker 342 R Frenzied Baloth @Diana Franco 343 R Icetill Explorer @Warren Mahy +344 R Loading Zone @Matt Stewart 345 M Ouroboroid @Samuel Perin 346 R Sledge-Class Seedship @Leon Tukker 347 R Biotech Specialist @Alexandre Honoré @@ -321,6 +392,7 @@ ScryfallCode=EOE 384 M Exalted Sunborn @Makoron 385 M Starfield Vocalist @nina 386 M Sothera, the Supervoid @Mateusz Urbanowicz +387 M Devastating Onslaught @Naochika Morishita 388 M Icetill Explorer @Raimaru 389 M Mutinous Massacre @Aogachou 390 M The Dominion Bracelet @Mai Minamiura @@ -330,9 +402,18 @@ ScryfallCode=EOE 394 U Annul @Carlos Palma Cruchaga 395 U Umbral Collar Zealot @Dmitry Burmak 396 U Kavaron Harrier @Hardy Fowler +397 U Pull Through the Weft @Andrew Mar 398 R Singularity Rupture @Néstor Ossandón Leal 399 R Emissary Escort @Lius Lasahido [tokens] 1 c_1_1_sliver @Igor Grechanyi +2 w_1_1_human_soldier @Allen Morris +3 c_1_1_a_drone_flying_blockflying @Artur Nakhodkin +4 c_a_lander_sac_search @Titus Lunter +5 c_a_lander_sac_search @Madeline Boni +6 c_a_lander_sac_search @Martin de Diego Sádaba +7 c_a_lander_sac_search @David Astruga 8 c_a_lander_sac_search @Jorge Jacinto +9 munitions @Leonardo Santanna +10 c_2_2_a_robot @Leonardo Santanna From 14dd9721e33802b38f72d53c3be09c4c83b44c4b Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 11:20:46 +0100 Subject: [PATCH 044/183] SCH --- forge-gui/res/editions/Store Championships.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Store Championships.txt b/forge-gui/res/editions/Store Championships.txt index 41a90406ad9..e962d7dad27 100644 --- a/forge-gui/res/editions/Store Championships.txt +++ b/forge-gui/res/editions/Store Championships.txt @@ -42,8 +42,11 @@ ScryfallCode=SCH 34 R Preacher of the Schism @Zara Alfonso 35 M Virtue of Persistence @Lorenzo Lanfranconi 36 R Gleeful Demolition @Vincent Proce -37 R Charming Scoundrel @Fabira Khamesh +37 R Charming Scoundrel @Fariba Khamseh 38 R Goddric, Cloaked Reveler @Irvin Rodriguez 39 R Preordain @Toshiaki Takayama 40 R Death's Shadow @Nottsuo 41 R City of Brass @Yo Shimizu +42 R Bitter Triumph @Aaron J. Riley +43 R Slickshot Show-Off @Wayne Reynolds +44 R Fable of the Mirror-Breaker @Warren Mahy From 7402aab2a8b35e226092aaf40a1fd8c884e5bbc5 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 11:53:16 +0100 Subject: [PATCH 045/183] EOE Formats update --- forge-gui/res/formats/Archived/Alchemy/2025-07-29.txt | 8 ++++++++ .../res/formats/Archived/Arena Standard/2025-07-29.txt | 7 +++++++ forge-gui/res/formats/Archived/Historic/2025-07-29.txt | 8 ++++++++ forge-gui/res/formats/Archived/Legacy/2025-08-01.txt | 8 ++++++++ forge-gui/res/formats/Archived/Modern/2025-08-01.txt | 7 +++++++ forge-gui/res/formats/Archived/Pioneer/2025-08-01.txt | 7 +++++++ forge-gui/res/formats/Archived/Standard/2025-08-01.txt | 7 +++++++ forge-gui/res/formats/Archived/Timeless/2025-07-29.txt | 8 ++++++++ forge-gui/res/formats/Archived/Vintage/2025-08-01.txt | 9 +++++++++ forge-gui/res/formats/Casual/Brawl.txt | 2 +- forge-gui/res/formats/Sanctioned/Historic.txt | 2 +- forge-gui/res/formats/Sanctioned/Legacy.txt | 2 +- forge-gui/res/formats/Sanctioned/Modern.txt | 2 +- forge-gui/res/formats/Sanctioned/Pioneer.txt | 2 +- forge-gui/res/formats/Sanctioned/Standard.txt | 2 +- forge-gui/res/formats/Sanctioned/Vintage.txt | 2 +- 16 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 forge-gui/res/formats/Archived/Alchemy/2025-07-29.txt create mode 100644 forge-gui/res/formats/Archived/Arena Standard/2025-07-29.txt create mode 100644 forge-gui/res/formats/Archived/Historic/2025-07-29.txt create mode 100644 forge-gui/res/formats/Archived/Legacy/2025-08-01.txt create mode 100644 forge-gui/res/formats/Archived/Modern/2025-08-01.txt create mode 100644 forge-gui/res/formats/Archived/Pioneer/2025-08-01.txt create mode 100644 forge-gui/res/formats/Archived/Standard/2025-08-01.txt create mode 100644 forge-gui/res/formats/Archived/Timeless/2025-07-29.txt create mode 100644 forge-gui/res/formats/Archived/Vintage/2025-08-01.txt diff --git a/forge-gui/res/formats/Archived/Alchemy/2025-07-29.txt b/forge-gui/res/formats/Archived/Alchemy/2025-07-29.txt new file mode 100644 index 00000000000..a22ac9fe030 --- /dev/null +++ b/forge-gui/res/formats/Archived/Alchemy/2025-07-29.txt @@ -0,0 +1,8 @@ +[format] +Name:Alchemy (EOE) +Type:Archived +Subtype:Arena +Effective:2025-07-29 +Sets:ANA, ANB, BLB, YBLB, DSK, YDSK, FDN, DFT, YDFT, TDM, YTDM, FIN, EOE +Banned:Monstrous Rage +Additional:Clifftop Retreat; Dragonskull Summit; Drowned Catacomb; Glacial Fortress; Hinterland Harbor; Isolated Chapel; Rootbound Crag; Sulfur Falls; Sunpetal Grove; Woodland Cemetery diff --git a/forge-gui/res/formats/Archived/Arena Standard/2025-07-29.txt b/forge-gui/res/formats/Archived/Arena Standard/2025-07-29.txt new file mode 100644 index 00000000000..a37705a7c0a --- /dev/null +++ b/forge-gui/res/formats/Archived/Arena Standard/2025-07-29.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard (EOE) +Type:Archived +Subtype:Standard +Effective:2025-07-29 +Sets:WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE +Banned:Abuelo's Awakening; Cori-Steel Cutter; Heartfire Hero; Hopeless Nightmare; Leyline of Resonance; Monstrous Rage; This Town Ain't Big Enough; Up the Beanstalk diff --git a/forge-gui/res/formats/Archived/Historic/2025-07-29.txt b/forge-gui/res/formats/Archived/Historic/2025-07-29.txt new file mode 100644 index 00000000000..92112d7ddca --- /dev/null +++ b/forge-gui/res/formats/Archived/Historic/2025-07-29.txt @@ -0,0 +1,8 @@ +[format] +Name:Historic (EOE) +Type:Archived +Subtype:Arena +Effective:2025-07-29 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA, EOE, EOS +Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Archived/Legacy/2025-08-01.txt b/forge-gui/res/formats/Archived/Legacy/2025-08-01.txt new file mode 100644 index 00000000000..061ef75168d --- /dev/null +++ b/forge-gui/res/formats/Archived/Legacy/2025-08-01.txt @@ -0,0 +1,8 @@ +[format] +Name:Legacy (EOE) +Type:Archived +Subtype:Legacy +Effective:2025-08-01 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA, EOE, EOC, EOS +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Psychic Frog; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Sowing Mycospawn; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Troll of Khazad-dûm; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Vexing Bauble; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker +Additional:Aisha of Sparks and Smoke; Amy Rose; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Black Panther, Wakandan King; Blanka, Ferocious Friend; Bohn, Beguiling Balladeer; Captain America, First Avenger; Casal, Lurkwood Pathfinder; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Deadpool, Trading Card; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dr. Eggman; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Evin, Waterdeep Opportunist; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Iron Man, Titan of Innovation; Jurin, Leading the Charge; Ken, Burning Brawler; Knuckles the Echidna; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Mathise, Surge Channeler; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Miles "Tails" Prower; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rashel, Fist of Torm; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Shadow the Hedgehog; Simon, Wild Magic Sorcerer; Sonic the Hedgehog; Sophina, Spearsage Deserter; Storm, Force of Nature; Super State; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; The Meep; Themberchaud; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Wolverine, Best There Is; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Archived/Modern/2025-08-01.txt b/forge-gui/res/formats/Archived/Modern/2025-08-01.txt new file mode 100644 index 00000000000..d9e66268368 --- /dev/null +++ b/forge-gui/res/formats/Archived/Modern/2025-08-01.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern (EOE) +Type:Archived +Subtype:Modern +Effective:2025-08-01 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB, DSK, FDN, DFT, TDM, FIN, EOE +Banned:Amped Raptor; Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Jegantha, the Wellspring; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Summer Bloom; The One Ring; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Underworld Breach; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Archived/Pioneer/2025-08-01.txt b/forge-gui/res/formats/Archived/Pioneer/2025-08-01.txt new file mode 100644 index 00000000000..1ffed7cc532 --- /dev/null +++ b/forge-gui/res/formats/Archived/Pioneer/2025-08-01.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer (EOE) +Type:Archived +Subtype:Pioneer +Effective:2025-08-01 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE +Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Jegantha, the Wellspring; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Archived/Standard/2025-08-01.txt b/forge-gui/res/formats/Archived/Standard/2025-08-01.txt new file mode 100644 index 00000000000..b47c83c77c1 --- /dev/null +++ b/forge-gui/res/formats/Archived/Standard/2025-08-01.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard (EOE) +Type:Archived +Subtype:Standard +Effective:2025-08-01 +Sets:WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE +Banned:Abuelo's Awakening; Cori-Steel Cutter; Heartfire Hero; Hopeless Nightmare; Monstrous Rage; This Town Ain't Big Enough; Up the Beanstalk diff --git a/forge-gui/res/formats/Archived/Timeless/2025-07-29.txt b/forge-gui/res/formats/Archived/Timeless/2025-07-29.txt new file mode 100644 index 00000000000..8d3ad766d27 --- /dev/null +++ b/forge-gui/res/formats/Archived/Timeless/2025-07-29.txt @@ -0,0 +1,8 @@ +[format] +Name:Timeless (EOE) +Type:Archived +Subtype:Vintage +Effective:2025-07-29 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA, EOE, EOS +Restricted:Channel; Demonic Tutor; Tibalt's Trickery +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Endurance; Enlisted Wurm; Evolutionary Leap; Fabricate; Fury; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Grief; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Show and Tell; Slimefoot and Squee; Smuggler's Copter; Solitude; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Subtlety; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Archived/Vintage/2025-08-01.txt b/forge-gui/res/formats/Archived/Vintage/2025-08-01.txt new file mode 100644 index 00000000000..941de8416c7 --- /dev/null +++ b/forge-gui/res/formats/Archived/Vintage/2025-08-01.txt @@ -0,0 +1,9 @@ +[format] +Name:Vintage (EOE) +Type:Archived +Subtype:Vintage +Effective:2025-08-01 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA, EOE, EOC, EOS +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit +Additional:Aisha of Sparks and Smoke; Amy Rose; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Black Panther, Wakandan King; Blanka, Ferocious Friend; Bohn, Beguiling Balladeer; Captain America, First Avenger; Casal, Lurkwood Pathfinder; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Deadpool, Trading Card; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dr. Eggman; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Evin, Waterdeep Opportunist; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Iron Man, Titan of Innovation; Jurin, Leading the Charge; Ken, Burning Brawler; Knuckles the Echidna; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Mathise, Surge Channeler; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Miles "Tails" Prower; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rashel, Fist of Torm; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Shadow the Hedgehog; Simon, Wild Magic Sorcerer; Sonic the Hedgehog; Sophina, Spearsage Deserter; Storm, Force of Nature; Super State; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; The Meep; Themberchaud; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Wolverine, Best There Is; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index 12f6002cb47..2b8cc075d14 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN +Sets:WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE Additional:Arcane Signet; Command Tower diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index 29a03925e53..19552890ebe 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -4,6 +4,6 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA, EOE, EOS Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Sanctioned/Legacy.txt b/forge-gui/res/formats/Sanctioned/Legacy.txt index 40c70002982..25e157afc5e 100644 --- a/forge-gui/res/formats/Sanctioned/Legacy.txt +++ b/forge-gui/res/formats/Sanctioned/Legacy.txt @@ -3,5 +3,5 @@ Name:Legacy Order:105 Subtype:Legacy Type:Sanctioned -Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA, EOE, EOC, EOS Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Psychic Frog; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Sowing Mycospawn; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Troll of Khazad-dûm; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Vexing Bauble; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index 9a9c88f3409..dac6401ca38 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -3,5 +3,5 @@ Name:Modern Order:103 Subtype:Modern Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB, DSK, FDN, DFT, TDM, FIN +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB, DSK, FDN, DFT, TDM, FIN, EOE Banned:Amped Raptor; Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Jegantha, the Wellspring; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Summer Bloom; The One Ring; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Underworld Breach; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt index c89f9d244da..d6bb093baab 100644 --- a/forge-gui/res/formats/Sanctioned/Pioneer.txt +++ b/forge-gui/res/formats/Sanctioned/Pioneer.txt @@ -3,5 +3,5 @@ Name:Pioneer Order:102 Subtype:Pioneer Type:Sanctioned -Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Jegantha, the Wellspring; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index 9d66f81c61f..9f7918298c6 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -3,5 +3,5 @@ Name:Standard Order:101 Subtype:Standard Type:Sanctioned -Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN +Sets:WOE, LCI, MKM, OTJ, BIG, BLB, DSK, FDN, DFT, TDM, FIN, EOE Banned:Abuelo's Awakening; Cori-Steel Cutter; Heartfire Hero; Hopeless Nightmare; Monstrous Rage; This Town Ain't Big Enough; Up the Beanstalk diff --git a/forge-gui/res/formats/Sanctioned/Vintage.txt b/forge-gui/res/formats/Sanctioned/Vintage.txt index 9e0669768ad..7b6a3472e8c 100644 --- a/forge-gui/res/formats/Sanctioned/Vintage.txt +++ b/forge-gui/res/formats/Sanctioned/Vintage.txt @@ -3,6 +3,6 @@ Name:Vintage Order:104 Subtype:Vintage Type:Sanctioned -Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC, FDN, FDC, J25, INR, DFT, DRC, TDM, TDC, FIN, FIC, FCA, EOE, EOC, EOS Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit From b1d8b6fd5cca6f615121285cc8418530ae4951ef Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 12:08:15 +0100 Subject: [PATCH 046/183] Fix Decode Transmissions name --- forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt b/forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt index f54e70b6bb5..0436577ec69 100644 --- a/forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt +++ b/forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt @@ -1,4 +1,4 @@ -Name:Decode +Name:Decode Transmissions ManaCost:2 B Types:Sorcery A:SP$ Draw | NumCards$ 2 | SubAbility$ DBLoseLifeYou | SpellDescription$ You draw two cards and you lose 2 life. Void — If a nonland permanent left the battlefield this turn or a spell was warped this turn, instead you draw two cards and each opponent loses 2 life. From 7b1e96410fd268bed115c25d92496c43a0f0794b Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:29:28 +0100 Subject: [PATCH 047/183] Add files via upload (#8119) --- forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt | 2 +- forge-gui/res/cardsfolder/upcoming/possibility_technician.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt b/forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt index edc056390cb..c6b81e9c363 100644 --- a/forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt +++ b/forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt @@ -6,7 +6,7 @@ K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature enters, each opponent exiles a card from their hand and may play that card for as long as it remains exiled. Each spell cast this way costs {1} more to cast. Each land played this way enters tapped. SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ Player.Opponent | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | IsCurse$ True | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Duration$ Permanent | StaticAbilities$ MayPlay,CostsMore | AddReplacementEffect$ LandsTapped | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup -SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | MayPlayPlayer$ CardOwner +SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | MayPlayPlayer$ CardOwner | Description$ Each opponent may play the cards they exiled with EFFECTSOURCE for as long as those cards remain exiled. Each spell cast this way costs {1} more to cast. Each land played this way enters tapped. SVar:CostsMore:Mode$ RaiseCost | ValidCard$ Card.IsRemembered+CastSa Spell.MayPlaySource | AffectedZone$ Exile | Type$ Spell | Amount$ 1 SVar:LandsTapped:Event$ Moved | ValidCard$ Land.IsRemembered | ValidCause$ LandAbility.MayPlaySource | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard diff --git a/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt b/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt index 6c9eabf71ba..8a471fdb62e 100644 --- a/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt +++ b/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Kavu.Other+YouCtrl | Execute$ TrigExile | TriggerDescription$ Whenever this creature or another Kavu you control enters, exile the top card of your library. For as long as that card remains exiled, you may play it if you control a Kavu. SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STPlay | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup -SVar:STPlay:Mode$ Continuous | MayPlay$ True | CheckSVar$ X | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ For as long as that card remains exiled, you may play it. +SVar:STPlay:Mode$ Continuous | MayPlay$ True | CheckSVar$ X | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ For as long as that card remains exiled, you may play it if you control a Kavu. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Kavu.YouCtrl K:Warp:1 R From 90f6e2b17f16ad443e0ec4271b4c8c6c261e5f24 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 12:15:23 +0100 Subject: [PATCH 048/183] Migrate EOE card scripts --- .../res/cardsfolder/{upcoming => a}/adagia_windswept_bastion.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/all_fates_scroll.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/all_fates_stalker.txt | 0 .../cardsfolder/{upcoming => a}/alpharael_dreaming_acolyte.txt | 0 .../res/cardsfolder/{upcoming => a}/alpharael_stonechosen.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/amy_rose.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/anticausal_vestige.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/archenemys_charm.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/astelli_reclaimer.txt | 0 .../res/cardsfolder/{upcoming => a}/atmospheric_greenhouse.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/atomic_microsizer.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/auxiliary_boosters.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/baloth_prime.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/beamsaw_prospector.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/beyond_the_quiet.txt | 0 .../res/cardsfolder/{upcoming => b}/bioengineered_future.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biomechan_engineer.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biosynthic_burst.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biotech_specialist.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/blade_of_the_swarm.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/blooming_stinger.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/brightspear_zealot.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/broodguard_elite.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bygone_colossus.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cerebral_download.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/chorale_of_the_void.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/chrome_companion.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/close_encounter.txt | 0 .../res/cardsfolder/{upcoming => c}/cloudsculpt_technician.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/codecracker_hound.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/comet_crawler.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/command_bridge.txt | 0 .../res/cardsfolder/{upcoming => c}/consult_the_star_charts.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cosmogoyf.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cosmogrand_zenith.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cryogen_relic.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cryoshatter.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cut_propulsion.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dark_endurance.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dauntless_scrapbot.txt | 0 .../cardsfolder/{upcoming => d}/dawnsire_sunstar_dreadnought.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dawnstrike_vanguard.txt | 0 .../res/cardsfolder/{upcoming => d}/debris_field_crusher.txt | 0 .../res/cardsfolder/{upcoming => d}/decode_transmissions.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/depressurize.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/depthshaker_titan.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/desculpting_blast.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/desert_cenote.txt | 0 .../res/cardsfolder/{upcoming => d}/devastating_onslaught.txt | 0 .../res/cardsfolder/{upcoming => d}/diplomatic_relations.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/divert_disaster.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dockworker_drone.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dr_eggman.txt | 0 .../res/cardsfolder/{upcoming => d}/dragonweave_tapestry.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/drill_too_deep.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/drix_fatemaker.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dual_sun_adepts.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dual_sun_technique.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dubious_delicacy.txt | 0 .../cardsfolder/{upcoming => d}/dyadrine_synthesis_amalgam.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/edge_rover.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/elegy_acolyte.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/embrace_oblivion.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/emergency_eject.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/emissary_escort.txt | 0 .../res/cardsfolder/{upcoming => e}/entropic_battlecruiser.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/eumidian_hatchery.txt | 0 .../res/cardsfolder/{upcoming => e}/eumidian_terrabotanist.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/eumidian_wastewaker.txt | 0 .../res/cardsfolder/{upcoming => e}/eusocial_engineering.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/evendo_brushrazer.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/evendo_waking_haven.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/exalted_sunborn.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/exosuit_savior.txt | 0 .../res/cardsfolder/{upcoming => e}/exploration_broodship.txt | 0 .../res/cardsfolder/{upcoming => e}/extinguisher_battleship.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fallers_faithful.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/famished_worldsire.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fell_gravship.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/festering_thicket.txt | 0 .../res/cardsfolder/{upcoming => f}/flight_deck_coordinator.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/focus_fire.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frenzied_baloth.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frontline_war_rager.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/full_bore.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fungal_colossus.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/galactic_wayfarer.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/galvanizing_sawship.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gene_pollinator.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/genemorph_imago.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/germinating_wurm.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gigastorm_titan.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/glacier_godmaw.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/glittering_massif.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gravblade_heavy.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gravkill.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gravpack_monoist.txt | 0 .../res/cardsfolder/{upcoming => h}/haliya_ascendant_cadet.txt | 0 .../res/cardsfolder/{upcoming => h}/haliya_guided_by_light.txt | 0 .../res/cardsfolder/{upcoming => h}/hardlight_containment.txt | 0 .../res/cardsfolder/{upcoming => h}/harmonious_grovestrider.txt | 0 .../res/cardsfolder/{upcoming => h}/hearthhull_the_worldseed.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hemosymbic_mite.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/honor.txt | 0 .../res/cardsfolder/{upcoming => h}/honored_knight_captain.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/horizon_explorer.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hullcarver.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hylderblade.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hymn_of_the_faller.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/icecave_crasher.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/icetill_explorer.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/illvoi_galeblade.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/illvoi_infiltrator.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/illvoi_light_jammer.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/illvoi_operative.txt | 0 .../cardsfolder/{upcoming => i}/infinite_guideline_station.txt | 0 .../res/cardsfolder/{upcoming => i}/insatiable_skittermaw.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/insight_engine.txt | 0 .../res/cardsfolder/{upcoming => i}/inspirit_flagship_vessel.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/interceptor_mechan.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/intrepid_tenderfoot.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/invasive_maneuvers.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kav_landseeker.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kavaron_harrier.txt | 0 .../res/cardsfolder/{upcoming => k}/kavaron_memorial_world.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kavaron_skywarden.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kavaron_turbodrone.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kilo_apogee_mind.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/knight_luminary.txt | 0 .../res/cardsfolder/{upcoming => k}/knuckles_the_echidna.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/larval_scoutlander.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lashwhip_predator.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lightless_evangel.txt | 0 .../res/cardsfolder/{upcoming => l}/lightstall_inquisitor.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lithobraking.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/loading_zone.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/long_range_sensor.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lost_in_space.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lumen_class_frigate.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/luxknight_breacher.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mardu_thunderkite.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mechan_assembler.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mechan_navigator.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mechan_shieldmate.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mechanozoa.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/melded_moxite.txt | 0 .../res/cardsfolder/{upcoming => m}/meltstrider_eulogist.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/meltstriders_gear.txt | 0 .../res/cardsfolder/{upcoming => m}/meltstriders_resolve.txt | 0 .../res/cardsfolder/{upcoming => m}/memorial_team_leader.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/memorial_vault.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mental_modulation.txt | 0 .../res/cardsfolder/{upcoming => m}/mightform_harmonizer.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/miles_tails_prower.txt | 0 .../res/cardsfolder/{upcoming => m}/mmmenon_the_right_hand.txt | 0 .../res/cardsfolder/{upcoming => m}/mmmenon_uthros_exile.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/molecular_modifier.txt | 0 .../res/cardsfolder/{upcoming => m}/monoist_circuit_feeder.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/monoist_sentry.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/moonlit_meditation.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mouth_of_the_storm.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/moxite_refinery.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mutinous_massacre.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nanoform_sentinel.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nebula_dragon.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nova_hellkite.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nutrient_block.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/oasis_of_renewal.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/orbital_plunge.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/oreplate_pangolin.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/ouroboroid.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pain_for_all.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pampered_loamfrill.txt | 0 .../res/cardsfolder/{upcoming => p}/patrolling_peacemaker.txt | 0 .../{upcoming => p}/pearl_lake_warden_nesting_instinct.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/perigee_beckoner.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_emissary.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_kill_ship.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_starcage.txt | 0 .../res/cardsfolder/{upcoming => p}/planetary_annihilation.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/plasma_bolt.txt | 0 .../res/cardsfolder/{upcoming => p}/possibility_technician.txt | 0 .../res/cardsfolder/{upcoming => p}/pull_through_the_weft.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pulsar_squadron_ace.txt | 0 forge-gui/res/cardsfolder/{upcoming => q}/quantum_riddler.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/radiant_strike.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/radiant_summit.txt | 0 .../res/cardsfolder/{upcoming => r}/ragost_deft_gastronaut.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rayblade_trooper.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/red_tiger_mechan.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/remnant_elemental.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/requiem_monolith.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/reroute_systems.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rescue_skiff.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rig_for_war.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/roving_actuator.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ruinous_rampage.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rust_harvester.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sami_ships_engineer.txt | 0 .../res/cardsfolder/{upcoming => s}/sami_wildcat_captain.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/samis_curiosity.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scour_for_scrap.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scouring_swarm.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scout_for_survivors.txt | 0 .../res/cardsfolder/{upcoming => s}/scrounge_for_eternity.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/seam_rip.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/secluded_starforge.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/seedship_agrarian.txt | 0 .../res/cardsfolder/{upcoming => s}/seedship_broodtender.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/seedship_impact.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/selfcraft_mechan.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/shadow_the_hedgehog.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/shattered_wings.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sibsigs_artisan.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/singularity_rupture.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sinister_cryologist.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skystinger.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/slagdrill_scrapper.txt | 0 .../res/cardsfolder/{upcoming => s}/sledge_class_seedship.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/solar_array.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sonic_the_hedgehog.txt | 0 .../res/cardsfolder/{upcoming => s}/sothera_the_supervoid.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/space_time_anomaly.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/specimen_freighter.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/squires_lightblade.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starbreach_whale.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starfield_shepherd.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starfield_vocalist.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starfighter_pilot.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starport_security.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/starwinder.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/station_monitor.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/steelswarm_operator.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/stormforged_armor.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sunset_saboteur.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sunstar_chaplain.txt | 0 .../res/cardsfolder/{upcoming => s}/sunstar_expansionist.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sunstar_lightsmith.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/super_state.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/surge_conductor.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/survey_mechan.txt | 0 .../res/cardsfolder/{upcoming => s}/susur_secundi_void_altar.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/susurian_dirgecraft.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/susurian_voidborn.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/swarm_culler.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/synthesizer_labship.txt | 0 .../cardsfolder/{upcoming => s}/syr_vondam_sunstar_exemplar.txt | 0 .../res/cardsfolder/{upcoming => s}/syr_vondam_the_lucent.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/systems_override.txt | 0 .../res/cardsfolder/{upcoming => s}/szarel_genesis_shepherd.txt | 0 .../res/cardsfolder/{upcoming => t}/tannuk_memorial_ensign.txt | 0 .../res/cardsfolder/{upcoming => t}/tannuk_steadfast_second.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tapestry_warden.txt | 0 .../res/cardsfolder/{upcoming => t}/temporal_intervention.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/terminal_velocity.txt | 0 .../res/cardsfolder/{upcoming => t}/terrapact_intimidator.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/terrasymbiosis.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/territorial_bruntar.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/territorial_strike.txt | 0 .../res/cardsfolder/{upcoming => t}/tezzeret_cruel_captain.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thaumaton_torpedo.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thawbringer.txt | 0 .../res/cardsfolder/{upcoming => t}/the_dominion_bracelet.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/the_endstone.txt | 0 .../res/cardsfolder/{upcoming => t}/the_eternity_elevator.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/the_seriema.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thrumming_hivepool.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/timeline_culler.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tractor_beam.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tragic_trajectory.txt | 0 .../res/cardsfolder/{upcoming => u}/umbral_collar_zealot.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/unravel.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/urenis_counsel.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/uthros_psionicist.txt | 0 .../res/cardsfolder/{upcoming => u}/uthros_research_craft.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/uthros_scanship.txt | 0 .../res/cardsfolder/{upcoming => u}/uthros_titanic_godcore.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vaultguard_trooper.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vernal_fen.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/virulent_silencer.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/voidforged_titan.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vote_out.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/warmaker_gunship.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/waystones_guidance.txt | 0 .../res/cardsfolder/{upcoming => w}/weapons_manufacturing.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/wedgelight_rammer.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/weftblade_enhancer.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/weftstalker_ardent.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/weftwalking.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/wurmwall_sweeper.txt | 0 .../res/cardsfolder/{upcoming => x}/xho_cai_flickering_talon.txt | 0 .../res/cardsfolder/{upcoming => x}/xu_ifit_osteoharmonist.txt | 0 forge-gui/res/cardsfolder/{upcoming => z}/zealous_display.txt | 0 forge-gui/res/cardsfolder/{upcoming => z}/zero_point_ballad.txt | 0 forge-gui/res/cardsfolder/{upcoming => z}/zookeeper_mechan.txt | 0 295 files changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/{upcoming => a}/adagia_windswept_bastion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/all_fates_scroll.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/all_fates_stalker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/alpharael_dreaming_acolyte.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/alpharael_stonechosen.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/amy_rose.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/anticausal_vestige.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/archenemys_charm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/astelli_reclaimer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/atmospheric_greenhouse.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/atomic_microsizer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/auxiliary_boosters.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/baloth_prime.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/beamsaw_prospector.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/beyond_the_quiet.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bioengineered_future.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biomechan_engineer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biosynthic_burst.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biotech_specialist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/blade_of_the_swarm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/blooming_stinger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/brightspear_zealot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/broodguard_elite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bygone_colossus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cerebral_download.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/chorale_of_the_void.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/chrome_companion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/close_encounter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cloudsculpt_technician.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/codecracker_hound.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/comet_crawler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/command_bridge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/consult_the_star_charts.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cosmogoyf.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cosmogrand_zenith.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cryogen_relic.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cryoshatter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cut_propulsion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dark_endurance.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dauntless_scrapbot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dawnsire_sunstar_dreadnought.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dawnstrike_vanguard.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/debris_field_crusher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/decode_transmissions.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/depressurize.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/depthshaker_titan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/desculpting_blast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/desert_cenote.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/devastating_onslaught.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/diplomatic_relations.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/divert_disaster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dockworker_drone.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dr_eggman.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dragonweave_tapestry.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/drill_too_deep.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/drix_fatemaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dual_sun_adepts.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dual_sun_technique.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dubious_delicacy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dyadrine_synthesis_amalgam.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/edge_rover.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/elegy_acolyte.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/embrace_oblivion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/emergency_eject.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/emissary_escort.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/entropic_battlecruiser.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eumidian_hatchery.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eumidian_terrabotanist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eumidian_wastewaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eusocial_engineering.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/evendo_brushrazer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/evendo_waking_haven.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/exalted_sunborn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/exosuit_savior.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/exploration_broodship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/extinguisher_battleship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fallers_faithful.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/famished_worldsire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fell_gravship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/festering_thicket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/flight_deck_coordinator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/focus_fire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frenzied_baloth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frontline_war_rager.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/full_bore.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fungal_colossus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/galactic_wayfarer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/galvanizing_sawship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gene_pollinator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/genemorph_imago.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/germinating_wurm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gigastorm_titan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/glacier_godmaw.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/glittering_massif.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gravblade_heavy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gravkill.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gravpack_monoist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/haliya_ascendant_cadet.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/haliya_guided_by_light.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hardlight_containment.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/harmonious_grovestrider.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hearthhull_the_worldseed.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hemosymbic_mite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/honor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/honored_knight_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/horizon_explorer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hullcarver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hylderblade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hymn_of_the_faller.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/icecave_crasher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/icetill_explorer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/illvoi_galeblade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/illvoi_infiltrator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/illvoi_light_jammer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/illvoi_operative.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/infinite_guideline_station.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/insatiable_skittermaw.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/insight_engine.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/inspirit_flagship_vessel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/interceptor_mechan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/intrepid_tenderfoot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/invasive_maneuvers.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kav_landseeker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kavaron_harrier.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kavaron_memorial_world.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kavaron_skywarden.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kavaron_turbodrone.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kilo_apogee_mind.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/knight_luminary.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/knuckles_the_echidna.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/larval_scoutlander.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lashwhip_predator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lightless_evangel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lightstall_inquisitor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lithobraking.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/loading_zone.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/long_range_sensor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lost_in_space.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lumen_class_frigate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/luxknight_breacher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mardu_thunderkite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mechan_assembler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mechan_navigator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mechan_shieldmate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mechanozoa.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/melded_moxite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/meltstrider_eulogist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/meltstriders_gear.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/meltstriders_resolve.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/memorial_team_leader.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/memorial_vault.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mental_modulation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mightform_harmonizer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/miles_tails_prower.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mmmenon_the_right_hand.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mmmenon_uthros_exile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/molecular_modifier.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/monoist_circuit_feeder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/monoist_sentry.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/moonlit_meditation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mouth_of_the_storm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/moxite_refinery.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mutinous_massacre.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nanoform_sentinel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nebula_dragon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nova_hellkite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nutrient_block.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/oasis_of_renewal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/orbital_plunge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/oreplate_pangolin.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/ouroboroid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pain_for_all.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pampered_loamfrill.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/patrolling_peacemaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pearl_lake_warden_nesting_instinct.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/perigee_beckoner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_emissary.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_kill_ship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pinnacle_starcage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/planetary_annihilation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/plasma_bolt.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/possibility_technician.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pull_through_the_weft.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pulsar_squadron_ace.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => q}/quantum_riddler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/radiant_strike.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/radiant_summit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ragost_deft_gastronaut.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rayblade_trooper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/red_tiger_mechan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/remnant_elemental.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/requiem_monolith.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/reroute_systems.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rescue_skiff.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rig_for_war.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/roving_actuator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ruinous_rampage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rust_harvester.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sami_ships_engineer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sami_wildcat_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/samis_curiosity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scour_for_scrap.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scouring_swarm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scout_for_survivors.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scrounge_for_eternity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seam_rip.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/secluded_starforge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seedship_agrarian.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seedship_broodtender.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seedship_impact.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/selfcraft_mechan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/shadow_the_hedgehog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/shattered_wings.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sibsigs_artisan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/singularity_rupture.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sinister_cryologist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skystinger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/slagdrill_scrapper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sledge_class_seedship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/solar_array.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sonic_the_hedgehog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sothera_the_supervoid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/space_time_anomaly.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/specimen_freighter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/squires_lightblade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starbreach_whale.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starfield_shepherd.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starfield_vocalist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starfighter_pilot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starport_security.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/starwinder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/station_monitor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/steelswarm_operator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/stormforged_armor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunset_saboteur.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunstar_chaplain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunstar_expansionist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunstar_lightsmith.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/super_state.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/surge_conductor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/survey_mechan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/susur_secundi_void_altar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/susurian_dirgecraft.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/susurian_voidborn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/swarm_culler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/synthesizer_labship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/syr_vondam_sunstar_exemplar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/syr_vondam_the_lucent.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/systems_override.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/szarel_genesis_shepherd.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tannuk_memorial_ensign.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tannuk_steadfast_second.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tapestry_warden.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/temporal_intervention.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/terminal_velocity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/terrapact_intimidator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/terrasymbiosis.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/territorial_bruntar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/territorial_strike.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tezzeret_cruel_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thaumaton_torpedo.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thawbringer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_dominion_bracelet.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_endstone.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_eternity_elevator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_seriema.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thrumming_hivepool.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/timeline_culler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tractor_beam.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tragic_trajectory.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/umbral_collar_zealot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/unravel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/urenis_counsel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/uthros_psionicist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/uthros_research_craft.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/uthros_scanship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/uthros_titanic_godcore.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vaultguard_trooper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vernal_fen.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/virulent_silencer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/voidforged_titan.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vote_out.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/warmaker_gunship.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/waystones_guidance.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/weapons_manufacturing.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wedgelight_rammer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/weftblade_enhancer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/weftstalker_ardent.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/weftwalking.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wurmwall_sweeper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => x}/xho_cai_flickering_talon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => x}/xu_ifit_osteoharmonist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zealous_display.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zero_point_ballad.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zookeeper_mechan.txt (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/adagia_windswept_bastion.txt b/forge-gui/res/cardsfolder/a/adagia_windswept_bastion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/adagia_windswept_bastion.txt rename to forge-gui/res/cardsfolder/a/adagia_windswept_bastion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/all_fates_scroll.txt b/forge-gui/res/cardsfolder/a/all_fates_scroll.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/all_fates_scroll.txt rename to forge-gui/res/cardsfolder/a/all_fates_scroll.txt diff --git a/forge-gui/res/cardsfolder/upcoming/all_fates_stalker.txt b/forge-gui/res/cardsfolder/a/all_fates_stalker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/all_fates_stalker.txt rename to forge-gui/res/cardsfolder/a/all_fates_stalker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt b/forge-gui/res/cardsfolder/a/alpharael_dreaming_acolyte.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/alpharael_dreaming_acolyte.txt rename to forge-gui/res/cardsfolder/a/alpharael_dreaming_acolyte.txt diff --git a/forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt b/forge-gui/res/cardsfolder/a/alpharael_stonechosen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/alpharael_stonechosen.txt rename to forge-gui/res/cardsfolder/a/alpharael_stonechosen.txt diff --git a/forge-gui/res/cardsfolder/upcoming/amy_rose.txt b/forge-gui/res/cardsfolder/a/amy_rose.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/amy_rose.txt rename to forge-gui/res/cardsfolder/a/amy_rose.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anticausal_vestige.txt b/forge-gui/res/cardsfolder/a/anticausal_vestige.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/anticausal_vestige.txt rename to forge-gui/res/cardsfolder/a/anticausal_vestige.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archenemys_charm.txt b/forge-gui/res/cardsfolder/a/archenemys_charm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archenemys_charm.txt rename to forge-gui/res/cardsfolder/a/archenemys_charm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt b/forge-gui/res/cardsfolder/a/astelli_reclaimer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/astelli_reclaimer.txt rename to forge-gui/res/cardsfolder/a/astelli_reclaimer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt b/forge-gui/res/cardsfolder/a/atmospheric_greenhouse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/atmospheric_greenhouse.txt rename to forge-gui/res/cardsfolder/a/atmospheric_greenhouse.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt b/forge-gui/res/cardsfolder/a/atomic_microsizer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/atomic_microsizer.txt rename to forge-gui/res/cardsfolder/a/atomic_microsizer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt b/forge-gui/res/cardsfolder/a/auxiliary_boosters.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/auxiliary_boosters.txt rename to forge-gui/res/cardsfolder/a/auxiliary_boosters.txt diff --git a/forge-gui/res/cardsfolder/upcoming/baloth_prime.txt b/forge-gui/res/cardsfolder/b/baloth_prime.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/baloth_prime.txt rename to forge-gui/res/cardsfolder/b/baloth_prime.txt diff --git a/forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt b/forge-gui/res/cardsfolder/b/beamsaw_prospector.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/beamsaw_prospector.txt rename to forge-gui/res/cardsfolder/b/beamsaw_prospector.txt diff --git a/forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt b/forge-gui/res/cardsfolder/b/beyond_the_quiet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/beyond_the_quiet.txt rename to forge-gui/res/cardsfolder/b/beyond_the_quiet.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bioengineered_future.txt b/forge-gui/res/cardsfolder/b/bioengineered_future.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bioengineered_future.txt rename to forge-gui/res/cardsfolder/b/bioengineered_future.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt b/forge-gui/res/cardsfolder/b/biomechan_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biomechan_engineer.txt rename to forge-gui/res/cardsfolder/b/biomechan_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt b/forge-gui/res/cardsfolder/b/biosynthic_burst.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biosynthic_burst.txt rename to forge-gui/res/cardsfolder/b/biosynthic_burst.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt b/forge-gui/res/cardsfolder/b/biotech_specialist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biotech_specialist.txt rename to forge-gui/res/cardsfolder/b/biotech_specialist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt b/forge-gui/res/cardsfolder/b/blade_of_the_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blade_of_the_swarm.txt rename to forge-gui/res/cardsfolder/b/blade_of_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt b/forge-gui/res/cardsfolder/b/blooming_stinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blooming_stinger.txt rename to forge-gui/res/cardsfolder/b/blooming_stinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt b/forge-gui/res/cardsfolder/b/brightspear_zealot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/brightspear_zealot.txt rename to forge-gui/res/cardsfolder/b/brightspear_zealot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt b/forge-gui/res/cardsfolder/b/broodguard_elite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/broodguard_elite.txt rename to forge-gui/res/cardsfolder/b/broodguard_elite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt b/forge-gui/res/cardsfolder/b/bygone_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bygone_colossus.txt rename to forge-gui/res/cardsfolder/b/bygone_colossus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cerebral_download.txt b/forge-gui/res/cardsfolder/c/cerebral_download.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cerebral_download.txt rename to forge-gui/res/cardsfolder/c/cerebral_download.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chorale_of_the_void.txt b/forge-gui/res/cardsfolder/c/chorale_of_the_void.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chorale_of_the_void.txt rename to forge-gui/res/cardsfolder/c/chorale_of_the_void.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chrome_companion.txt b/forge-gui/res/cardsfolder/c/chrome_companion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chrome_companion.txt rename to forge-gui/res/cardsfolder/c/chrome_companion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/close_encounter.txt b/forge-gui/res/cardsfolder/c/close_encounter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/close_encounter.txt rename to forge-gui/res/cardsfolder/c/close_encounter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt b/forge-gui/res/cardsfolder/c/cloudsculpt_technician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cloudsculpt_technician.txt rename to forge-gui/res/cardsfolder/c/cloudsculpt_technician.txt diff --git a/forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt b/forge-gui/res/cardsfolder/c/codecracker_hound.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/codecracker_hound.txt rename to forge-gui/res/cardsfolder/c/codecracker_hound.txt diff --git a/forge-gui/res/cardsfolder/upcoming/comet_crawler.txt b/forge-gui/res/cardsfolder/c/comet_crawler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/comet_crawler.txt rename to forge-gui/res/cardsfolder/c/comet_crawler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/command_bridge.txt b/forge-gui/res/cardsfolder/c/command_bridge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/command_bridge.txt rename to forge-gui/res/cardsfolder/c/command_bridge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt b/forge-gui/res/cardsfolder/c/consult_the_star_charts.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/consult_the_star_charts.txt rename to forge-gui/res/cardsfolder/c/consult_the_star_charts.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt b/forge-gui/res/cardsfolder/c/cosmogoyf.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cosmogoyf.txt rename to forge-gui/res/cardsfolder/c/cosmogoyf.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt b/forge-gui/res/cardsfolder/c/cosmogrand_zenith.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cosmogrand_zenith.txt rename to forge-gui/res/cardsfolder/c/cosmogrand_zenith.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt b/forge-gui/res/cardsfolder/c/cryogen_relic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cryogen_relic.txt rename to forge-gui/res/cardsfolder/c/cryogen_relic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cryoshatter.txt b/forge-gui/res/cardsfolder/c/cryoshatter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cryoshatter.txt rename to forge-gui/res/cardsfolder/c/cryoshatter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt b/forge-gui/res/cardsfolder/c/cut_propulsion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cut_propulsion.txt rename to forge-gui/res/cardsfolder/c/cut_propulsion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dark_endurance.txt b/forge-gui/res/cardsfolder/d/dark_endurance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dark_endurance.txt rename to forge-gui/res/cardsfolder/d/dark_endurance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt b/forge-gui/res/cardsfolder/d/dauntless_scrapbot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dauntless_scrapbot.txt rename to forge-gui/res/cardsfolder/d/dauntless_scrapbot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dawnsire_sunstar_dreadnought.txt b/forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dawnsire_sunstar_dreadnought.txt rename to forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt b/forge-gui/res/cardsfolder/d/dawnstrike_vanguard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dawnstrike_vanguard.txt rename to forge-gui/res/cardsfolder/d/dawnstrike_vanguard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt b/forge-gui/res/cardsfolder/d/debris_field_crusher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/debris_field_crusher.txt rename to forge-gui/res/cardsfolder/d/debris_field_crusher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt b/forge-gui/res/cardsfolder/d/decode_transmissions.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/decode_transmissions.txt rename to forge-gui/res/cardsfolder/d/decode_transmissions.txt diff --git a/forge-gui/res/cardsfolder/upcoming/depressurize.txt b/forge-gui/res/cardsfolder/d/depressurize.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/depressurize.txt rename to forge-gui/res/cardsfolder/d/depressurize.txt diff --git a/forge-gui/res/cardsfolder/upcoming/depthshaker_titan.txt b/forge-gui/res/cardsfolder/d/depthshaker_titan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/depthshaker_titan.txt rename to forge-gui/res/cardsfolder/d/depthshaker_titan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/desculpting_blast.txt b/forge-gui/res/cardsfolder/d/desculpting_blast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/desculpting_blast.txt rename to forge-gui/res/cardsfolder/d/desculpting_blast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/desert_cenote.txt b/forge-gui/res/cardsfolder/d/desert_cenote.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/desert_cenote.txt rename to forge-gui/res/cardsfolder/d/desert_cenote.txt diff --git a/forge-gui/res/cardsfolder/upcoming/devastating_onslaught.txt b/forge-gui/res/cardsfolder/d/devastating_onslaught.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/devastating_onslaught.txt rename to forge-gui/res/cardsfolder/d/devastating_onslaught.txt diff --git a/forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt b/forge-gui/res/cardsfolder/d/diplomatic_relations.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/diplomatic_relations.txt rename to forge-gui/res/cardsfolder/d/diplomatic_relations.txt diff --git a/forge-gui/res/cardsfolder/upcoming/divert_disaster.txt b/forge-gui/res/cardsfolder/d/divert_disaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/divert_disaster.txt rename to forge-gui/res/cardsfolder/d/divert_disaster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt b/forge-gui/res/cardsfolder/d/dockworker_drone.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dockworker_drone.txt rename to forge-gui/res/cardsfolder/d/dockworker_drone.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dr_eggman.txt b/forge-gui/res/cardsfolder/d/dr_eggman.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dr_eggman.txt rename to forge-gui/res/cardsfolder/d/dr_eggman.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dragonweave_tapestry.txt b/forge-gui/res/cardsfolder/d/dragonweave_tapestry.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dragonweave_tapestry.txt rename to forge-gui/res/cardsfolder/d/dragonweave_tapestry.txt diff --git a/forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt b/forge-gui/res/cardsfolder/d/drill_too_deep.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/drill_too_deep.txt rename to forge-gui/res/cardsfolder/d/drill_too_deep.txt diff --git a/forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt b/forge-gui/res/cardsfolder/d/drix_fatemaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/drix_fatemaker.txt rename to forge-gui/res/cardsfolder/d/drix_fatemaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt b/forge-gui/res/cardsfolder/d/dual_sun_adepts.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dual_sun_adepts.txt rename to forge-gui/res/cardsfolder/d/dual_sun_adepts.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt b/forge-gui/res/cardsfolder/d/dual_sun_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dual_sun_technique.txt rename to forge-gui/res/cardsfolder/d/dual_sun_technique.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt b/forge-gui/res/cardsfolder/d/dubious_delicacy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dubious_delicacy.txt rename to forge-gui/res/cardsfolder/d/dubious_delicacy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt b/forge-gui/res/cardsfolder/d/dyadrine_synthesis_amalgam.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dyadrine_synthesis_amalgam.txt rename to forge-gui/res/cardsfolder/d/dyadrine_synthesis_amalgam.txt diff --git a/forge-gui/res/cardsfolder/upcoming/edge_rover.txt b/forge-gui/res/cardsfolder/e/edge_rover.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/edge_rover.txt rename to forge-gui/res/cardsfolder/e/edge_rover.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt b/forge-gui/res/cardsfolder/e/elegy_acolyte.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elegy_acolyte.txt rename to forge-gui/res/cardsfolder/e/elegy_acolyte.txt diff --git a/forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt b/forge-gui/res/cardsfolder/e/embrace_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/embrace_oblivion.txt rename to forge-gui/res/cardsfolder/e/embrace_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/emergency_eject.txt b/forge-gui/res/cardsfolder/e/emergency_eject.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/emergency_eject.txt rename to forge-gui/res/cardsfolder/e/emergency_eject.txt diff --git a/forge-gui/res/cardsfolder/upcoming/emissary_escort.txt b/forge-gui/res/cardsfolder/e/emissary_escort.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/emissary_escort.txt rename to forge-gui/res/cardsfolder/e/emissary_escort.txt diff --git a/forge-gui/res/cardsfolder/upcoming/entropic_battlecruiser.txt b/forge-gui/res/cardsfolder/e/entropic_battlecruiser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/entropic_battlecruiser.txt rename to forge-gui/res/cardsfolder/e/entropic_battlecruiser.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt b/forge-gui/res/cardsfolder/e/eumidian_hatchery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eumidian_hatchery.txt rename to forge-gui/res/cardsfolder/e/eumidian_hatchery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt b/forge-gui/res/cardsfolder/e/eumidian_terrabotanist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eumidian_terrabotanist.txt rename to forge-gui/res/cardsfolder/e/eumidian_terrabotanist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eumidian_wastewaker.txt b/forge-gui/res/cardsfolder/e/eumidian_wastewaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eumidian_wastewaker.txt rename to forge-gui/res/cardsfolder/e/eumidian_wastewaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt b/forge-gui/res/cardsfolder/e/eusocial_engineering.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eusocial_engineering.txt rename to forge-gui/res/cardsfolder/e/eusocial_engineering.txt diff --git a/forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt b/forge-gui/res/cardsfolder/e/evendo_brushrazer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/evendo_brushrazer.txt rename to forge-gui/res/cardsfolder/e/evendo_brushrazer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt b/forge-gui/res/cardsfolder/e/evendo_waking_haven.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/evendo_waking_haven.txt rename to forge-gui/res/cardsfolder/e/evendo_waking_haven.txt diff --git a/forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt b/forge-gui/res/cardsfolder/e/exalted_sunborn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/exalted_sunborn.txt rename to forge-gui/res/cardsfolder/e/exalted_sunborn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt b/forge-gui/res/cardsfolder/e/exosuit_savior.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/exosuit_savior.txt rename to forge-gui/res/cardsfolder/e/exosuit_savior.txt diff --git a/forge-gui/res/cardsfolder/upcoming/exploration_broodship.txt b/forge-gui/res/cardsfolder/e/exploration_broodship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/exploration_broodship.txt rename to forge-gui/res/cardsfolder/e/exploration_broodship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt b/forge-gui/res/cardsfolder/e/extinguisher_battleship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/extinguisher_battleship.txt rename to forge-gui/res/cardsfolder/e/extinguisher_battleship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt b/forge-gui/res/cardsfolder/f/fallers_faithful.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fallers_faithful.txt rename to forge-gui/res/cardsfolder/f/fallers_faithful.txt diff --git a/forge-gui/res/cardsfolder/upcoming/famished_worldsire.txt b/forge-gui/res/cardsfolder/f/famished_worldsire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/famished_worldsire.txt rename to forge-gui/res/cardsfolder/f/famished_worldsire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fell_gravship.txt b/forge-gui/res/cardsfolder/f/fell_gravship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fell_gravship.txt rename to forge-gui/res/cardsfolder/f/fell_gravship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/festering_thicket.txt b/forge-gui/res/cardsfolder/f/festering_thicket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/festering_thicket.txt rename to forge-gui/res/cardsfolder/f/festering_thicket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt b/forge-gui/res/cardsfolder/f/flight_deck_coordinator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/flight_deck_coordinator.txt rename to forge-gui/res/cardsfolder/f/flight_deck_coordinator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/focus_fire.txt b/forge-gui/res/cardsfolder/f/focus_fire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/focus_fire.txt rename to forge-gui/res/cardsfolder/f/focus_fire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frenzied_baloth.txt b/forge-gui/res/cardsfolder/f/frenzied_baloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frenzied_baloth.txt rename to forge-gui/res/cardsfolder/f/frenzied_baloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt b/forge-gui/res/cardsfolder/f/frontline_war_rager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frontline_war_rager.txt rename to forge-gui/res/cardsfolder/f/frontline_war_rager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/full_bore.txt b/forge-gui/res/cardsfolder/f/full_bore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/full_bore.txt rename to forge-gui/res/cardsfolder/f/full_bore.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fungal_colossus.txt b/forge-gui/res/cardsfolder/f/fungal_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fungal_colossus.txt rename to forge-gui/res/cardsfolder/f/fungal_colossus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt b/forge-gui/res/cardsfolder/g/galactic_wayfarer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/galactic_wayfarer.txt rename to forge-gui/res/cardsfolder/g/galactic_wayfarer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt b/forge-gui/res/cardsfolder/g/galvanizing_sawship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/galvanizing_sawship.txt rename to forge-gui/res/cardsfolder/g/galvanizing_sawship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt b/forge-gui/res/cardsfolder/g/gene_pollinator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gene_pollinator.txt rename to forge-gui/res/cardsfolder/g/gene_pollinator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt b/forge-gui/res/cardsfolder/g/genemorph_imago.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/genemorph_imago.txt rename to forge-gui/res/cardsfolder/g/genemorph_imago.txt diff --git a/forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt b/forge-gui/res/cardsfolder/g/germinating_wurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/germinating_wurm.txt rename to forge-gui/res/cardsfolder/g/germinating_wurm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt b/forge-gui/res/cardsfolder/g/gigastorm_titan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gigastorm_titan.txt rename to forge-gui/res/cardsfolder/g/gigastorm_titan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt b/forge-gui/res/cardsfolder/g/glacier_godmaw.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/glacier_godmaw.txt rename to forge-gui/res/cardsfolder/g/glacier_godmaw.txt diff --git a/forge-gui/res/cardsfolder/upcoming/glittering_massif.txt b/forge-gui/res/cardsfolder/g/glittering_massif.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/glittering_massif.txt rename to forge-gui/res/cardsfolder/g/glittering_massif.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt b/forge-gui/res/cardsfolder/g/gravblade_heavy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gravblade_heavy.txt rename to forge-gui/res/cardsfolder/g/gravblade_heavy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gravkill.txt b/forge-gui/res/cardsfolder/g/gravkill.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gravkill.txt rename to forge-gui/res/cardsfolder/g/gravkill.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt b/forge-gui/res/cardsfolder/g/gravpack_monoist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gravpack_monoist.txt rename to forge-gui/res/cardsfolder/g/gravpack_monoist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt b/forge-gui/res/cardsfolder/h/haliya_ascendant_cadet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/haliya_ascendant_cadet.txt rename to forge-gui/res/cardsfolder/h/haliya_ascendant_cadet.txt diff --git a/forge-gui/res/cardsfolder/upcoming/haliya_guided_by_light.txt b/forge-gui/res/cardsfolder/h/haliya_guided_by_light.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/haliya_guided_by_light.txt rename to forge-gui/res/cardsfolder/h/haliya_guided_by_light.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hardlight_containment.txt b/forge-gui/res/cardsfolder/h/hardlight_containment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hardlight_containment.txt rename to forge-gui/res/cardsfolder/h/hardlight_containment.txt diff --git a/forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt b/forge-gui/res/cardsfolder/h/harmonious_grovestrider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/harmonious_grovestrider.txt rename to forge-gui/res/cardsfolder/h/harmonious_grovestrider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt b/forge-gui/res/cardsfolder/h/hearthhull_the_worldseed.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hearthhull_the_worldseed.txt rename to forge-gui/res/cardsfolder/h/hearthhull_the_worldseed.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hemosymbic_mite.txt b/forge-gui/res/cardsfolder/h/hemosymbic_mite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hemosymbic_mite.txt rename to forge-gui/res/cardsfolder/h/hemosymbic_mite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/honor.txt b/forge-gui/res/cardsfolder/h/honor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/honor.txt rename to forge-gui/res/cardsfolder/h/honor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt b/forge-gui/res/cardsfolder/h/honored_knight_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/honored_knight_captain.txt rename to forge-gui/res/cardsfolder/h/honored_knight_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt b/forge-gui/res/cardsfolder/h/horizon_explorer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/horizon_explorer.txt rename to forge-gui/res/cardsfolder/h/horizon_explorer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hullcarver.txt b/forge-gui/res/cardsfolder/h/hullcarver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hullcarver.txt rename to forge-gui/res/cardsfolder/h/hullcarver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hylderblade.txt b/forge-gui/res/cardsfolder/h/hylderblade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hylderblade.txt rename to forge-gui/res/cardsfolder/h/hylderblade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt b/forge-gui/res/cardsfolder/h/hymn_of_the_faller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hymn_of_the_faller.txt rename to forge-gui/res/cardsfolder/h/hymn_of_the_faller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt b/forge-gui/res/cardsfolder/i/icecave_crasher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/icecave_crasher.txt rename to forge-gui/res/cardsfolder/i/icecave_crasher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt b/forge-gui/res/cardsfolder/i/icetill_explorer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/icetill_explorer.txt rename to forge-gui/res/cardsfolder/i/icetill_explorer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt b/forge-gui/res/cardsfolder/i/illvoi_galeblade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illvoi_galeblade.txt rename to forge-gui/res/cardsfolder/i/illvoi_galeblade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt b/forge-gui/res/cardsfolder/i/illvoi_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illvoi_infiltrator.txt rename to forge-gui/res/cardsfolder/i/illvoi_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt b/forge-gui/res/cardsfolder/i/illvoi_light_jammer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illvoi_light_jammer.txt rename to forge-gui/res/cardsfolder/i/illvoi_light_jammer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt b/forge-gui/res/cardsfolder/i/illvoi_operative.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illvoi_operative.txt rename to forge-gui/res/cardsfolder/i/illvoi_operative.txt diff --git a/forge-gui/res/cardsfolder/upcoming/infinite_guideline_station.txt b/forge-gui/res/cardsfolder/i/infinite_guideline_station.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/infinite_guideline_station.txt rename to forge-gui/res/cardsfolder/i/infinite_guideline_station.txt diff --git a/forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt b/forge-gui/res/cardsfolder/i/insatiable_skittermaw.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/insatiable_skittermaw.txt rename to forge-gui/res/cardsfolder/i/insatiable_skittermaw.txt diff --git a/forge-gui/res/cardsfolder/upcoming/insight_engine.txt b/forge-gui/res/cardsfolder/i/insight_engine.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/insight_engine.txt rename to forge-gui/res/cardsfolder/i/insight_engine.txt diff --git a/forge-gui/res/cardsfolder/upcoming/inspirit_flagship_vessel.txt b/forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/inspirit_flagship_vessel.txt rename to forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/interceptor_mechan.txt b/forge-gui/res/cardsfolder/i/interceptor_mechan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/interceptor_mechan.txt rename to forge-gui/res/cardsfolder/i/interceptor_mechan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt b/forge-gui/res/cardsfolder/i/intrepid_tenderfoot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/intrepid_tenderfoot.txt rename to forge-gui/res/cardsfolder/i/intrepid_tenderfoot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt b/forge-gui/res/cardsfolder/i/invasive_maneuvers.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/invasive_maneuvers.txt rename to forge-gui/res/cardsfolder/i/invasive_maneuvers.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kav_landseeker.txt b/forge-gui/res/cardsfolder/k/kav_landseeker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kav_landseeker.txt rename to forge-gui/res/cardsfolder/k/kav_landseeker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_harrier.txt b/forge-gui/res/cardsfolder/k/kavaron_harrier.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kavaron_harrier.txt rename to forge-gui/res/cardsfolder/k/kavaron_harrier.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt b/forge-gui/res/cardsfolder/k/kavaron_memorial_world.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kavaron_memorial_world.txt rename to forge-gui/res/cardsfolder/k/kavaron_memorial_world.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt b/forge-gui/res/cardsfolder/k/kavaron_skywarden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kavaron_skywarden.txt rename to forge-gui/res/cardsfolder/k/kavaron_skywarden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt b/forge-gui/res/cardsfolder/k/kavaron_turbodrone.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kavaron_turbodrone.txt rename to forge-gui/res/cardsfolder/k/kavaron_turbodrone.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt b/forge-gui/res/cardsfolder/k/kilo_apogee_mind.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kilo_apogee_mind.txt rename to forge-gui/res/cardsfolder/k/kilo_apogee_mind.txt diff --git a/forge-gui/res/cardsfolder/upcoming/knight_luminary.txt b/forge-gui/res/cardsfolder/k/knight_luminary.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/knight_luminary.txt rename to forge-gui/res/cardsfolder/k/knight_luminary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt b/forge-gui/res/cardsfolder/k/knuckles_the_echidna.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/knuckles_the_echidna.txt rename to forge-gui/res/cardsfolder/k/knuckles_the_echidna.txt diff --git a/forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt b/forge-gui/res/cardsfolder/l/larval_scoutlander.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/larval_scoutlander.txt rename to forge-gui/res/cardsfolder/l/larval_scoutlander.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt b/forge-gui/res/cardsfolder/l/lashwhip_predator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lashwhip_predator.txt rename to forge-gui/res/cardsfolder/l/lashwhip_predator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt b/forge-gui/res/cardsfolder/l/lightless_evangel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lightless_evangel.txt rename to forge-gui/res/cardsfolder/l/lightless_evangel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt b/forge-gui/res/cardsfolder/l/lightstall_inquisitor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lightstall_inquisitor.txt rename to forge-gui/res/cardsfolder/l/lightstall_inquisitor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lithobraking.txt b/forge-gui/res/cardsfolder/l/lithobraking.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lithobraking.txt rename to forge-gui/res/cardsfolder/l/lithobraking.txt diff --git a/forge-gui/res/cardsfolder/upcoming/loading_zone.txt b/forge-gui/res/cardsfolder/l/loading_zone.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/loading_zone.txt rename to forge-gui/res/cardsfolder/l/loading_zone.txt diff --git a/forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt b/forge-gui/res/cardsfolder/l/long_range_sensor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/long_range_sensor.txt rename to forge-gui/res/cardsfolder/l/long_range_sensor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lost_in_space.txt b/forge-gui/res/cardsfolder/l/lost_in_space.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lost_in_space.txt rename to forge-gui/res/cardsfolder/l/lost_in_space.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt b/forge-gui/res/cardsfolder/l/lumen_class_frigate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lumen_class_frigate.txt rename to forge-gui/res/cardsfolder/l/lumen_class_frigate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt b/forge-gui/res/cardsfolder/l/luxknight_breacher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/luxknight_breacher.txt rename to forge-gui/res/cardsfolder/l/luxknight_breacher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mardu_thunderkite.txt b/forge-gui/res/cardsfolder/m/mardu_thunderkite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mardu_thunderkite.txt rename to forge-gui/res/cardsfolder/m/mardu_thunderkite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt b/forge-gui/res/cardsfolder/m/mechan_assembler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mechan_assembler.txt rename to forge-gui/res/cardsfolder/m/mechan_assembler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt b/forge-gui/res/cardsfolder/m/mechan_navigator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mechan_navigator.txt rename to forge-gui/res/cardsfolder/m/mechan_navigator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt b/forge-gui/res/cardsfolder/m/mechan_shieldmate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mechan_shieldmate.txt rename to forge-gui/res/cardsfolder/m/mechan_shieldmate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mechanozoa.txt b/forge-gui/res/cardsfolder/m/mechanozoa.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mechanozoa.txt rename to forge-gui/res/cardsfolder/m/mechanozoa.txt diff --git a/forge-gui/res/cardsfolder/upcoming/melded_moxite.txt b/forge-gui/res/cardsfolder/m/melded_moxite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/melded_moxite.txt rename to forge-gui/res/cardsfolder/m/melded_moxite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/meltstrider_eulogist.txt b/forge-gui/res/cardsfolder/m/meltstrider_eulogist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/meltstrider_eulogist.txt rename to forge-gui/res/cardsfolder/m/meltstrider_eulogist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt b/forge-gui/res/cardsfolder/m/meltstriders_gear.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/meltstriders_gear.txt rename to forge-gui/res/cardsfolder/m/meltstriders_gear.txt diff --git a/forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt b/forge-gui/res/cardsfolder/m/meltstriders_resolve.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/meltstriders_resolve.txt rename to forge-gui/res/cardsfolder/m/meltstriders_resolve.txt diff --git a/forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt b/forge-gui/res/cardsfolder/m/memorial_team_leader.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/memorial_team_leader.txt rename to forge-gui/res/cardsfolder/m/memorial_team_leader.txt diff --git a/forge-gui/res/cardsfolder/upcoming/memorial_vault.txt b/forge-gui/res/cardsfolder/m/memorial_vault.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/memorial_vault.txt rename to forge-gui/res/cardsfolder/m/memorial_vault.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mental_modulation.txt b/forge-gui/res/cardsfolder/m/mental_modulation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mental_modulation.txt rename to forge-gui/res/cardsfolder/m/mental_modulation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt b/forge-gui/res/cardsfolder/m/mightform_harmonizer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mightform_harmonizer.txt rename to forge-gui/res/cardsfolder/m/mightform_harmonizer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt b/forge-gui/res/cardsfolder/m/miles_tails_prower.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/miles_tails_prower.txt rename to forge-gui/res/cardsfolder/m/miles_tails_prower.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mmmenon_the_right_hand.txt b/forge-gui/res/cardsfolder/m/mmmenon_the_right_hand.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mmmenon_the_right_hand.txt rename to forge-gui/res/cardsfolder/m/mmmenon_the_right_hand.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt b/forge-gui/res/cardsfolder/m/mmmenon_uthros_exile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mmmenon_uthros_exile.txt rename to forge-gui/res/cardsfolder/m/mmmenon_uthros_exile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt b/forge-gui/res/cardsfolder/m/molecular_modifier.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/molecular_modifier.txt rename to forge-gui/res/cardsfolder/m/molecular_modifier.txt diff --git a/forge-gui/res/cardsfolder/upcoming/monoist_circuit_feeder.txt b/forge-gui/res/cardsfolder/m/monoist_circuit_feeder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/monoist_circuit_feeder.txt rename to forge-gui/res/cardsfolder/m/monoist_circuit_feeder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt b/forge-gui/res/cardsfolder/m/monoist_sentry.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/monoist_sentry.txt rename to forge-gui/res/cardsfolder/m/monoist_sentry.txt diff --git a/forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt b/forge-gui/res/cardsfolder/m/moonlit_meditation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/moonlit_meditation.txt rename to forge-gui/res/cardsfolder/m/moonlit_meditation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mouth_of_the_storm.txt b/forge-gui/res/cardsfolder/m/mouth_of_the_storm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mouth_of_the_storm.txt rename to forge-gui/res/cardsfolder/m/mouth_of_the_storm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt b/forge-gui/res/cardsfolder/m/moxite_refinery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/moxite_refinery.txt rename to forge-gui/res/cardsfolder/m/moxite_refinery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt b/forge-gui/res/cardsfolder/m/mutinous_massacre.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mutinous_massacre.txt rename to forge-gui/res/cardsfolder/m/mutinous_massacre.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt b/forge-gui/res/cardsfolder/n/nanoform_sentinel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nanoform_sentinel.txt rename to forge-gui/res/cardsfolder/n/nanoform_sentinel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt b/forge-gui/res/cardsfolder/n/nebula_dragon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nebula_dragon.txt rename to forge-gui/res/cardsfolder/n/nebula_dragon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt b/forge-gui/res/cardsfolder/n/nova_hellkite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nova_hellkite.txt rename to forge-gui/res/cardsfolder/n/nova_hellkite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nutrient_block.txt b/forge-gui/res/cardsfolder/n/nutrient_block.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nutrient_block.txt rename to forge-gui/res/cardsfolder/n/nutrient_block.txt diff --git a/forge-gui/res/cardsfolder/upcoming/oasis_of_renewal.txt b/forge-gui/res/cardsfolder/o/oasis_of_renewal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oasis_of_renewal.txt rename to forge-gui/res/cardsfolder/o/oasis_of_renewal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt b/forge-gui/res/cardsfolder/o/orbital_plunge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/orbital_plunge.txt rename to forge-gui/res/cardsfolder/o/orbital_plunge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt b/forge-gui/res/cardsfolder/o/oreplate_pangolin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oreplate_pangolin.txt rename to forge-gui/res/cardsfolder/o/oreplate_pangolin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ouroboroid.txt b/forge-gui/res/cardsfolder/o/ouroboroid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ouroboroid.txt rename to forge-gui/res/cardsfolder/o/ouroboroid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pain_for_all.txt b/forge-gui/res/cardsfolder/p/pain_for_all.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pain_for_all.txt rename to forge-gui/res/cardsfolder/p/pain_for_all.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pampered_loamfrill.txt b/forge-gui/res/cardsfolder/p/pampered_loamfrill.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pampered_loamfrill.txt rename to forge-gui/res/cardsfolder/p/pampered_loamfrill.txt diff --git a/forge-gui/res/cardsfolder/upcoming/patrolling_peacemaker.txt b/forge-gui/res/cardsfolder/p/patrolling_peacemaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/patrolling_peacemaker.txt rename to forge-gui/res/cardsfolder/p/patrolling_peacemaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pearl_lake_warden_nesting_instinct.txt b/forge-gui/res/cardsfolder/p/pearl_lake_warden_nesting_instinct.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pearl_lake_warden_nesting_instinct.txt rename to forge-gui/res/cardsfolder/p/pearl_lake_warden_nesting_instinct.txt diff --git a/forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt b/forge-gui/res/cardsfolder/p/perigee_beckoner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/perigee_beckoner.txt rename to forge-gui/res/cardsfolder/p/perigee_beckoner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt b/forge-gui/res/cardsfolder/p/pinnacle_emissary.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pinnacle_emissary.txt rename to forge-gui/res/cardsfolder/p/pinnacle_emissary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt b/forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pinnacle_kill_ship.txt rename to forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt b/forge-gui/res/cardsfolder/p/pinnacle_starcage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pinnacle_starcage.txt rename to forge-gui/res/cardsfolder/p/pinnacle_starcage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/planetary_annihilation.txt b/forge-gui/res/cardsfolder/p/planetary_annihilation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/planetary_annihilation.txt rename to forge-gui/res/cardsfolder/p/planetary_annihilation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/plasma_bolt.txt b/forge-gui/res/cardsfolder/p/plasma_bolt.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/plasma_bolt.txt rename to forge-gui/res/cardsfolder/p/plasma_bolt.txt diff --git a/forge-gui/res/cardsfolder/upcoming/possibility_technician.txt b/forge-gui/res/cardsfolder/p/possibility_technician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/possibility_technician.txt rename to forge-gui/res/cardsfolder/p/possibility_technician.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt b/forge-gui/res/cardsfolder/p/pull_through_the_weft.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pull_through_the_weft.txt rename to forge-gui/res/cardsfolder/p/pull_through_the_weft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pulsar_squadron_ace.txt b/forge-gui/res/cardsfolder/p/pulsar_squadron_ace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pulsar_squadron_ace.txt rename to forge-gui/res/cardsfolder/p/pulsar_squadron_ace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quantum_riddler.txt b/forge-gui/res/cardsfolder/q/quantum_riddler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quantum_riddler.txt rename to forge-gui/res/cardsfolder/q/quantum_riddler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_strike.txt b/forge-gui/res/cardsfolder/r/radiant_strike.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/radiant_strike.txt rename to forge-gui/res/cardsfolder/r/radiant_strike.txt diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_summit.txt b/forge-gui/res/cardsfolder/r/radiant_summit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/radiant_summit.txt rename to forge-gui/res/cardsfolder/r/radiant_summit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt b/forge-gui/res/cardsfolder/r/ragost_deft_gastronaut.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ragost_deft_gastronaut.txt rename to forge-gui/res/cardsfolder/r/ragost_deft_gastronaut.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rayblade_trooper.txt b/forge-gui/res/cardsfolder/r/rayblade_trooper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rayblade_trooper.txt rename to forge-gui/res/cardsfolder/r/rayblade_trooper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt b/forge-gui/res/cardsfolder/r/red_tiger_mechan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/red_tiger_mechan.txt rename to forge-gui/res/cardsfolder/r/red_tiger_mechan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/remnant_elemental.txt b/forge-gui/res/cardsfolder/r/remnant_elemental.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/remnant_elemental.txt rename to forge-gui/res/cardsfolder/r/remnant_elemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt b/forge-gui/res/cardsfolder/r/requiem_monolith.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/requiem_monolith.txt rename to forge-gui/res/cardsfolder/r/requiem_monolith.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reroute_systems.txt b/forge-gui/res/cardsfolder/r/reroute_systems.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reroute_systems.txt rename to forge-gui/res/cardsfolder/r/reroute_systems.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt b/forge-gui/res/cardsfolder/r/rescue_skiff.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rescue_skiff.txt rename to forge-gui/res/cardsfolder/r/rescue_skiff.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rig_for_war.txt b/forge-gui/res/cardsfolder/r/rig_for_war.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rig_for_war.txt rename to forge-gui/res/cardsfolder/r/rig_for_war.txt diff --git a/forge-gui/res/cardsfolder/upcoming/roving_actuator.txt b/forge-gui/res/cardsfolder/r/roving_actuator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/roving_actuator.txt rename to forge-gui/res/cardsfolder/r/roving_actuator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt b/forge-gui/res/cardsfolder/r/ruinous_rampage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ruinous_rampage.txt rename to forge-gui/res/cardsfolder/r/ruinous_rampage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rust_harvester.txt b/forge-gui/res/cardsfolder/r/rust_harvester.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rust_harvester.txt rename to forge-gui/res/cardsfolder/r/rust_harvester.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt b/forge-gui/res/cardsfolder/s/sami_ships_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sami_ships_engineer.txt rename to forge-gui/res/cardsfolder/s/sami_ships_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sami_wildcat_captain.txt b/forge-gui/res/cardsfolder/s/sami_wildcat_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sami_wildcat_captain.txt rename to forge-gui/res/cardsfolder/s/sami_wildcat_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/samis_curiosity.txt b/forge-gui/res/cardsfolder/s/samis_curiosity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/samis_curiosity.txt rename to forge-gui/res/cardsfolder/s/samis_curiosity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt b/forge-gui/res/cardsfolder/s/scour_for_scrap.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scour_for_scrap.txt rename to forge-gui/res/cardsfolder/s/scour_for_scrap.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt b/forge-gui/res/cardsfolder/s/scouring_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scouring_swarm.txt rename to forge-gui/res/cardsfolder/s/scouring_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt b/forge-gui/res/cardsfolder/s/scout_for_survivors.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scout_for_survivors.txt rename to forge-gui/res/cardsfolder/s/scout_for_survivors.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt b/forge-gui/res/cardsfolder/s/scrounge_for_eternity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scrounge_for_eternity.txt rename to forge-gui/res/cardsfolder/s/scrounge_for_eternity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seam_rip.txt b/forge-gui/res/cardsfolder/s/seam_rip.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seam_rip.txt rename to forge-gui/res/cardsfolder/s/seam_rip.txt diff --git a/forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt b/forge-gui/res/cardsfolder/s/secluded_starforge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/secluded_starforge.txt rename to forge-gui/res/cardsfolder/s/secluded_starforge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt b/forge-gui/res/cardsfolder/s/seedship_agrarian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seedship_agrarian.txt rename to forge-gui/res/cardsfolder/s/seedship_agrarian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seedship_broodtender.txt b/forge-gui/res/cardsfolder/s/seedship_broodtender.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seedship_broodtender.txt rename to forge-gui/res/cardsfolder/s/seedship_broodtender.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seedship_impact.txt b/forge-gui/res/cardsfolder/s/seedship_impact.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seedship_impact.txt rename to forge-gui/res/cardsfolder/s/seedship_impact.txt diff --git a/forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt b/forge-gui/res/cardsfolder/s/selfcraft_mechan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/selfcraft_mechan.txt rename to forge-gui/res/cardsfolder/s/selfcraft_mechan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt b/forge-gui/res/cardsfolder/s/shadow_the_hedgehog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shadow_the_hedgehog.txt rename to forge-gui/res/cardsfolder/s/shadow_the_hedgehog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shattered_wings.txt b/forge-gui/res/cardsfolder/s/shattered_wings.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shattered_wings.txt rename to forge-gui/res/cardsfolder/s/shattered_wings.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sibsigs_artisan.txt b/forge-gui/res/cardsfolder/s/sibsigs_artisan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sibsigs_artisan.txt rename to forge-gui/res/cardsfolder/s/sibsigs_artisan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt b/forge-gui/res/cardsfolder/s/singularity_rupture.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/singularity_rupture.txt rename to forge-gui/res/cardsfolder/s/singularity_rupture.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt b/forge-gui/res/cardsfolder/s/sinister_cryologist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sinister_cryologist.txt rename to forge-gui/res/cardsfolder/s/sinister_cryologist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skystinger.txt b/forge-gui/res/cardsfolder/s/skystinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skystinger.txt rename to forge-gui/res/cardsfolder/s/skystinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt b/forge-gui/res/cardsfolder/s/slagdrill_scrapper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/slagdrill_scrapper.txt rename to forge-gui/res/cardsfolder/s/slagdrill_scrapper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sledge_class_seedship.txt b/forge-gui/res/cardsfolder/s/sledge_class_seedship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sledge_class_seedship.txt rename to forge-gui/res/cardsfolder/s/sledge_class_seedship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/solar_array.txt b/forge-gui/res/cardsfolder/s/solar_array.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/solar_array.txt rename to forge-gui/res/cardsfolder/s/solar_array.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sonic_the_hedgehog.txt b/forge-gui/res/cardsfolder/s/sonic_the_hedgehog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sonic_the_hedgehog.txt rename to forge-gui/res/cardsfolder/s/sonic_the_hedgehog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sothera_the_supervoid.txt b/forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sothera_the_supervoid.txt rename to forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt b/forge-gui/res/cardsfolder/s/space_time_anomaly.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/space_time_anomaly.txt rename to forge-gui/res/cardsfolder/s/space_time_anomaly.txt diff --git a/forge-gui/res/cardsfolder/upcoming/specimen_freighter.txt b/forge-gui/res/cardsfolder/s/specimen_freighter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/specimen_freighter.txt rename to forge-gui/res/cardsfolder/s/specimen_freighter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt b/forge-gui/res/cardsfolder/s/squires_lightblade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/squires_lightblade.txt rename to forge-gui/res/cardsfolder/s/squires_lightblade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt b/forge-gui/res/cardsfolder/s/starbreach_whale.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starbreach_whale.txt rename to forge-gui/res/cardsfolder/s/starbreach_whale.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt b/forge-gui/res/cardsfolder/s/starfield_shepherd.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starfield_shepherd.txt rename to forge-gui/res/cardsfolder/s/starfield_shepherd.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt b/forge-gui/res/cardsfolder/s/starfield_vocalist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starfield_vocalist.txt rename to forge-gui/res/cardsfolder/s/starfield_vocalist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt b/forge-gui/res/cardsfolder/s/starfighter_pilot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starfighter_pilot.txt rename to forge-gui/res/cardsfolder/s/starfighter_pilot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starport_security.txt b/forge-gui/res/cardsfolder/s/starport_security.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starport_security.txt rename to forge-gui/res/cardsfolder/s/starport_security.txt diff --git a/forge-gui/res/cardsfolder/upcoming/starwinder.txt b/forge-gui/res/cardsfolder/s/starwinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/starwinder.txt rename to forge-gui/res/cardsfolder/s/starwinder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/station_monitor.txt b/forge-gui/res/cardsfolder/s/station_monitor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/station_monitor.txt rename to forge-gui/res/cardsfolder/s/station_monitor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt b/forge-gui/res/cardsfolder/s/steelswarm_operator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/steelswarm_operator.txt rename to forge-gui/res/cardsfolder/s/steelswarm_operator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stormforged_armor.txt b/forge-gui/res/cardsfolder/s/stormforged_armor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stormforged_armor.txt rename to forge-gui/res/cardsfolder/s/stormforged_armor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt b/forge-gui/res/cardsfolder/s/sunset_saboteur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunset_saboteur.txt rename to forge-gui/res/cardsfolder/s/sunset_saboteur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunstar_chaplain.txt b/forge-gui/res/cardsfolder/s/sunstar_chaplain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunstar_chaplain.txt rename to forge-gui/res/cardsfolder/s/sunstar_chaplain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunstar_expansionist.txt b/forge-gui/res/cardsfolder/s/sunstar_expansionist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunstar_expansionist.txt rename to forge-gui/res/cardsfolder/s/sunstar_expansionist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt b/forge-gui/res/cardsfolder/s/sunstar_lightsmith.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunstar_lightsmith.txt rename to forge-gui/res/cardsfolder/s/sunstar_lightsmith.txt diff --git a/forge-gui/res/cardsfolder/upcoming/super_state.txt b/forge-gui/res/cardsfolder/s/super_state.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/super_state.txt rename to forge-gui/res/cardsfolder/s/super_state.txt diff --git a/forge-gui/res/cardsfolder/upcoming/surge_conductor.txt b/forge-gui/res/cardsfolder/s/surge_conductor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/surge_conductor.txt rename to forge-gui/res/cardsfolder/s/surge_conductor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/survey_mechan.txt b/forge-gui/res/cardsfolder/s/survey_mechan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/survey_mechan.txt rename to forge-gui/res/cardsfolder/s/survey_mechan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/susur_secundi_void_altar.txt b/forge-gui/res/cardsfolder/s/susur_secundi_void_altar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/susur_secundi_void_altar.txt rename to forge-gui/res/cardsfolder/s/susur_secundi_void_altar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt b/forge-gui/res/cardsfolder/s/susurian_dirgecraft.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/susurian_dirgecraft.txt rename to forge-gui/res/cardsfolder/s/susurian_dirgecraft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt b/forge-gui/res/cardsfolder/s/susurian_voidborn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/susurian_voidborn.txt rename to forge-gui/res/cardsfolder/s/susurian_voidborn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/swarm_culler.txt b/forge-gui/res/cardsfolder/s/swarm_culler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/swarm_culler.txt rename to forge-gui/res/cardsfolder/s/swarm_culler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt b/forge-gui/res/cardsfolder/s/synthesizer_labship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/synthesizer_labship.txt rename to forge-gui/res/cardsfolder/s/synthesizer_labship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt b/forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/syr_vondam_sunstar_exemplar.txt rename to forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt b/forge-gui/res/cardsfolder/s/syr_vondam_the_lucent.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/syr_vondam_the_lucent.txt rename to forge-gui/res/cardsfolder/s/syr_vondam_the_lucent.txt diff --git a/forge-gui/res/cardsfolder/upcoming/systems_override.txt b/forge-gui/res/cardsfolder/s/systems_override.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/systems_override.txt rename to forge-gui/res/cardsfolder/s/systems_override.txt diff --git a/forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt b/forge-gui/res/cardsfolder/s/szarel_genesis_shepherd.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/szarel_genesis_shepherd.txt rename to forge-gui/res/cardsfolder/s/szarel_genesis_shepherd.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt b/forge-gui/res/cardsfolder/t/tannuk_memorial_ensign.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tannuk_memorial_ensign.txt rename to forge-gui/res/cardsfolder/t/tannuk_memorial_ensign.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt b/forge-gui/res/cardsfolder/t/tannuk_steadfast_second.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tannuk_steadfast_second.txt rename to forge-gui/res/cardsfolder/t/tannuk_steadfast_second.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tapestry_warden.txt b/forge-gui/res/cardsfolder/t/tapestry_warden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tapestry_warden.txt rename to forge-gui/res/cardsfolder/t/tapestry_warden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt b/forge-gui/res/cardsfolder/t/temporal_intervention.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/temporal_intervention.txt rename to forge-gui/res/cardsfolder/t/temporal_intervention.txt diff --git a/forge-gui/res/cardsfolder/upcoming/terminal_velocity.txt b/forge-gui/res/cardsfolder/t/terminal_velocity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/terminal_velocity.txt rename to forge-gui/res/cardsfolder/t/terminal_velocity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt b/forge-gui/res/cardsfolder/t/terrapact_intimidator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/terrapact_intimidator.txt rename to forge-gui/res/cardsfolder/t/terrapact_intimidator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/terrasymbiosis.txt b/forge-gui/res/cardsfolder/t/terrasymbiosis.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/terrasymbiosis.txt rename to forge-gui/res/cardsfolder/t/terrasymbiosis.txt diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt b/forge-gui/res/cardsfolder/t/territorial_bruntar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/territorial_bruntar.txt rename to forge-gui/res/cardsfolder/t/territorial_bruntar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_strike.txt b/forge-gui/res/cardsfolder/t/territorial_strike.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/territorial_strike.txt rename to forge-gui/res/cardsfolder/t/territorial_strike.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tezzeret_cruel_captain.txt b/forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tezzeret_cruel_captain.txt rename to forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt b/forge-gui/res/cardsfolder/t/thaumaton_torpedo.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thaumaton_torpedo.txt rename to forge-gui/res/cardsfolder/t/thaumaton_torpedo.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thawbringer.txt b/forge-gui/res/cardsfolder/t/thawbringer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thawbringer.txt rename to forge-gui/res/cardsfolder/t/thawbringer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_dominion_bracelet.txt b/forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_dominion_bracelet.txt rename to forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_endstone.txt b/forge-gui/res/cardsfolder/t/the_endstone.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_endstone.txt rename to forge-gui/res/cardsfolder/t/the_endstone.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_eternity_elevator.txt b/forge-gui/res/cardsfolder/t/the_eternity_elevator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_eternity_elevator.txt rename to forge-gui/res/cardsfolder/t/the_eternity_elevator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_seriema.txt b/forge-gui/res/cardsfolder/t/the_seriema.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_seriema.txt rename to forge-gui/res/cardsfolder/t/the_seriema.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thrumming_hivepool.txt b/forge-gui/res/cardsfolder/t/thrumming_hivepool.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thrumming_hivepool.txt rename to forge-gui/res/cardsfolder/t/thrumming_hivepool.txt diff --git a/forge-gui/res/cardsfolder/upcoming/timeline_culler.txt b/forge-gui/res/cardsfolder/t/timeline_culler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/timeline_culler.txt rename to forge-gui/res/cardsfolder/t/timeline_culler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tractor_beam.txt b/forge-gui/res/cardsfolder/t/tractor_beam.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tractor_beam.txt rename to forge-gui/res/cardsfolder/t/tractor_beam.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt b/forge-gui/res/cardsfolder/t/tragic_trajectory.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tragic_trajectory.txt rename to forge-gui/res/cardsfolder/t/tragic_trajectory.txt diff --git a/forge-gui/res/cardsfolder/upcoming/umbral_collar_zealot.txt b/forge-gui/res/cardsfolder/u/umbral_collar_zealot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/umbral_collar_zealot.txt rename to forge-gui/res/cardsfolder/u/umbral_collar_zealot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/unravel.txt b/forge-gui/res/cardsfolder/u/unravel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/unravel.txt rename to forge-gui/res/cardsfolder/u/unravel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/urenis_counsel.txt b/forge-gui/res/cardsfolder/u/urenis_counsel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/urenis_counsel.txt rename to forge-gui/res/cardsfolder/u/urenis_counsel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_psionicist.txt b/forge-gui/res/cardsfolder/u/uthros_psionicist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/uthros_psionicist.txt rename to forge-gui/res/cardsfolder/u/uthros_psionicist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt b/forge-gui/res/cardsfolder/u/uthros_research_craft.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/uthros_research_craft.txt rename to forge-gui/res/cardsfolder/u/uthros_research_craft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_scanship.txt b/forge-gui/res/cardsfolder/u/uthros_scanship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/uthros_scanship.txt rename to forge-gui/res/cardsfolder/u/uthros_scanship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt b/forge-gui/res/cardsfolder/u/uthros_titanic_godcore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/uthros_titanic_godcore.txt rename to forge-gui/res/cardsfolder/u/uthros_titanic_godcore.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt b/forge-gui/res/cardsfolder/v/vaultguard_trooper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vaultguard_trooper.txt rename to forge-gui/res/cardsfolder/v/vaultguard_trooper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vernal_fen.txt b/forge-gui/res/cardsfolder/v/vernal_fen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vernal_fen.txt rename to forge-gui/res/cardsfolder/v/vernal_fen.txt diff --git a/forge-gui/res/cardsfolder/upcoming/virulent_silencer.txt b/forge-gui/res/cardsfolder/v/virulent_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/virulent_silencer.txt rename to forge-gui/res/cardsfolder/v/virulent_silencer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt b/forge-gui/res/cardsfolder/v/voidforged_titan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/voidforged_titan.txt rename to forge-gui/res/cardsfolder/v/voidforged_titan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vote_out.txt b/forge-gui/res/cardsfolder/v/vote_out.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vote_out.txt rename to forge-gui/res/cardsfolder/v/vote_out.txt diff --git a/forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt b/forge-gui/res/cardsfolder/w/warmaker_gunship.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/warmaker_gunship.txt rename to forge-gui/res/cardsfolder/w/warmaker_gunship.txt diff --git a/forge-gui/res/cardsfolder/upcoming/waystones_guidance.txt b/forge-gui/res/cardsfolder/w/waystones_guidance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/waystones_guidance.txt rename to forge-gui/res/cardsfolder/w/waystones_guidance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt b/forge-gui/res/cardsfolder/w/weapons_manufacturing.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/weapons_manufacturing.txt rename to forge-gui/res/cardsfolder/w/weapons_manufacturing.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt b/forge-gui/res/cardsfolder/w/wedgelight_rammer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wedgelight_rammer.txt rename to forge-gui/res/cardsfolder/w/wedgelight_rammer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt b/forge-gui/res/cardsfolder/w/weftblade_enhancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/weftblade_enhancer.txt rename to forge-gui/res/cardsfolder/w/weftblade_enhancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt b/forge-gui/res/cardsfolder/w/weftstalker_ardent.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/weftstalker_ardent.txt rename to forge-gui/res/cardsfolder/w/weftstalker_ardent.txt diff --git a/forge-gui/res/cardsfolder/upcoming/weftwalking.txt b/forge-gui/res/cardsfolder/w/weftwalking.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/weftwalking.txt rename to forge-gui/res/cardsfolder/w/weftwalking.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt b/forge-gui/res/cardsfolder/w/wurmwall_sweeper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wurmwall_sweeper.txt rename to forge-gui/res/cardsfolder/w/wurmwall_sweeper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/xho_cai_flickering_talon.txt b/forge-gui/res/cardsfolder/x/xho_cai_flickering_talon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/xho_cai_flickering_talon.txt rename to forge-gui/res/cardsfolder/x/xho_cai_flickering_talon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/xu_ifit_osteoharmonist.txt b/forge-gui/res/cardsfolder/x/xu_ifit_osteoharmonist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/xu_ifit_osteoharmonist.txt rename to forge-gui/res/cardsfolder/x/xu_ifit_osteoharmonist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zealous_display.txt b/forge-gui/res/cardsfolder/z/zealous_display.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zealous_display.txt rename to forge-gui/res/cardsfolder/z/zealous_display.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zero_point_ballad.txt b/forge-gui/res/cardsfolder/z/zero_point_ballad.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zero_point_ballad.txt rename to forge-gui/res/cardsfolder/z/zero_point_ballad.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt b/forge-gui/res/cardsfolder/z/zookeeper_mechan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zookeeper_mechan.txt rename to forge-gui/res/cardsfolder/z/zookeeper_mechan.txt From a151dff3c5c4b9e7e8df82736e9e5b483d8f1447 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Sat, 19 Jul 2025 15:15:48 +0100 Subject: [PATCH 049/183] EOE Edition Sections --- forge-gui/res/editions/Edge of Eternities.txt | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index ab348e25437..a0cc09294a7 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -282,6 +282,8 @@ ScryfallCode=EOE 274 L Mountain @Julian Kok Joon Wen 275 L Forest @Sergey Glushakov 276 L Forest @Julian Kok Joon Wen + +[borderless] 277 M Adagia, Windswept Bastion @Piotr Dura 278 R Breeding Pool @Chris Ostrowski 279 M Evendo, Waking Haven @Piotr Dura @@ -322,6 +324,23 @@ ScryfallCode=EOE 314 R Mutinous Massacre @Jack Hughes 315 R Space-Time Anomaly @Princess Hidir 316 R Secluded Starforge @Jaime A. Zuverza +367 L Plains @Adam Paquette +368 L Island @Adam Paquette +369 L Swamp @Adam Paquette +370 L Mountain @Adam Paquette +371 L Forest @Adam Paquette +372 M Adagia, Windswept Bastion @Piotr Dura +373 R Breeding Pool @Chris Ostrowski +374 M Evendo, Waking Haven @Piotr Dura +375 R Godless Shrine @Chris Ostrowski +376 M Kavaron, Memorial World @Piotr Dura +377 R Sacred Foundry @Chris Ostrowski +378 R Stomping Ground @Chris Ostrowski +379 M Susur Secundi, Void Altar @Piotr Dura +380 M Uthros, Titanic Godcore @Piotr Dura +381 R Watery Grave @Chris Ostrowski + +[extended art] 317 R Anticausal Vestige @Chase Stone 318 M Exalted Sunborn @Scott M. Fischer 319 R Hardlight Containment @Dominik Mayer @@ -362,6 +381,8 @@ ScryfallCode=EOE 354 R The Eternity Elevator @Josu Solano 355 R Extinguisher Battleship @Danny Schwartz 356 R Thrumming Hivepool @Rob Rey + +[showcase] 357 M Anticausal Vestige @Nottsuo 358 M Exalted Sunborn @Makoron 359 M Starfield Vocalist @nina @@ -372,21 +393,6 @@ ScryfallCode=EOE 364 M The Dominion Bracelet @Mai Minamiura 365 M The Endstone @Hidetaka Tenjin 366 M Secluded Starforge @Makoto Yukimura -367 L Plains @Adam Paquette -368 L Island @Adam Paquette -369 L Swamp @Adam Paquette -370 L Mountain @Adam Paquette -371 L Forest @Adam Paquette -372 M Adagia, Windswept Bastion @Piotr Dura -373 R Breeding Pool @Chris Ostrowski -374 M Evendo, Waking Haven @Piotr Dura -375 R Godless Shrine @Chris Ostrowski -376 M Kavaron, Memorial World @Piotr Dura -377 R Sacred Foundry @Chris Ostrowski -378 R Stomping Ground @Chris Ostrowski -379 M Susur Secundi, Void Altar @Piotr Dura -380 M Uthros, Titanic Godcore @Piotr Dura -381 R Watery Grave @Chris Ostrowski 382 M Sothera, the Supervoid @Micha Huigen 383 M Anticausal Vestige @Nottsuo 384 M Exalted Sunborn @Makoron @@ -398,6 +404,8 @@ ScryfallCode=EOE 390 M The Dominion Bracelet @Mai Minamiura 391 M The Endstone @Hidetaka Tenjin 392 M Secluded Starforge @Makoto Yukimura + +[promo] 393 U Starfield Shepherd @Marta Nael 394 U Annul @Carlos Palma Cruchaga 395 U Umbral Collar Zealot @Dmitry Burmak From 14687460456286e57d98838edc980d3900f1de0f Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Sat, 19 Jul 2025 15:44:09 +0100 Subject: [PATCH 050/183] Quick cleanup: 2025-07-18, pass 3 (again) (#8124) --- forge-gui/res/cardsfolder/a/all_fates_stalker.txt | 2 +- forge-gui/res/cardsfolder/a/amy_rose.txt | 4 ++-- forge-gui/res/cardsfolder/a/archenemys_charm.txt | 2 +- forge-gui/res/cardsfolder/a/astelli_reclaimer.txt | 2 +- forge-gui/res/cardsfolder/b/biotech_specialist.txt | 2 +- forge-gui/res/cardsfolder/c/chorale_of_the_void.txt | 2 +- forge-gui/res/cardsfolder/c/cut_propulsion.txt | 2 +- forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt | 2 +- forge-gui/res/cardsfolder/d/depthshaker_titan.txt | 2 +- forge-gui/res/cardsfolder/d/drix_fatemaker.txt | 2 +- forge-gui/res/cardsfolder/f/fallers_faithful.txt | 2 +- forge-gui/res/cardsfolder/g/genemorph_imago.txt | 2 +- forge-gui/res/cardsfolder/h/honor.txt | 2 +- forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt | 2 +- forge-gui/res/cardsfolder/p/pain_for_all.txt | 2 +- forge-gui/res/cardsfolder/p/pampered_loamfrill.txt | 2 +- forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt | 2 +- forge-gui/res/cardsfolder/p/pull_through_the_weft.txt | 4 ++-- forge-gui/res/cardsfolder/s/scout_for_survivors.txt | 2 +- forge-gui/res/cardsfolder/s/secluded_starforge.txt | 2 +- forge-gui/res/cardsfolder/s/specimen_freighter.txt | 2 +- forge-gui/res/cardsfolder/s/survey_mechan.txt | 2 +- forge-gui/res/cardsfolder/s/synthesizer_labship.txt | 2 +- forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt | 2 +- forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt | 2 +- forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt | 2 +- forge-gui/res/cardsfolder/t/tragic_trajectory.txt | 2 +- forge-gui/res/cardsfolder/v/vote_out.txt | 2 +- 28 files changed, 30 insertions(+), 30 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/all_fates_stalker.txt b/forge-gui/res/cardsfolder/a/all_fates_stalker.txt index 8d77671c064..4e090884434 100644 --- a/forge-gui/res/cardsfolder/a/all_fates_stalker.txt +++ b/forge-gui/res/cardsfolder/a/all_fates_stalker.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Drix Assassin PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature enters, exile up to one target non-Assassin creature until this creature leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.nonAssassin | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target non-Assassin creature | Duration$ UntilHostLeavesPlay +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.nonAssassin | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target non-Assassin creature | Duration$ UntilHostLeavesPlay K:Warp:1 W SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE diff --git a/forge-gui/res/cardsfolder/a/amy_rose.txt b/forge-gui/res/cardsfolder/a/amy_rose.txt index ba2f0948565..78aa3362f1f 100644 --- a/forge-gui/res/cardsfolder/a/amy_rose.txt +++ b/forge-gui/res/cardsfolder/a/amy_rose.txt @@ -4,8 +4,8 @@ Types:Legendary Creature Hedgehog Warrior PT:3/3 K:Haste T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, attach up to one target Equipment to her. Then up to one other target attacking creature gets +X/+0 until end of turn, where X is CARDNAME's power. -SVar:TrigAttach:DB$ Attach | ValidTgts$ Equipment | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target equipment to attach to CARDNAME | Object$ ThisTargetedCard | Defined$ Self | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | ValidTgts$ Creature.attacking+Other | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select another target attacking creature. | NumAtt$ +X +SVar:TrigAttach:DB$ Attach | ValidTgts$ Equipment | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target Equipment to attach to CARDNAME | Object$ ThisTargetedCard | Defined$ Self | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.attacking+Other | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target attacking creature | NumAtt$ +X SVar:X:Count$CardPower SVar:HasAttackEffect:TRUE DeckHints:Type$Equipment diff --git a/forge-gui/res/cardsfolder/a/archenemys_charm.txt b/forge-gui/res/cardsfolder/a/archenemys_charm.txt index 220938dc06a..823fc581d97 100644 --- a/forge-gui/res/cardsfolder/a/archenemys_charm.txt +++ b/forge-gui/res/cardsfolder/a/archenemys_charm.txt @@ -3,7 +3,7 @@ ManaCost:B B B Types:Instant A:SP$ Charm | Choices$ DBExile,DBReturn,DBPutCounter SVar:DBExile:DB$ ChangeZone | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature or planeswalker. -SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Creature.YouOwn,Planeswalker.YouOwn | TgtPrompt$ Select target creature or planeswalker card in your graveyard | TargetMin$ 1 | TargetMax$ 2 | TgtZone$ Graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return one or two target creature and/or planeswalker cards from your graveyard to your hand. +SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Creature.YouOwn,Planeswalker.YouOwn | TgtPrompt$ Select one or two target creature and/or planeswalker cards in your graveyard | TargetMin$ 1 | TargetMax$ 2 | TgtZone$ Graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return one or two target creature and/or planeswalker cards from your graveyard to your hand. SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on target creature you control. It gains lifelink until end of turn. SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ Lifelink Oracle:Choose one —\n• Exile target creature or planeswalker.\n• Return one or two target creature and/or planeswalker cards from your graveyard to your hand.\n• Put two +1/+1 counters on target creature you control. It gains lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/a/astelli_reclaimer.txt b/forge-gui/res/cardsfolder/a/astelli_reclaimer.txt index c965912e7cf..f11a7143feb 100644 --- a/forge-gui/res/cardsfolder/a/astelli_reclaimer.txt +++ b/forge-gui/res/cardsfolder/a/astelli_reclaimer.txt @@ -4,7 +4,7 @@ Types:Creature Angel Warrior PT:5/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When this creature enters, return target noncreature, nonland permanent card with mana value X or less from your graveyard to the battlefield, where X is the amount of mana spent to cast this creature. -SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.nonCreature+nonLand+YouOwn+cmcLEX +SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.nonCreature+nonLand+YouOwn+cmcLEX | TgtPrompt$ Select target noncreature, nonland permanent card with mana value X or less in your graveyard K:Warp:2 W SVar:X:Count$CastTotalManaSpent Oracle:Flying\nWhen this creature enters, return target noncreature, nonland permanent card with mana value X or less from your graveyard to the battlefield, where X is the amount of mana spent to cast this creature.\nWarp {2}{W} diff --git a/forge-gui/res/cardsfolder/b/biotech_specialist.txt b/forge-gui/res/cardsfolder/b/biotech_specialist.txt index 41cec3a26ba..64a4fcac6fb 100644 --- a/forge-gui/res/cardsfolder/b/biotech_specialist.txt +++ b/forge-gui/res/cardsfolder/b/biotech_specialist.txt @@ -5,5 +5,5 @@ PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You T:Mode$ Sacrificed | ValidCard$ Artifact | ValidPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice an artifact, this creature deals 2 damage to target opponent. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 2 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Opponent | NumDmg$ 2 Oracle:When this creature enters, create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.")\nWhenever you sacrifice an artifact, this creature deals 2 damage to target opponent. diff --git a/forge-gui/res/cardsfolder/c/chorale_of_the_void.txt b/forge-gui/res/cardsfolder/c/chorale_of_the_void.txt index e0e868397a1..e8f3bb0b20e 100644 --- a/forge-gui/res/cardsfolder/c/chorale_of_the_void.txt +++ b/forge-gui/res/cardsfolder/c/chorale_of_the_void.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:Enchantment Aura K:Enchant:Creature.YouCtrl:creature you control T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature attacks, put target creature card from defending player's graveyard onto the battlefield under your control tapped and attacking. -SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.OwnedBy TriggeredDefendingPlayer | Tapped$ True | Attacking$ True | GainControl$ True +SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.OwnedBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature card in defending player's graveyard | Tapped$ True | Attacking$ True | GainControl$ True T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Void — At the beginning of your end step, sacrifice this Aura unless a nonland permanent left the battlefield this turn or a spell was warped this turn. SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | ConditionCheckSVar$ X S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddSVar$ AE diff --git a/forge-gui/res/cardsfolder/c/cut_propulsion.txt b/forge-gui/res/cardsfolder/c/cut_propulsion.txt index 492655bd797..5632f3f5276 100644 --- a/forge-gui/res/cardsfolder/c/cut_propulsion.txt +++ b/forge-gui/res/cardsfolder/c/cut_propulsion.txt @@ -1,7 +1,7 @@ Name:Cut Propulsion ManaCost:2 R Types:Instant -A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | DamageSource$ Targeted | SpellDescription$ Target creature deals damage to itself equal to its power. If that creature has flying, it deals twice that much damage to itself instead. +A:SP$ DealDamage | ValidTgts$ Creature | NumDmg$ X | DamageSource$ Targeted | SpellDescription$ Target creature deals damage to itself equal to its power. If that creature has flying, it deals twice that much damage to itself instead. SVar:X:Count$Compare W GE1.Y.Z SVar:Y:Targeted$CardPower/Times.2 SVar:Z:Targeted$CardPower diff --git a/forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt b/forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt index 24b2931dd41..58ac60cfe4b 100644 --- a/forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt +++ b/forge-gui/res/cardsfolder/d/dawnsire_sunstar_dreadnought.txt @@ -6,5 +6,5 @@ K:Station:20 S:Mode$ Continuous | Affected$ Card.Self+counters_GE10_CHARGE | AddTrigger$ AttackTrig | Description$ STATION 10+ Whenever you attack, NICKNAME deals 100 damage to up to one target creature or planeswalker. S:Mode$ Continuous | Affected$ Card.Self+counters_GE20_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 20+ Flying SVar:AttackTrig:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, NICKNAME deals 100 damage to up to one target creature or planeswalker. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 100 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target creature or planeswalker | NumDmg$ 100 Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 20+.)\nSTATION 10+\nWhenever you attack, Dawnsire deals 100 damage to up to one target creature or planeswalker.\nSTATION 20+\nFlying diff --git a/forge-gui/res/cardsfolder/d/depthshaker_titan.txt b/forge-gui/res/cardsfolder/d/depthshaker_titan.txt index 6ed9f972ea6..6bf3d50e122 100644 --- a/forge-gui/res/cardsfolder/d/depthshaker_titan.txt +++ b/forge-gui/res/cardsfolder/d/depthshaker_titan.txt @@ -3,7 +3,7 @@ ManaCost:5 R R Types:Artifact Creature Robot PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBAnimate | TriggerDescription$ When this creature enters, any number of target noncreature artifacts you control become 3/3 artifact creatures. Sacrifice them at the beginning of the next end step. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouControl | TgtPrompt$ Select target noncreature artifact you control | TargetMin$ 0 | TargetMax$ MaxTargets | Power$ 3 | Toughness$ 3 | Types$ Creature | AtEOT$ Sacrifice +SVar:DBAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouControl | TgtPrompt$ Select any number of target noncreature artifacts you control | TargetMin$ 0 | TargetMax$ MaxTargets | Power$ 3 | Toughness$ 3 | Types$ Creature | AtEOT$ Sacrifice S:Mode$ Continuous | Affected$ Creature.Artifact+YouCtrl | AddKeyword$ Melee & Trample & Haste | Description$ Each artifact creature you control has melee, trample, and haste. (Whenever a creature with melee attacks, it gets +1/+1 until end of turn for each opponent you attacked this combat.) SVar:MaxTargets:Count$Valid Artifact.nonCreature+YouCtrl DeckHints:Type$Artifact diff --git a/forge-gui/res/cardsfolder/d/drix_fatemaker.txt b/forge-gui/res/cardsfolder/d/drix_fatemaker.txt index e64b25e729e..7b9664384aa 100644 --- a/forge-gui/res/cardsfolder/d/drix_fatemaker.txt +++ b/forge-gui/res/cardsfolder/d/drix_fatemaker.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Drix Wizard PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature enters, put a +1/+1 counter on target creature. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. K:Warp:1 G SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/f/fallers_faithful.txt b/forge-gui/res/cardsfolder/f/fallers_faithful.txt index 4d098265461..695d097c85e 100644 --- a/forge-gui/res/cardsfolder/f/fallers_faithful.txt +++ b/forge-gui/res/cardsfolder/f/fallers_faithful.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Creature Human Wizard PT:3/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When this creature enters, destroy up to one other target creature. If that creature wasn't dealt damage this turn, its controller draws two cards. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Other | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDraw | TgtPrompt$ Select another target creature +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Other | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBDraw | TgtPrompt$ Select up to one other target creature SVar:DBDraw:DB$ Draw | NumCards$ 2 | Defined$ TargetedController | ConditionDefined$ Targeted | ConditionPresent$ Card.!wasDealtDamageThisTurn SVar:PlayMain1:TRUE Oracle:When this creature enters, destroy up to one other target creature. If that creature wasn't dealt damage this turn, its controller draws two cards. diff --git a/forge-gui/res/cardsfolder/g/genemorph_imago.txt b/forge-gui/res/cardsfolder/g/genemorph_imago.txt index eac601afde1..d4983876738 100644 --- a/forge-gui/res/cardsfolder/g/genemorph_imago.txt +++ b/forge-gui/res/cardsfolder/g/genemorph_imago.txt @@ -4,7 +4,7 @@ Types:Creature Insect Druid PT:1/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Landfall — Whenever a land you control enters, target creature has base power and toughness 3/3 until end of turn. If you control six or more lands, that creature has base power and toughness 6/6 until end of turn instead. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ Y | Toughness$ Y +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Creature | Power$ Y | Toughness$ Y SVar:X:Count$Valid Land.YouCtrl SVar:Y:Count$Compare X GE6.6.3 SVar:BuffedBy:Land diff --git a/forge-gui/res/cardsfolder/h/honor.txt b/forge-gui/res/cardsfolder/h/honor.txt index 53fe053bc4d..ea1c24f8d1d 100644 --- a/forge-gui/res/cardsfolder/h/honor.txt +++ b/forge-gui/res/cardsfolder/h/honor.txt @@ -1,6 +1,6 @@ Name:Honor ManaCost:W Types:Sorcery -A:SP$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw | SpellDescription$ Put a +1/+1 counter on target creature. Draw a card. +A:SP$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw | SpellDescription$ Put a +1/+1 counter on target creature. Draw a card. SVar:DBDraw:DB$ Draw Oracle:Put a +1/+1 counter on target creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt b/forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt index e30dabb662f..e853ab0e31d 100644 --- a/forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt +++ b/forge-gui/res/cardsfolder/i/inspirit_flagship_vessel.txt @@ -5,7 +5,7 @@ PT:5/5 K:Station:8 S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_CHARGE | AddTrigger$ CombatTrig | Description$ STATION 1+ At the beginning of combat on your turn, put your choice of a +1/+1 counter or two charge counters on up to one other target artifact. SVar:CombatTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, put your choice of a +1/+1 counter or two charge counters on up to one other target artifact. -SVar:TrigChoose:DB$ GenericChoice | ValidTgts$ Artifact.Other | TgtPrompt$ Select another target artifact | TargetMin$ 0 | TargetMax$ 1 | Choices$ P1P1Counter,ChargeCounters | ConditionDefined$ Targeted | ConditionPresent$ Card | Defined$ You +SVar:TrigChoose:DB$ GenericChoice | ValidTgts$ Artifact.Other | TgtPrompt$ Select up to one other target artifact | TargetMin$ 0 | TargetMax$ 1 | Choices$ P1P1Counter,ChargeCounters | ConditionDefined$ Targeted | ConditionPresent$ Card | Defined$ You SVar:P1P1Counter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target artifact. SVar:ChargeCounters:DB$ PutCounter | Defined$ Targeted | CounterType$ CHARGE | CounterNum$ 2 | SpellDescription$ Put two charge counters on target artifact. S:Mode$ Continuous | Affected$ Card.Self+counters_GE8_CHARGE | AddType$ Creature | AddKeyword$ Flying | AddStaticAbility$ DBStatic | Description$ STATION 8+ Flying,,,Other artifacts you control have hexproof and indestructible. diff --git a/forge-gui/res/cardsfolder/p/pain_for_all.txt b/forge-gui/res/cardsfolder/p/pain_for_all.txt index eb10d8e19eb..1413417d80f 100644 --- a/forge-gui/res/cardsfolder/p/pain_for_all.txt +++ b/forge-gui/res/cardsfolder/p/pain_for_all.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant:Creature.YouCtrl:creature you control SVar:AttachAILogic:Pump T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this Aura enters, enchanted creature deals damage equal to its power to any other target. -SVar:TrigDamage:DB$ DealDamage | DamageSource$ Enchanted | ValidTgts$ Creature.!EnchantedBy,Player,Planeswalker.!EnchantedBy,Battle.!EnchantedBy | NumDmg$ X +SVar:TrigDamage:DB$ DealDamage | DamageSource$ Enchanted | ValidTgts$ Creature.!EnchantedBy,Player,Planeswalker.!EnchantedBy,Battle.!EnchantedBy | TgtPrompt$ Select any other target | NumDmg$ X T:Mode$ DamageDoneOnce | ValidTarget$ Card.AttachedBy | Execute$ TrigDamageAll | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature is dealt damage, it deals that much damage to each opponent. SVar:TrigDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | NumDmg$ Y | DamageSource$ TriggeredTargetLKICopy SVar:X:Enchanted$CardPower diff --git a/forge-gui/res/cardsfolder/p/pampered_loamfrill.txt b/forge-gui/res/cardsfolder/p/pampered_loamfrill.txt index ea6a552e1c9..03d4d44a4bb 100644 --- a/forge-gui/res/cardsfolder/p/pampered_loamfrill.txt +++ b/forge-gui/res/cardsfolder/p/pampered_loamfrill.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Creature Lizard PT:1/1 K:Deathtouch -A:AB$ MakeCard | Cost$ 1 G ExileFromGrave<1/CARDNAME/this card> | PrecostDesc$ Renew — | Conjure$ True | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.Other+YouOwn | TgtZone$ Graveyard | DefinedName$ Targeted | Zone$ Library | LibraryPosition$ 0 | ActivationZone$ Graveyard | SorcerySpeed$ True | RememberMade$ True | SubAbility$ DBPump | SpellDescription$ Conjure a duplicate of another target creature card in your graveyard onto the top of your library. The duplicate perpetually gets +1/+1 and gains deathtouch. Activate only as a sorcery. +A:AB$ MakeCard | Cost$ 1 G ExileFromGrave<1/CARDNAME/this card> | PrecostDesc$ Renew — | Conjure$ True | TgtPrompt$ Select another target creature card in your graveyard | ValidTgts$ Creature.Other+YouOwn | TgtZone$ Graveyard | DefinedName$ Targeted | Zone$ Library | LibraryPosition$ 0 | ActivationZone$ Graveyard | SorcerySpeed$ True | RememberMade$ True | SubAbility$ DBPump | SpellDescription$ Conjure a duplicate of another target creature card in your graveyard onto the top of your library. The duplicate perpetually gets +1/+1 and gains deathtouch. Activate only as a sorcery. SVar:DBPump:DB$ Pump | Defined$ Remembered | PumpZone$ Library | KW$ Deathtouch | NumAtt$ +1 | NumDef$ +1 | Duration$ Perpetual | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Deathtouch\nRenew — {1}{G}, Exile this card from your graveyard: Conjure a duplicate of another target creature card in your graveyard onto the top of your library. The duplicate perpetually gets +1/+1 and gains deathtouch. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt b/forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt index a3a2ccd2975..50fba8903cb 100644 --- a/forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt +++ b/forge-gui/res/cardsfolder/p/pinnacle_kill_ship.txt @@ -3,7 +3,7 @@ ManaCost:7 Types:Artifact Spacecraft PT:7/7 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this Spacecraft enters, it deals 10 damage to up to one target creature. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1 | NumDmg$ 10 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | NumDmg$ 10 K:Station:7 S:Mode$ Continuous | Affected$ Card.Self+counters_GE7_CHARGE | AddType$ Creature | AddKeyword$ Flying | Description$ STATION 7+ Flying Oracle:When this Spacecraft enters, it deals 10 damage to up to one target creature.\nStation (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 7+.)\nSTATION 7+\nFlying diff --git a/forge-gui/res/cardsfolder/p/pull_through_the_weft.txt b/forge-gui/res/cardsfolder/p/pull_through_the_weft.txt index 2b67223ce2c..20d660d3c88 100644 --- a/forge-gui/res/cardsfolder/p/pull_through_the_weft.txt +++ b/forge-gui/res/cardsfolder/p/pull_through_the_weft.txt @@ -1,7 +1,7 @@ Name:Pull Through the Weft ManaCost:3 G G Types:Sorcery -A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand+YouOwn | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target nonland permanent card in your graveyard | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBChangeZone | SpellDescription$ Return up to two target nonland permanent cards from your graveyard to your hand, then return up to two target land cards from your graveyard to the battlefield tapped. -SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Land.YouOwn | TgtPrompt$ Choose target land card in your graveyard | TargetMin$ 0 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True +A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand+YouOwn | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target nonland permanent cards in your graveyard | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBChangeZone | SpellDescription$ Return up to two target nonland permanent cards from your graveyard to your hand, then return up to two target land cards from your graveyard to the battlefield tapped. +SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Land.YouOwn | TgtPrompt$ Select up to two target land cards in your graveyard | TargetMin$ 0 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True DeckHints:Ability$Graveyard|Discard Oracle:Return up to two target nonland permanent cards from your graveyard to your hand, then return up to two target land cards from your graveyard to the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/s/scout_for_survivors.txt b/forge-gui/res/cardsfolder/s/scout_for_survivors.txt index 015e2b37d00..a05f4611336 100644 --- a/forge-gui/res/cardsfolder/s/scout_for_survivors.txt +++ b/forge-gui/res/cardsfolder/s/scout_for_survivors.txt @@ -1,7 +1,7 @@ Name:Scout for Survivors ManaCost:2 W Types:Sorcery -A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ 3 | MaxTotalTargetCMC$ 3 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select up to three target creature cards with total mana value 3 or less | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ 3 | MaxTotalTargetCMC$ 3 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select up to three target creature cards with total mana value 3 or less in your graveyard | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Targeted DeckHas:Ability$Counters|Graveyard Oracle:Return up to three target creature cards with total mana value 3 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of them. diff --git a/forge-gui/res/cardsfolder/s/secluded_starforge.txt b/forge-gui/res/cardsfolder/s/secluded_starforge.txt index dc76426177f..77bc2c43970 100644 --- a/forge-gui/res/cardsfolder/s/secluded_starforge.txt +++ b/forge-gui/res/cardsfolder/s/secluded_starforge.txt @@ -2,7 +2,7 @@ Name:Secluded Starforge ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Pump | Cost$ 2 T tapXType | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SorcerySpeed$ True | SpellDescription$ Target creature gets +X/+0 until end of turn. Activate only as a sorcery. +A:AB$ Pump | Cost$ 2 T tapXType | ValidTgts$ Creature | NumAtt$ +X | SorcerySpeed$ True | SpellDescription$ Target creature gets +X/+0 until end of turn. Activate only as a sorcery. A:AB$ Token | Cost$ 5 T | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | SpellDescription$ Create a 2/2 colorless Robot artifact creature token. SVar:X:Count$xPaid Oracle:{T}: Add {C}.\n{2}, {T}, Tap X untapped artifacts you control: Target creature gets +X/+0 until end of turn. Activate only as a sorcery.\n{5}, {T}: Create a 2/2 colorless Robot artifact creature token. diff --git a/forge-gui/res/cardsfolder/s/specimen_freighter.txt b/forge-gui/res/cardsfolder/s/specimen_freighter.txt index ff3f08d3a61..66328445bf3 100644 --- a/forge-gui/res/cardsfolder/s/specimen_freighter.txt +++ b/forge-gui/res/cardsfolder/s/specimen_freighter.txt @@ -4,7 +4,7 @@ Types:Artifact Spacecraft PT:4/7 K:Station:9 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this Spacecraft enters, return up to two target non-Spacecraft creatures to their owners' hands. -SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.nonSpacecraft | TgtPrompt$ Select target non-Spacecraft creature | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Hand +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.nonSpacecraft | TgtPrompt$ Select up to two target non-Spacecraft creatures | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Hand S:Mode$ Continuous | Affected$ Card.Self+counters_GE9_CHARGE | AddType$ Creature | AddKeyword$ Flying | AddTrigger$ AttackTrig | Description$ STATION 9+ Flying,,,Whenever this Spacecraft attacks, defending player mills four cards. SVar:AttackTrig:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever this Spacecraft attacks, defending player mills four cards. SVar:TrigMill:DB$ Mill | Defined$ TriggeredDefendingPlayer | NumCards$ 4 diff --git a/forge-gui/res/cardsfolder/s/survey_mechan.txt b/forge-gui/res/cardsfolder/s/survey_mechan.txt index 1af93e388f3..8d59eab4eed 100644 --- a/forge-gui/res/cardsfolder/s/survey_mechan.txt +++ b/forge-gui/res/cardsfolder/s/survey_mechan.txt @@ -5,7 +5,7 @@ PT:1/3 K:Flying K:Hexproof A:AB$ DealDamage | Cost$ 10 Sac<1/CARDNAME> | ValidTgts$ Any | NumDmg$ 3 | ReduceCost$ X | SubAbility$ DBDraw | SpellDescription$ It deals 3 damage to any target. Target player draws three cards and gains 3 life. This ability costs {X} less to activate, where X is the number of differently named lands you control. -A:SP$ Draw | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBGainLife +A:SP$ Draw | NumCards$ 3 | ValidTgts$ Player | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ ParentTarget | LifeAmount$ 3 SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield Oracle:Flying\nHexproof (This creature can't be the target of spells or abilities your opponents control.)\n{10}, Sacrifice this creature: It deals 3 damage to any target. Target player draws three cards and gains 3 life. This ability costs {X} less to activate, where X is the number of differently named lands you control. diff --git a/forge-gui/res/cardsfolder/s/synthesizer_labship.txt b/forge-gui/res/cardsfolder/s/synthesizer_labship.txt index 2bd6f2ae8c0..207b364a76a 100644 --- a/forge-gui/res/cardsfolder/s/synthesizer_labship.txt +++ b/forge-gui/res/cardsfolder/s/synthesizer_labship.txt @@ -5,7 +5,7 @@ PT:4/4 K:Station:9 S:Mode$ Continuous | Affected$ Card.Self+counters_GE2_CHARGE | AddTrigger$ CombatTrig | Description$ STATION 2+ At the beginning of combat on your turn, up to one other target artifact you control becomes an artifact creature with base power and toughness 2/2 and gains flying until end of turn. SVar:CombatTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, up to one other target artifact you control becomes an artifact creature with base power and toughness 2/2 and gains flying until end of turn. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.Other+YouCtrl | TgtPrompt$ Select another target artifact you control | TargetMin$ 0 | TargetMax$ 1 | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature | Keywords$ Flying +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.Other+YouCtrl | TgtPrompt$ Select up to one other target artifact you control | TargetMin$ 0 | TargetMax$ 1 | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature | Keywords$ Flying S:Mode$ Continuous | Affected$ Card.Self+counters_GE9_CHARGE | AddType$ Creature | AddKeyword$ Flying & Vigilance | Description$ STATION 9+ Flying, vigilance SVar:PlayMain1:TRUE Oracle:Station (Tap another creature you control: Put charge counters equal to its power on this Spacecraft. Station only as a sorcery. It's an artifact creature at 9+.)\nSTATION 2+\nAt the beginning of combat on your turn, up to one other target artifact you control becomes an artifact creature with base power and toughness 2/2 and gains flying until end of turn.\nSTATION 9+\nFlying, vigilance diff --git a/forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt b/forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt index 3a818d12212..f215e8de82b 100644 --- a/forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt +++ b/forge-gui/res/cardsfolder/s/syr_vondam_sunstar_exemplar.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard,Exile | Valid SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard,Exile | ValidCard$ Card.Self+powerGE4 | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When NICKNAME dies or is put into exile while its power is 4 or greater, destroy up to one target nonland permanent. -SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent +SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select up to one target nonland permanent DeckHas:Ability$Counters Oracle:Vigilance, menace\nWhenever another creature you control dies or is put into exile, put a +1/+1 counter on Syr Vondam and you gain 1 life.\nWhen Syr Vondam dies or is put into exile while its power is 4 or greater, destroy up to one target nonland permanent. diff --git a/forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt b/forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt index 5515f0d5479..66e3b3b42f9 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_cruel_captain.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Tezzeret Loyalty:4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter1 | TriggerDescription$ Whenever an artifact you control enters, put a loyalty counter on NICKNAME. SVar:TrigPutCounter1:DB$ PutCounter | CounterType$ LOYALTY -A:AB$ Untap | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact | SubAbility$ DBPutCounter | SpellDescription$ Untap target artifact or creature. If it's an artifact creature, put a +1/+1 counter on it. +A:AB$ Untap | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SubAbility$ DBPutCounter | SpellDescription$ Untap target artifact or creature. If it's an artifact creature, put a +1/+1 counter on it. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted.Artifact+Creature | CounterType$ P1P1 | CounterNum$ 1 A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.cmcLE1 | ChangeNum$ 1 | StackDescription$ SpellDescription | SpellDescription$ Search your library for an artifact card with mana value 1 or less, reveal it, put it into your hand, then shuffle. A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem — Tezzeret, Cruel Captain | Image$ emblem_tezzeret_cruel_captain | Duration$ Permanent | AILogic$ Always | Triggers$ EffPhase | SpellDescription$ You get an emblem with "At the beginning of combat on your turn, put three +1/+1 counters on target artifact you control. If it's not a creature, it becomes a 0/0 Robot artifact creature." diff --git a/forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt b/forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt index b90174a4460..f15f9ae93aa 100644 --- a/forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt +++ b/forge-gui/res/cardsfolder/t/the_dominion_bracelet.txt @@ -2,7 +2,7 @@ Name:The Dominion Bracelet ManaCost:2 Types:Legendary Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | AddAbility$ DominionControlPlayer | AddSVar$ DominionBraceletX | Description$ Equipped creature gets +1/+1 and has "{15}, Exile CARDNAME: You control target opponent during their next turn. This ability costs {X} less to activate, where X is this creature's power. Activate only as a sorcery." (You see all cards that player could see and make all decisions for them.) -SVar:DominionControlPlayer:AB$ ControlPlayer | Cost$ 15 Exile<1/OriginalHost/The Dominion Bracelet> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ReduceCost$ DominionBraceletX | SorcerySpeed$ True | SpellDescription$ You control target opponent during their next turn. This ability costs {X} less to activate, where X is this creature's power. Activate only as a sorcery. +SVar:DominionControlPlayer:AB$ ControlPlayer | Cost$ 15 Exile<1/OriginalHost/The Dominion Bracelet> | ValidTgts$ Opponent | ReduceCost$ DominionBraceletX | SorcerySpeed$ True | SpellDescription$ You control target opponent during their next turn. This ability costs {X} less to activate, where X is this creature's power. Activate only as a sorcery. K:Equip:1 SVar:DominionBraceletX:Count$CardPower Oracle:Equipped creature gets +1/+1 and has "{15}, Exile The Dominion Bracelet: You control target opponent during their next turn. This ability costs {X} less to activate, where X is this creature's power. Activate only as a sorcery." (You see all cards that player could see and make all decisions for them.)\nEquip {1} diff --git a/forge-gui/res/cardsfolder/t/tragic_trajectory.txt b/forge-gui/res/cardsfolder/t/tragic_trajectory.txt index d80da291443..dcdb1f3034e 100644 --- a/forge-gui/res/cardsfolder/t/tragic_trajectory.txt +++ b/forge-gui/res/cardsfolder/t/tragic_trajectory.txt @@ -1,6 +1,6 @@ Name:Tragic Trajectory ManaCost:B Types:Sorcery -A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. Void — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. Void — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. SVar:X:Count$Void.10.2 Oracle:Target creature gets -2/-2 until end of turn.\nVoid — That creature gets -10/-10 until end of turn instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. diff --git a/forge-gui/res/cardsfolder/v/vote_out.txt b/forge-gui/res/cardsfolder/v/vote_out.txt index 5106a7a2132..96b1387779f 100644 --- a/forge-gui/res/cardsfolder/v/vote_out.txt +++ b/forge-gui/res/cardsfolder/v/vote_out.txt @@ -2,5 +2,5 @@ Name:Vote Out ManaCost:3 B Types:Instant K:Convoke -A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +A:SP$ Destroy | ValidTgts$ Creature | SpellDescription$ Destroy target creature. Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nDestroy target creature. From dbed5052824dedc579a4275989cb9caedbee13fb Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Sat, 19 Jul 2025 21:18:24 +0100 Subject: [PATCH 051/183] Quick cleanup: 2025-07-19, pass 2 --- .../c_1_1_a_drone_flying_blockflying.txt | 14 +++++++------- forge-gui/res/tokenscripts/c_2_2_a_robot.txt | 10 +++++----- .../res/tokenscripts/c_a_lander_sac_search.txt | 10 +++++----- forge-gui/res/tokenscripts/munitions.txt | 12 ++++++------ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/forge-gui/res/tokenscripts/c_1_1_a_drone_flying_blockflying.txt b/forge-gui/res/tokenscripts/c_1_1_a_drone_flying_blockflying.txt index b66269d7552..0d6ddc5ed26 100644 --- a/forge-gui/res/tokenscripts/c_1_1_a_drone_flying_blockflying.txt +++ b/forge-gui/res/tokenscripts/c_1_1_a_drone_flying_blockflying.txt @@ -1,7 +1,7 @@ -Name:Drone Token -ManaCost:no cost -Types:Artifact Creature Drone -PT:1/1 -K:Flying -S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ This token can block only creatures with flying. -Oracle:Flying\nThis token can block only creatures with flying. \ No newline at end of file +Name:Drone Token +ManaCost:no cost +Types:Artifact Creature Drone +PT:1/1 +K:Flying +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ This token can block only creatures with flying. +Oracle:Flying\nThis token can block only creatures with flying. diff --git a/forge-gui/res/tokenscripts/c_2_2_a_robot.txt b/forge-gui/res/tokenscripts/c_2_2_a_robot.txt index 32da9108c85..10d2213f45e 100644 --- a/forge-gui/res/tokenscripts/c_2_2_a_robot.txt +++ b/forge-gui/res/tokenscripts/c_2_2_a_robot.txt @@ -1,5 +1,5 @@ -Name:Robot Token -ManaCost:no cost -Types:Artifact Creature Robot -PT:2/2 -Oracle: \ No newline at end of file +Name:Robot Token +ManaCost:no cost +Types:Artifact Creature Robot +PT:2/2 +Oracle: diff --git a/forge-gui/res/tokenscripts/c_a_lander_sac_search.txt b/forge-gui/res/tokenscripts/c_a_lander_sac_search.txt index 7a33d827744..a653f6ef453 100644 --- a/forge-gui/res/tokenscripts/c_a_lander_sac_search.txt +++ b/forge-gui/res/tokenscripts/c_a_lander_sac_search.txt @@ -1,5 +1,5 @@ -Name:Lander Token -ManaCost:no cost -Types:Artifact Lander -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. -Oracle:{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. \ No newline at end of file +Name:Lander Token +ManaCost:no cost +Types:Artifact Lander +A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. +Oracle:{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. diff --git a/forge-gui/res/tokenscripts/munitions.txt b/forge-gui/res/tokenscripts/munitions.txt index 777529e2bc2..8b987b3f7d3 100644 --- a/forge-gui/res/tokenscripts/munitions.txt +++ b/forge-gui/res/tokenscripts/munitions.txt @@ -1,6 +1,6 @@ -Name:Munitions -ManaCost:no cost -Types:Artifact -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this token leaves the battlefield, it deals 2 damage to any target. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 2 -Oracle:When this token leaves the battlefield, it deals 2 damage to any target. \ No newline at end of file +Name:Munitions +ManaCost:no cost +Types:Artifact +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When this token leaves the battlefield, it deals 2 damage to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 2 +Oracle:When this token leaves the battlefield, it deals 2 damage to any target. From ad8f3ea06ff06c8c27d976b9afe9d6ba9427f99b Mon Sep 17 00:00:00 2001 From: Eradev Date: Sat, 19 Jul 2025 21:54:47 -0400 Subject: [PATCH 052/183] Fix Lobelia --- forge-gui/res/cardsfolder/l/lobelia_sackville_baggins.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/l/lobelia_sackville_baggins.txt b/forge-gui/res/cardsfolder/l/lobelia_sackville_baggins.txt index e62be835514..326709f78a0 100644 --- a/forge-gui/res/cardsfolder/l/lobelia_sackville_baggins.txt +++ b/forge-gui/res/cardsfolder/l/lobelia_sackville_baggins.txt @@ -1,6 +1,6 @@ Name:Lobelia Sackville-Baggins ManaCost:2 B -Types:Creature Halfling Citizen +Types:Legendary Creature Halfling Citizen PT:2/3 K:Flash K:Menace From b62434616accec741a4be9fcaa945a322d3f5843 Mon Sep 17 00:00:00 2001 From: lemtom Date: Sun, 20 Jul 2025 06:35:14 +0200 Subject: [PATCH 053/183] New 16x16 sprites and avatars for planeswalkers &c. (#8048) * New sprites that fit established aesthetic * Adjustments * Remove downscale + fix wrong pixel on Sorin --------- Co-authored-by: Agetian --- .../common/sprites/enemy/fey/xira.atlas | 21 +++++++++++----- .../common/sprites/enemy/fey/xira.png | Bin 16132 -> 977 bytes .../common/sprites/enemy/fiend/tibalt.atlas | 19 +++++++++++---- .../common/sprites/enemy/fiend/tibalt.png | Bin 11125 -> 942 bytes .../enemy/humanoid/human/shaman/garruk.atlas | 21 +++++++++++----- .../enemy/humanoid/human/shaman/garruk.png | Bin 1209 -> 1100 bytes .../enemy/humanoid/human/shaman/garruk2.atlas | 23 ++++++++++++------ .../enemy/humanoid/human/shaman/garruk2.png | Bin 1209 -> 1100 bytes .../enemy/humanoid/human/wizard/jace.atlas | 21 +++++++++++----- .../enemy/humanoid/human/wizard/jace.png | Bin 11727 -> 871 bytes .../enemy/humanoid/human/wizard/teferi.atlas | 21 +++++++++++----- .../enemy/humanoid/human/wizard/teferi.png | Bin 11423 -> 798 bytes .../sprites/enemy/humanoid/kor/nahiri.atlas | 21 +++++++++++----- .../sprites/enemy/humanoid/kor/nahiri.png | Bin 14544 -> 840 bytes .../enemy/humanoid/merfolk/kiora.atlas | 21 +++++++++++----- .../sprites/enemy/humanoid/merfolk/kiora.png | Bin 11944 -> 1200 bytes .../enemy/humanoid/minotaur/zedru.atlas | 21 +++++++++++----- .../sprites/enemy/humanoid/minotaur/zedru.png | Bin 13353 -> 1219 bytes .../common/sprites/enemy/undead/sorin.atlas | 19 +++++++++++---- .../common/sprites/enemy/undead/sorin.png | Bin 4889 -> 877 bytes .../res/adventure/common/world/enemies.json | 9 ------- 21 files changed, 149 insertions(+), 68 deletions(-) diff --git a/forge-gui/res/adventure/common/sprites/enemy/fey/xira.atlas b/forge-gui/res/adventure/common/sprites/enemy/fey/xira.atlas index 76e58ee1386..af7a82ec265 100644 --- a/forge-gui/res/adventure/common/sprites/enemy/fey/xira.atlas +++ b/forge-gui/res/adventure/common/sprites/enemy/fey/xira.atlas @@ -1,11 +1,20 @@ xira.png -size: 63,53 +size: 64,32 format: RGBA8888 filter: Nearest,Nearest repeat: none Avatar - xy: 14,4 - size: 32,32 -Idle - xy: 3,4 - size: 56, 46 \ No newline at end of file + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/enemy/fey/xira.png b/forge-gui/res/adventure/common/sprites/enemy/fey/xira.png index 6d859e999a4c9b9ad4038476f5f8720f4736c8a0..609404e576c361c2c92ad5220ae3738f8d3cf49b 100644 GIT binary patch literal 977 zcmV;?11|iDP)D13F1WK~!ko-B>Ye+dvflWGq!4 zl1|DJFmx1Ix)kCmlr)3q4uN)QLOK=P4#H$8L@phI@lOb3XcO>|xrBJhWJ8CPLb$0I z3Z47|+(v=xAV2wZIh|E06r=+o-RZu&?|pjj-kpr02|nh){#F~)wH@e6?fMw~K^J2V zJTk(zMgRi^E){y{54xybA8U<2yyyZ5jURKAqEyAo;YAnw0H$j@cf=s$>Fbw81cO3= z45Isk_iDhOkBGdW3?WcWda>@#pGQonp8%IH5nBgJu?8d+GJeG7bt;XZ1OmwJFP9H% zck3G`z>8bJ@mQyH9x&#if%LVVX8gU=jC(<;LtxznCST^yBNo=h^`Y=t001AF@eDv7 zATNOQ<*B~99gR_34{$uzX#`A8i@0y23nr$|j-RVf@k<^e-9Y}|gI+LF3Cr!Qxzrcu0_`Lj;JHh^-i~gV+xjKQx2}J^On+h+AeV_Qe{3`;HP9vC~ z@ams|Z%^D9c&2m`2_p$FlGhlK3!jyLMQm_9*0C)cPYpZjU|Tj)7*E6u6<#ErG)7kZ zees9mG2gaqep&^$Et~)9hj*&mmd$n8H29=((&87T^DOv^9E1B?;R5pbE5lOj3UA+q zsc~hqg`|N*Wp((K%@%%q`VD!Ew0PD0x%rFg*PCrF-j{dJ`SR|0q+q?-j+D)U*BS6X z=2zhip$UFk4KJ%^a#gBQkm^2^&G_Jb4vUYRCtrh%a&HR-v&4*&4Y_l{1$toXeA4H>NZJ-$&jaWf5G zOV}gT)7Yc9W801Jps4)1yRtX^|staJo00000NkvXXu0mjf5KFUC literal 16132 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 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.atlas index f25e6b07550..3067a73ce39 100644 --- a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.atlas +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.atlas @@ -1,11 +1,20 @@ garruk2.png -size: 42,42 +size: 64,32 format: RGBA8888 filter: Nearest,Nearest -repeat: none +repeat: none Avatar - xy: 3,0 - size: 32,32 -Idle - xy: 0,0 - size: 41, 42 \ No newline at end of file + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/shaman/garruk2.png index 7138f0fa6c6ff25dcce5305536ef6cc04c815c9a..2d9e55120728e3fb99c65f4c0f4ac04079953b9a 100644 GIT binary patch literal 1100 zcmV-S1he~zP)(^xB>_oNB=7(L1GPy+K~!ko-I!lUTUQ*%KR1=^ zPPaKKdix-iX^K)uVZB!t%LXOOt&A~n3LSkI%o!113I&S~1^)zO$Q;tH-~x3%4Pg)M zWScNDeCXCGS<mR2KyU;Wa+f7XCI@+@by_Y17NlZ;k?(Zczzk5H2bH4eW-#I4| zanau1E*2LT0jR2~GV}4dv9U1;3xyOvc}>#@27?%%&CSgKgu`J}RmJD?0a!`|Tm0k! zbMnT-6-7Z+RYIW<0KL7vxZQ4H83(xCZqeG>YX0&7m6eqMD2hTT6hc*16h%n@y+ zoM20p42Q!2M59quRV5mYV%10~fZ>2-L5#4HAe%ZM*#%QmQ+T~z>p9?=$Q)mv{*ZJ_ z!HCYzPRof<1klo0%h?$}Y!pEtL6lui9Zl2l`Fz}(^)oQ*XO~mAh5&UgjSq&pxY9Ff zZhuC+_uFaS6>p>Kx_KD#Y~(y1k98bi#I0FBuQj>W8%`a+a}vL2k~j8MGXKvG9HkHN zSFPt9r4Otn!0=EP-94iKv>iMMKv_)%%L_}C)l@J%_66PThZEXXh#fP5s{^YmvHnAP z1BdhmzWnwApPl)f+eH$!rR9{>Q~+>be?0)jJ4;wzSmL|iFEJCiI#BQe0PKv#`Y$fr z#1P@)!cFcz{Fk{uBOKUYPto2tv6b(^R=$Uaf6a66PK=gL7pp6={z4Z)daHi7(2AD< zSamirJk(`A?Cu%m+H{bX#@Ynv%Cpa#?@7gaK_7>uzJ`*7i_NOD$^3q8I*1`oav1M@ z{K;8MU5^VQWZ5pBCjZn1Aj@_k%XYC8o)fwBk%}+MW#BjFFSFb6vRGTYFFh$ zI{5tg9~c=qnXqQF9YDVLYz54gPbq+_Q4{xWe`Ed~79ZIRAYc5kqw8m`S6^=>UHy10 z-mr}<+l9F67lA;)Y`YpYk;+z2n$O1eIq|Y=7r*@Ul{h!?k&tD(=xZnu@f~LBpb&X! zv#sin*>h&@CFeWq7ou18@#D{z(%LUy{KWVm)sDK1_TMURONNt+)XLw>X7L(1)t9mG zl&jdR*a@)pBn{|>Q&ZK!(Q2hTmG{lOO S*mZ~i00003 literal 1209 zcmV;q1V;ObP)VJS_FNUl zrTwkCHcbBQ+GKe9_CDV_H8qVNZRZ56I=6T4ZZ|$Y5kVw%?M%99GFec8^@GM9-SNKz z2aj_Cbxx|Yb9H3+CdGK|R0oxK|ZD3nH@;j1J57XYcE@87)) zif-Dx!z;Yxpa?e|OQ`(HM}DUHYblESWH~)}A+?w8DrP#dvSp4cq^@!WEw-|d5*h_g zOjCqojV&+>n*~+p+omayy4cLv+gg=^AR^BKmym>8}LY(beru>Je)mp=F?&UpgCxRO?j5 zHM7s6kfUENdX+(8#DayQa9+HQgnT0$VABE>S<-P9C?Ru-)~SfTj-+Y2T=5o|NmW$lpqY!BLa39E9KmevLqLGlRjOMPETq6= zv!^27fu5VuvjwaX%t7W9rE&dO=IeAJLE(jfYJO*O+Z3;zPb(pRIg>J2OHDlxc${X^ zuPKuj49dKMDyl5Qub>FIMnfmMtf1+!*lKYR6o9%7AtK8P$}NP-FxOIGE*@)t#@J;8 zO|NnIx~F@f=B%nnCC@#aigK^G23AVHN}a@d-MSq;t XyiQo;d?D0?#np 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 TU&RnHfB+Q*P5BzxXTkpmfyIMX diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.atlas index a43259d98ed..3c95102b17e 100644 --- a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.atlas +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.atlas @@ -1,11 +1,20 @@ teferi.png -size: 57,51 +size: 64,32 format: RGBA8888 filter: Nearest,Nearest repeat: none Avatar - xy: 10,0 - size: 32,32 -Idle - xy: 1,1 - size: 50, 41 \ No newline at end of file + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/human/wizard/teferi.png index 51827a77459d1816bdf1ea54cc65229b6f8828b9..b5d9c644bcf23d0861f9958ac0e750f71f26affb 100644 GIT binary patch literal 798 zcmV+(1L6FMP)D0*6UNK~!ko?N~o(8c`Vko#@96 zq7f8}Bn21i>YyM+XrYiIv1I5FC`D3I3hmONP}8MkO18|w(qJ$hoQf7pAT$9fSGr_q z2I(Rckz702v0CWspdQ{`jQ7V3zW9UV?%uuMd*AoH_r5HD-N9jwA-I|I0p}j&>Z|8x9VfAPy+yLWmCE~?vFsOP(!EF!P6IhRlD|` zdmpfpYC&$hlxro`;xiE+9xJ8$$>zORDOx@+67O>vcF9d8O@|Zw_be-vEGr;m4?KY$CHG^$hSn zDRAWjGCL9~8_Ax6tuh{6KLG%|{SgB~_j(5ED?h^wGw=-}kr9cEXTER|c`JLfUl)8v zxBEvhJNY#5ul)ajv8k|?ZFe4@NMuG<(JtSt{El(wX1jb0Z~6#E&LWY>yy+uN;dBfD zhQ_eVw<|x0L>5?<*x)|6hTDzs2YrWmrBaEFb4ruqTa_P!iL44RJO+`-Uf#c}aE9M6 zi$4kZZ7VRm4T(hd+)-A_|mBCDm$}b)F z3;@sGE!YZCcKAl+*G7RgB9Rq~dx*#5Rs>M-EnuR2Bl0^miB|*N!}P) cfobFa2cb09O^kb~i_@% literal 11423 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 SD+^Ov0Bv=BwR#o%$o~W6)uO2Y diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.atlas index 215725ae7db..f6d6fbbd358 100644 --- a/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.atlas +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.atlas @@ -1,11 +1,20 @@ nahiri.png -size: 49,51 +size: 64,32 format: RGBA8888 filter: Nearest,Nearest repeat: none Avatar - xy: 7,15 - size: 23,18 -Idle - xy: 0,3 - size: 49, 47 \ No newline at end of file + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/kor/nahiri.png index b55c42110c10221fde41897d28589096161e0425..b5dd7388b036d89543b379a5487ef0e37a1d375e 100644 GIT binary patch literal 840 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 O0000#|2XZ{B_k#^Wx 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 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.atlas b/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.atlas index 48f22b992a5..b96cf39fd1d 100644 --- a/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.atlas +++ b/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.atlas @@ -1,11 +1,20 @@ zedru.png -size: 52,62 +size: 64,32 format: RGBA8888 filter: Nearest,Nearest repeat: none Avatar - xy: 5,10 - size: 32,32 -Idle - xy: 2,2 - size: 48, 56 \ No newline at end of file + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.png b/forge-gui/res/adventure/common/sprites/enemy/humanoid/minotaur/zedru.png index 708ea590e4a72d455fc566902a936b4656c1cdf6..75bfd25923da680de2431663f56f4cc56a78c57b 100644 GIT binary patch literal 1219 zcmV;!1U&nRP)(^xB>_oNB=7(L1T0BJK~!ko-I-r#TU8v#KR3i! zdY}!h-G-@j{o}e~?1~+hGOeQstvE}4NXHn+CXEjj>C=?0dl;h%ql^vNx)+fk6mfkC zoez_hQ8$MSHYuYrg~U#2M!Q)}i>I_{;P{~T?%v#+n&wV4`N8F$`@83R_}=gN{eI`1 zgk6COwZA>6gb)fq2%&ZbDwLBSlL;YIV{MJaSBT~T_~DoP>}#$?2%%0MJwPnEMl88z z^P9z}-trXvT7rTXAeLMM;AU)&lSdC2FQk;3E`n~l2>Qo|{ON)hz$>NHVxX!@pRjx= zpa9-F_$JFsivUEwyaqsETNNkn{Q7tA!WY5FX(5C0MKwh%(ar$4hi3n5fz`)(zK zQ1@P-IBI|%^5z#`?3a9cZV-SwH!c`HvyCUc6pa98d;h&&YMiW*=}0lf(BY^(vG=9#SkT%EdM0D8JwnD}bi6anetih!l%M`2!H-vB`8-oIwP z_l;K!5dcmsJXstmAcRnZ@4Rj}zrQlnTCHFJpvGzXt0Tiqz=2&k+qGn~&g)w1y5 zH$K03iFiB)z`pK1-1_b={f9$*eEJwYT`jiVVL{gb-O9@Z057&S0gzmhY!CLCdVIv- zKp%qxeMT)PWYf&W51=}*#gg~igMF4zH_v)erNCyat+|O}F%Q7v;ZR78;}~x7ZuuK3zSj1<%9is!Uy15$->sYm$;9eyCv0PFjcp9K_ z_5s&sexf5-hrgkYiRh%#LrGWvo7*$g2DUPrSg?hnzoCxH!*4%&j!ap`NX$Rv!|F64 z|IdtTUWVqZ;p`Tl4}Z&HsHgW;1`h4D2$CxSDWx_Mom2o_?K`M%e42^qq%9Xi{xsuB zFCl-Lp*gQ5XWiiQcE>@P-7O3fDw*GHY=PY^$Q{_ZmX}G&^QW$ecYl z_;{Se0Z$FAP=Cw zOUyrHHnG6aoYy9v8@wC-9w!2a#wrYOt_1Y3Q!8thOD6-+($)%q(>m@3?}oo8lYq9e zYPoVDAf?pa{a}>yrv?zQ5h7tpBrFlJ5zD4z`sVGdq3Z_kmcOB5?QflUP)KS3##oG=;A~u5d$9n$%FBBNw zCcybq1C-96%^ajZ*8vL+@5$Dwbp9-nu*`<*|0iE2K9yPxU;Xx0IF(ur{}=ddeYG4u h%*j64gfRbW{GYFGpQF;%#0>xd002ovPDHLkV1l=DK+OOE literal 13353 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 Da=wV> literal 4889 zcmeHKYg7~079LOmd8l|%ub{ot;2ZOPr{S4^L<}HrP?RB=gpni@k^utRswgcAND->2 zs8r-CRzZtiR1_4&_uFNyP$()DtO}*x3c7gQlYoHhcCEWy>-HbXn#{~Tdw*x|Z-3{k zoK1oLi|ni&tsw}qllY2*z?}-Nc~%zSS3@dx0Jlr2ArV9nk_>BgxB^q5Fp;7~Vbp*r zAjnX!4qQ6n0&LaW>hM{bc@%F;bc3AxW2dFp_M}ICYe*CKTD|OeXg1L@%tDh%ygK{$ zh{%Kpcs6a$!`i&Lzxf_%dcCf7_Hlbmv6s@ie-(@~XcI?tey@yNP2Xv8(x_y%1!!5fh05B_h%Lia;HOpXa*zUhtSv zw=&qzd%=VwaNVb(#P2gV^R_LRdfp3jIsR*m?)fwpeb#)+mbCcu=X2@~ZOE)Bn^2Yp zcbh$V*}T7vG`o*F|9D1c^T~g7w7a%9nR$J8E2M&Ic5o*u50)GYTyDRi+zQ@|Y_!iW zC_SLJNil3GU)|lEI;}ObskLv$hQ(Lq>jGx^(;AOvJlv$@kaxd!OV}7XJH5NmP+Md( z*bd2+5A*aYo*VDZAx2k0o zLiY1H>03RT>;C0_X9InzwkaIP*fJg;lr z^_ej(lI^xvb9-3ny6Fb@Vtj%5<7F{14_+Oq$hmI`2Sk$_AIfA7laWK{X&+DxE^3s@2qy5qiQq34jbH^rsQ}5U^0GL8u;2)X7lq zBveB! zL2kwoQ#m6O0pUZqA9%m7-Q*0sq*8$xmn9n0lZahO#`y(uT!zU7rbjxD!$K4?gv?OH za>*3 z$plYanF2LsBbNz$aGe?f?ZniG5~XT2O4ERmaDiu_#FfOL(1tC6Duhsg0I&uyjT}$b z4-bW4YBZQYjC|6$bPkuzV=?#~4vouX4?BgSIz7;$5tUA(Fj=M%V`BuM96&8%R4M>4 z*+De|kq$)&To;1lDp!&*DcBe}G%N)RN{$eS7$HyqN@K7DG`4`j31Kh=44Qz!bD=Q= zv=RQe98;wHFK^@WfrSH2_r>&J{uGmGU`++12?K8fuPV&6m|)nnECh&bpaeaVG}tbH zH83QLLo`Yh>>q=IeQ(G9L=1EWjmc-x6+j0ZAO<=eCC4HRE}6^YvKe%ggEBZW6AMG= zdR##yBRbSm33vot0fCyhg69pkYW|1*$#JN$4}dZX^~14;%*C0<2@7dU2F#QH4~L;c2Y(b)rez%pLz8>xpNo5{w@ z>|Wy+J-}#5NTlADZQ~rLILzEud-pyBnb%6ho*@wzUKL2=f;}D5YvQJrsW#b%PmSM2 zvEAqW%EuSW@*eAX)G1o=*lRf}YOROEv9X8JZbr@WYYdt6)4_`l&W^sh^ZG&@*+E|i z9sD*SG(4eGH=DVnub#;5(s6T;_A@CRh0NAlS($d5XYOu~J<(U<)pVkX&$(OsxPIRL z3L6ZvPIre|Ub`&ryK<-P^bRfO_q6T;)Eehwd z_^Ke^Jq?W|hwbsMm}5;RnwPZ1e_FbTQVDqk1XLyz3e(NTBefSjoKk`_s&3q>=DvAh z>)WQ;U!JbBD9k={GV5Yb&%~0M*4fi9H|{z;?p*V?z1G2KRC(n3WlnDwSJn7*IbOe> z0);K!d3I8@*|{Ho*>!2n^Jx~d-lZl#kE(p$k3d*hbP9bpBr7ro0~>u_g%>gj2!}anE!p zU~j~g>Z|}4+d`Xcm#3e&RZl#(BUssg8^6s|owdEP(=aJBvi)`Z-TDe!%R~N!dn9dB zqLHE*NH(%-RrOMf+NaZI2Y3e7_aQaESGO#=SD=i0*uz=f(dzPGea^~?OV)x!?!LHp z*D5=p!rSBp%*`(8)Y8?5?qAN~J-u|ec`wzY{J{|x7 diff --git a/forge-gui/res/adventure/common/world/enemies.json b/forge-gui/res/adventure/common/world/enemies.json index 588ee73db57..3d8cb56ca22 100644 --- a/forge-gui/res/adventure/common/world/enemies.json +++ b/forge-gui/res/adventure/common/world/enemies.json @@ -7701,7 +7701,6 @@ "spawnRate": 1, "difficulty": 0.1, "speed": 31, - "scale": 0.6, "life": 30, "rewards": [ { @@ -12158,7 +12157,6 @@ "spawnRate": 1, "difficulty": 1, "speed": 30, - "scale": 0.5, "life": 25, "rewards": [ { @@ -12249,7 +12247,6 @@ "spawnRate": 1, "difficulty": 1, "speed": 30, - "scale": 0.5, "life": 55, "rewards": [ { @@ -16899,7 +16896,6 @@ "spawnRate": 1, "difficulty": 0.1, "speed": 30, - "scale": 0.5, "life": 40, "rewards": [ { @@ -17223,7 +17219,6 @@ "spawnRate": 1, "difficulty": 0.8, "speed": 31, - "scale": 0.35, "life": 40, "rewards": [ { @@ -20629,7 +20624,6 @@ "spawnRate": 1, "difficulty": 0.1, "speed": 30, - "scale": 0.5, "life": 40, "rewards": [ { @@ -26394,7 +26388,6 @@ "spawnRate": 1, "difficulty": 0.8, "speed": 31, - "scale": 0.5, "life": 40, "rewards": [ { @@ -28701,7 +28694,6 @@ "spawnRate": 1, "difficulty": 0.8, "speed": 31, - "scale": 0.5, "life": 50, "rewards": [ { @@ -28888,7 +28880,6 @@ "spawnRate": 1, "difficulty": 0.1, "speed": 30, - "scale": 0.5, "life": 40, "rewards": [ { From 9dedc9ecfa64b87026b1a32465b33cc0cdf855e4 Mon Sep 17 00:00:00 2001 From: Chris Dietsch Date: Sat, 19 Jul 2025 21:35:23 -0700 Subject: [PATCH 054/183] Update ISSUES.txt (#8129) --- forge-gui/release-files/ISSUES.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/release-files/ISSUES.txt b/forge-gui/release-files/ISSUES.txt index 3755d9b8044..81c46389aa1 100644 --- a/forge-gui/release-files/ISSUES.txt +++ b/forge-gui/release-files/ISSUES.txt @@ -1,3 +1,3 @@ -Known issues are here: https://git.cardforge.org/core-developers/forge/issues +Known issues are here: https://github.com/Card-Forge/forge/issues -Feel free to report your own there if you have any. \ No newline at end of file +Feel free to report your own there if you have any. From 6caf02fc77cb9ffb1f26266b665e7357c6f4cf17 Mon Sep 17 00:00:00 2001 From: Eradev Date: Sun, 20 Jul 2025 00:36:17 -0400 Subject: [PATCH 055/183] Update Arena sets (#8000) * Update ANB * Add XANA * Update ANA * Add OANA * Update G18 --- forge-gui/res/editions/Arena Beginner Set.txt | 12 +-- .../Arena New Player Experience Cards.txt | 22 +++++ .../Arena New Player Experience Extras.txt | 28 ++++++ .../editions/Arena New Player Experience.txt | 85 ++++++++++--------- forge-gui/res/editions/M19 Gift Pack.txt | 3 +- 5 files changed, 104 insertions(+), 46 deletions(-) create mode 100644 forge-gui/res/editions/Arena New Player Experience Cards.txt create mode 100644 forge-gui/res/editions/Arena New Player Experience Extras.txt diff --git a/forge-gui/res/editions/Arena Beginner Set.txt b/forge-gui/res/editions/Arena Beginner Set.txt index 5908e27fa54..34336960e6d 100644 --- a/forge-gui/res/editions/Arena Beginner Set.txt +++ b/forge-gui/res/editions/Arena Beginner Set.txt @@ -38,6 +38,7 @@ ScryfallCode=ANB 30 R Overflowing Insight @Lucas Graciano 31 R Riddlemaster Sphinx @Ryan Yee 32 C River's Favor @Lie Setiawan +32a C Shorecomber Crab @Chris Seaman 33 U Sleep @Chris Rahn 34 R Soulblade Djinn @Viktor Titov 35 C Sworn Guardian @Sara Winters @@ -62,6 +63,7 @@ ScryfallCode=ANB 54 R Nightmare @Vance Kovacs 55 C Nimble Pilferer @Lie Setiawan 56 C Raise Dead @Carl Critchlow +56b U Rise from the Grave @Kieran Yanner 57 C Sanitarium Skeleton @Kev Walker 58 C Savage Gorger @Antonio José Manzanedo 59 C Scathe Zombies @Kev Walker @@ -117,10 +119,10 @@ ScryfallCode=ANB 109 C Woodland Mystic @Uriah Voth 110 R World Shaper @Raymond Swanland 111 C Evolving Wilds @Steven Belledin -112 C Forest @Jonas De Ro -113 C Island @Titus Lunter -114 C Mountain @Richard Wright -115 C Plains @Nils Hamm -116 C Swamp @Adam Paquette +112 L Forest @Jonas De Ro +113 L Island @Titus Lunter +114 L Mountain @Richard Wright +115 L Plains @Nils Hamm +116 L Swamp @Adam Paquette 117 C Arcane Signet @Dan Murayama Scott 118 C Command Tower @Evan Shipard diff --git a/forge-gui/res/editions/Arena New Player Experience Cards.txt b/forge-gui/res/editions/Arena New Player Experience Cards.txt new file mode 100644 index 00000000000..e81688a5795 --- /dev/null +++ b/forge-gui/res/editions/Arena New Player Experience Cards.txt @@ -0,0 +1,22 @@ +[metadata] +Code=OANA +Date=2018-07-14 +Name=Arena New Player Experience Cards +Type=Online +ScryfallCode=OANA + +[cards] +1 U Angelic Reward @Denman Rooke +3 U Confront the Assault @J.P. Targete +4 R Inspiring Commander @Antonio José Manzanedo +5 C Knight's Pledge @Magali Villeneuve +8 C Sanctuary Cat @David Palumbo +9 U Serra Angel @Donato Giancola +10 C Shrine Keeper @Craig J Spearing +11 C Spiritual Guardian @J.P. Targete +12 C Tactical Advantage @Lie Setiawan +19 C River's Favor @Lie Setiawan +23 C Zephyr Gull @Antonio José Manzanedo +43 C Raging Goblin @Jakub Kasper +46 C Feral Roar @Jonathan Kuo +48 C Treetop Warden @Colin Boyer \ No newline at end of file diff --git a/forge-gui/res/editions/Arena New Player Experience Extras.txt b/forge-gui/res/editions/Arena New Player Experience Extras.txt new file mode 100644 index 00000000000..1d6fcd18813 --- /dev/null +++ b/forge-gui/res/editions/Arena New Player Experience Extras.txt @@ -0,0 +1,28 @@ +[metadata] +Code=XANA +Date=2018-07-14 +Name=Arena New Player Experience Extras +Type=Online +ScryfallCode=XANA + +[cards] +7 C Loxodon Line Breaker @Jesper Ejsing +13 C Take Vengeance @Randy Vargas +14 C Divination @Howard Lyon +16 M Overflowing Insight @Lucas Graciano +22 C Waterknot @Wayne Reynolds +25 U Ambition's Cost @Zezhou Chen +26 C Cruel Cut @Caio Monteiro +29 C Miasmic Mummy @E. M. Gist +31 C Nimble Pilferer @Lie Setiawan +34 U Rise from the Grave @Kieran Yanner +35 R Soulhunter Rakshasa @Caio Monteiro +37 U Doublecast @Even Amundsen +40 U Goblin Gang Leader @Jakub Kasper +45 U Volcanic Dragon @Chris Rahn +47 C Rumbling Baloth @Jesper Ejsing +51 L Plains @Nils Hamm +52 L Island @Titus Lunter +53 L Swamp @Adam Paquette +54 L Mountain @Richard Wright +55 L Forest @Jonas De Ro diff --git a/forge-gui/res/editions/Arena New Player Experience.txt b/forge-gui/res/editions/Arena New Player Experience.txt index 5a355a72e2b..afd178cfc7a 100644 --- a/forge-gui/res/editions/Arena New Player Experience.txt +++ b/forge-gui/res/editions/Arena New Player Experience.txt @@ -6,42 +6,49 @@ Type=Online ScryfallCode=ANA [cards] -1 U Angelic Reward -2 U Blinding Radiance -3 U Confront the Assault -4 R Inspiring Commander -5 C Knight's Pledge -7 C Loxodon Line Breaker -8 C Sanctuary Cat -9 U Serra Angel -10 C Shrine Keeper -11 C Spiritual Guardian -12 C Tactical Advantage -13 C Take Vengeance -14 C Divination -16 M Overflowing Insight -18 C Shorecomber Crab -19 C River's Favor -19 U Titanic Pelagosaur -22 C Waterknot -23 C Zephyr Gull -24 C Altar's Reap -25 U Ambition's Cost -26 C Cruel Cut -29 C Miasmic Mummy -31 C Nimble Pilferer -33 C Renegade Demon -34 U Rise from the Grave -35 R Soulhunter Rakshasa -36 R Chaos Maw -37 U Doublecast -39 U Goblin Bruiser -40 U Goblin Gang Leader -41 U Goblin Grenade -42 R Ogre Painbringer -43 C Raging Goblin -44 U Seismic Rupture -45 U Volcanic Dragon -46 C Feral Roar -47 C Rumbling Baloth -48 C Treetop Warden +1a L Plains @John Avon +2a L Plains @Rebecca Guay +3a L Island @John Avon +4a L Island @Rebecca Guay +5a L Swamp @John Avon +6 L Plains @Eric Peterson +6a L Swamp @Rebecca Guay +6b U Encroaching Wastes @Richard Wright +7 L Plains @Ben Thompson +7a L Mountain @John Avon +8 L Plains @Mike Ploog +8a L Mountain @Rebecca Guay +9 L Island @Ben Thompson +9a L Forest @John Avon +10 L Island @Eric Peterson +10a L Forest @Rebecca Guay +11 L Island @Ben Thompson +12 L Swamp @Kev Walker +13 L Swamp @Scott Bailey +14 L Swamp @Mike Ploog +15 L Mountain @Kev Walker +16 L Mountain @Scott Bailey +17 L Mountain @Eric Peterson +18 L Forest @Scott Bailey +19 L Forest @Kev Walker +20 L Forest @Mike Ploog +21 L Plains @Colin MacNeil +22 L Plains @Ron Spears +23 L Plains @Rebecca Guay +24 L Island @Rob Alexander +25 L Island @Bob Eggleton +26 L Island @Edward P. Beard, Jr. +27 L Swamp @Ron Spears +28 L Swamp @Ron Spears +29 L Swamp @Edward P. Beard, Jr. +30 L Mountain @Rebecca Guay +31 L Mountain @Heather Hudson +32 L Mountain @Edward P. Beard, Jr. +33 L Forest @Edward P. Beard, Jr. +34 L Forest @Christopher Rush +35 L Forest @Pete Venters +95846 C Snow-Covered Plains @Mark Romanoski +95847 C Snow-Covered Island @Franz Vohwinkel +95848 C Snow-Covered Swamp @Rob Alexander +95849 C Snow-Covered Mountain @John Zeleznik +95850 C Snow-Covered Forest @Jim Nelson diff --git a/forge-gui/res/editions/M19 Gift Pack.txt b/forge-gui/res/editions/M19 Gift Pack.txt index 1c27738ca22..94e052e628a 100644 --- a/forge-gui/res/editions/M19 Gift Pack.txt +++ b/forge-gui/res/editions/M19 Gift Pack.txt @@ -2,9 +2,8 @@ Code=G18 Date=2018-11-16 Name=M19 Gift Pack -Code2=G18 Type=Promo -ScryfallCode=g18 +ScryfallCode=G18 [cards] GP1 R Angelic Guardian @Sara Winters From 4f7dbfbc8077a50827643c05cba2c7ecf5a675e7 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Sun, 20 Jul 2025 05:36:45 +0100 Subject: [PATCH 056/183] Add files via upload (#8004) --- forge-gui/res/cardsfolder/a/astrologians_planisphere.txt | 2 +- forge-gui/res/cardsfolder/b/bards_bow.txt | 2 +- forge-gui/res/cardsfolder/b/blue_mages_cane.txt | 2 +- forge-gui/res/cardsfolder/d/dancers_chakrams.txt | 2 +- forge-gui/res/cardsfolder/d/dark_knights_greatsword.txt | 2 +- forge-gui/res/cardsfolder/m/machinists_arsenal.txt | 2 +- forge-gui/res/cardsfolder/n/ninjas_blades.txt | 2 +- forge-gui/res/cardsfolder/p/paladins_arms.txt | 2 +- forge-gui/res/cardsfolder/r/reapers_scythe.txt | 2 +- forge-gui/res/cardsfolder/s/sages_nouliths.txt | 2 +- forge-gui/res/cardsfolder/s/samurais_katana.txt | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/astrologians_planisphere.txt b/forge-gui/res/cardsfolder/a/astrologians_planisphere.txt index a37d943d799..48b2bbd4838 100644 --- a/forge-gui/res/cardsfolder/a/astrologians_planisphere.txt +++ b/forge-gui/res/cardsfolder/a/astrologians_planisphere.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddType$ Wizard | AddTrigge SVar:TrigSpellCast:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell and whenever you draw your third card each turn, put a +1/+1 counter on this creature. SVar:TrigDrawn:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 3 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever you cast a noncreature spell and whenever you draw your third card each turn, put a +1/+1 counter on this creature. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -K:Equip:2 +K:Equip:2:Flavor Diana DeckHas:Ability$Token & Type$Wizard Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature is a Wizard in addition to its other types and has "Whenever you cast a noncreature spell and whenever you draw your third card each turn, put a +1/+1 counter on this creature."\nDiana — Equip {2} diff --git a/forge-gui/res/cardsfolder/b/bards_bow.txt b/forge-gui/res/cardsfolder/b/bards_bow.txt index 6aee162d2cd..ffbbb15190e 100644 --- a/forge-gui/res/cardsfolder/b/bards_bow.txt +++ b/forge-gui/res/cardsfolder/b/bards_bow.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Artifact Equipment K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Reach | AddType$ Bard | Description$ Equipped creature gets +2/+2, has reach, and is a Bard in addition to its other types. -K:Equip:6 +K:Equip:6:Flavor Perseus's Bow DeckHas:Ability$Token & Type$Bard Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +2/+2, has reach, and is a Bard in addition to its other types.\nPerseus's Bow — Equip {6} ({6}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/b/blue_mages_cane.txt b/forge-gui/res/cardsfolder/b/blue_mages_cane.txt index 7af3818d0f6..8e2bb059176 100644 --- a/forge-gui/res/cardsfolder/b/blue_mages_cane.txt +++ b/forge-gui/res/cardsfolder/b/blue_mages_cane.txt @@ -7,7 +7,7 @@ SVar:TrigAttack:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield SVar:TrigExile:DB$ ChangeZone | DefinedPlayer$ You | TargetMin$ 0 | TargetMax$ 1 | Destination$ Exile | ChangeNum$ 1 | ValidTgts$ Instant,Sorcery | TargetsWithDefinedController$ TriggeredDefendingPlayer | TgtPrompt$ Select target instant or sorcery card from the defending player's graveyard | Origin$ Graveyard | RememberChanged$ True | SubAbility$ DBPlay SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ You | CopyCard$ True | ValidSA$ Spell | Optional$ True | PlayCost$ 3 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -K:Equip:2 +K:Equip:2:Flavor Spirit of the Whalaqee SVar:AE:SVar:HasAttackEffect:TRUE DeckHas:Type$Wizard Oracle:Job select\nEquipped creature gets +0/+2, is a Wizard in addition to its other types, and has "Whenever this creature attacks, exile up to one target instant or sorcery card from defending player's graveyard. If you do, copy it. You may cast the copy by paying {3} rather than paying its mana cost."\nSpirit of the Whalaqee — Equip {2} diff --git a/forge-gui/res/cardsfolder/d/dancers_chakrams.txt b/forge-gui/res/cardsfolder/d/dancers_chakrams.txt index 4261102a18e..1868c733b24 100644 --- a/forge-gui/res/cardsfolder/d/dancers_chakrams.txt +++ b/forge-gui/res/cardsfolder/d/dancers_chakrams.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Lifelink | AddType$ Performer | AddStaticAbility$ StaticPump | Description$ Equipped creature gets +2/+2, has lifelink and "Other commanders you control get +2/+2 and have lifelink," and is a Performer in addition to its other types. SVar:StaticPump:Mode$ Continuous | Affected$ Card.Other+IsCommander+YouCtrl | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Lifelink | Description$ Other commanders you control get +2/+2 and have lifelink. -K:Equip:3 +K:Equip:3:Flavor Krishna DeckHas:Ability$Token & Type$Performer Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +2/+2, has lifelink and "Other commanders you control get +2/+2 and have lifelink," and is a Performer in addition to its other types.\nKrishna — Equip {3} diff --git a/forge-gui/res/cardsfolder/d/dark_knights_greatsword.txt b/forge-gui/res/cardsfolder/d/dark_knights_greatsword.txt index f676e96b832..2c9a8c66b00 100644 --- a/forge-gui/res/cardsfolder/d/dark_knights_greatsword.txt +++ b/forge-gui/res/cardsfolder/d/dark_knights_greatsword.txt @@ -2,7 +2,7 @@ Name:Dark Knight's Greatsword ManaCost:2 B Types:Artifact Equipment K:Job select -K:Equip:PayLife<3>:::ActivationLimit$ 1:Activate only once each turn +K:Equip:PayLife<3>:::ActivationLimit$ 1:Activate only once each turn:Flavor Chaosbringer S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddType$ Knight | Description$ Equipped creature gets +3/+0 and is a Knight in addition to its other types. DeckHas:Ability$Token & Type$Knight Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +3/+0 and is a Knight in addition to its other types.\nChaosbringer — Equip—Pay 3 life. Activate only once each turn. diff --git a/forge-gui/res/cardsfolder/m/machinists_arsenal.txt b/forge-gui/res/cardsfolder/m/machinists_arsenal.txt index 7fff62778be..71ceda046db 100644 --- a/forge-gui/res/cardsfolder/m/machinists_arsenal.txt +++ b/forge-gui/res/cardsfolder/m/machinists_arsenal.txt @@ -2,7 +2,7 @@ Name:Machinist's Arsenal ManaCost:4 W Types:Artifact Equipment K:Job select -K:Equip:4 +K:Equip:4:Flavor Machina S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ X | AddPower$ X | AddType$ Artificer | Description$ Equipped creature gets +2/+2 for each artifact you control and is an Artificer in addition to its other types. SVar:X:Count$Valid Artifact.YouCtrl/Times.2 DeckHints:Type$Artifact diff --git a/forge-gui/res/cardsfolder/n/ninjas_blades.txt b/forge-gui/res/cardsfolder/n/ninjas_blades.txt index 0f1a3deaee4..1f74c936a83 100644 --- a/forge-gui/res/cardsfolder/n/ninjas_blades.txt +++ b/forge-gui/res/cardsfolder/n/ninjas_blades.txt @@ -8,7 +8,7 @@ SVar:TrigDraw:DB$ Draw | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -K:Equip:2 +K:Equip:2:Flavor Mutsunokami SVar:X:Remembered$CardManaCost DeckHas:Ability$Token & Type$Ninja Oracle:Job select\nEquipped creature gets +1/+1, is a Ninja in addition to its other types, and has "Whenever this creature deals combat damage to a player, draw a card, then discard a card. That player loses life equal to the discarded card's mana value."\nMutsunokami — Equip {2} diff --git a/forge-gui/res/cardsfolder/p/paladins_arms.txt b/forge-gui/res/cardsfolder/p/paladins_arms.txt index 4d590ed2d2c..021d239fdd5 100644 --- a/forge-gui/res/cardsfolder/p/paladins_arms.txt +++ b/forge-gui/res/cardsfolder/p/paladins_arms.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Artifact Equipment K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | AddKeyword$ Ward:1 | AddType$ Knight | Description$ Equipped creature gets +2/+1, has ward {1}, and is a Knight in addition to its other types. -K:Equip:4 +K:Equip:4:Flavor Lightbringer and Hero's Shield DeckHas:Ability$Token & Type$Knight Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +2/+1, has ward {1}, and is a Knight in addition to its other types.\nLightbringer and Hero's Shield — Equip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/r/reapers_scythe.txt b/forge-gui/res/cardsfolder/r/reapers_scythe.txt index 6ac073f969a..dfe3fa6a3f4 100644 --- a/forge-gui/res/cardsfolder/r/reapers_scythe.txt +++ b/forge-gui/res/cardsfolder/r/reapers_scythe.txt @@ -5,7 +5,7 @@ K:Job select T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a soul counter on this Equipment for each player who lost life this turn. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ SOUL | CounterNum$ X S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ Y | AddToughness$ Y | AddType$ Assassin | Description$ Equipped creature gets +1/+1 for each soul counter on this Equipment and is an Assassin in addition to its other types. -K:Equip:2 +K:Equip:2:Flavor Death Sickle SVar:X:PlayerCountPlayers$HasPropertyLostLifeThisTurn SVar:Y:Count$CardCounters.SOUL DeckHas:Ability$Token & Type$Assassin diff --git a/forge-gui/res/cardsfolder/s/sages_nouliths.txt b/forge-gui/res/cardsfolder/s/sages_nouliths.txt index 98e4e29ba27..09f90f441f9 100644 --- a/forge-gui/res/cardsfolder/s/sages_nouliths.txt +++ b/forge-gui/res/cardsfolder/s/sages_nouliths.txt @@ -5,7 +5,7 @@ K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddType$ Cleric | AddTrigger$ TrigAttack | AddSVar$ AE | Description$ Equipped creature gets +1/+0, has "Whenever this creature attacks, untap target attacking creature," and is a Cleric in addition to its other types. SVar:TrigAttack:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever this creature attacks, untap target attacking creature. SVar:TrigUntap:DB$ Untap | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature -K:Equip:3 +K:Equip:3:Flavor Hagneia SVar:AE:SVar:HasAttackEffect:TRUE DeckHas:Type$Cleric Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +1/+0, has "Whenever this creature attacks, untap target attacking creature," and is a Cleric in addition to its other types.\nHagneia — Equip {3} diff --git a/forge-gui/res/cardsfolder/s/samurais_katana.txt b/forge-gui/res/cardsfolder/s/samurais_katana.txt index 9feeb23ecde..8d75c46cb3e 100644 --- a/forge-gui/res/cardsfolder/s/samurais_katana.txt +++ b/forge-gui/res/cardsfolder/s/samurais_katana.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Artifact Equipment K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample & Haste | AddType$ Samurai | Description$ Equipped creature gets +2/+2, has trample and haste, and is a Samurai in addition to its other types. -K:Equip:5 +K:Equip:5:Flavor Murasame DeckHas:Ability$Token & Type$Samurai Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +2/+2, has trample and haste, and is a Samurai in addition to its other types.\nMurasame — Equip {5} From 0786403fff21db23e26665d1f85c08750c384bcf Mon Sep 17 00:00:00 2001 From: Eradev Date: Sun, 20 Jul 2025 00:37:04 -0400 Subject: [PATCH 057/183] Support code2 and alias in sheets (#8009) * LF * Support for Code2 and Aliases in sheets * Support for Code2 and Aliases in sheets * TryConvertingName * Revert changes * Update CardEdition.java * Wrong check --- .../src/main/java/forge/card/CardEdition.java | 3 +- .../src/main/java/forge/card/PrintSheet.java | 2 - .../item/generation/BoosterGenerator.java | 43 +++++++++++++++---- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 4171bee4547..8459d406615 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -843,7 +843,8 @@ public final class CardEdition implements Comparable { } private void initAliases(CardEdition E){ //Add the alias to the edition here, to ensure it's always done equally. String alias = E.getAlias(); - if (null != alias) aliasToEdition.put(alias, E); + if (null != alias) + aliasToEdition.put(alias, E); aliasToEdition.put(E.getCode2(), E); } @Override diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index aa8fcedbfaf..aa91bd79f42 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -14,7 +14,6 @@ import java.util.Collection; import java.util.List; import java.util.Map.Entry; - /** * TODO: Write javadoc for this type. * @@ -160,5 +159,4 @@ public class PrintSheet { } } - } diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java index c5821436714..13fb2339d2d 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java @@ -45,7 +45,7 @@ import java.util.function.Predicate; * @version $Id: BoosterGenerator.java 35014 2017-08-13 00:40:48Z Max mtg $ */ public class BoosterGenerator { - + private final static Map staticSheetsCorrespondance = new HashMap<>(); private final static Map cachedSheets = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); private static synchronized PrintSheet getPrintSheet(String key) { if (!cachedSheets.containsKey(key)) @@ -64,6 +64,28 @@ public class BoosterGenerator { return randomCard.getFoiled(); } + public static PrintSheet tryGetStaticSheet(String sheetName) { + if (staticSheetsCorrespondance.containsKey(sheetName)) { + return StaticData.instance().getPrintSheets().get(staticSheetsCorrespondance.get(sheetName)); + }; + + String passedEdition = sheetName.split(" ")[0]; + CardEdition realEdition = StaticData.instance().getEditions().get(passedEdition); + + if (realEdition.getCode().equals(passedEdition)) { + staticSheetsCorrespondance.put(sheetName, sheetName); + + return StaticData.instance().getPrintSheets().get(sheetName); + } + + String realEditionCode = realEdition.getCode(); + String alteredSheetName = sheetName.replaceFirst(passedEdition, realEditionCode); + + staticSheetsCorrespondance.put(sheetName, alteredSheetName); + + return StaticData.instance().getPrintSheets().get(alteredSheetName); + } + public static List getBoosterPack(SealedTemplate template) { if (template instanceof SealedTemplateWithSlots slots) { return BoosterGenerator.getBoosterPack(slots); @@ -359,7 +381,7 @@ public class BoosterGenerator { String sheetReplaceCardFromSheet = edition.getSheetReplaceCardFromSheet(); if (!sheetReplaceCardFromSheet.isEmpty()) { String[] split = sheetReplaceCardFromSheet.split("_"); - PrintSheet replaceThis = StaticData.instance().getPrintSheets().get(split[0]); + PrintSheet replaceThis = tryGetStaticSheet(split[0]); List candidates = Lists.newArrayList(); for (PaperCard p : result) { if (replaceThis.all().contains(p)) { @@ -373,7 +395,7 @@ public class BoosterGenerator { String sheetReplaceCardFromSheet2 = edition.getSheetReplaceCardFromSheet2(); if (!sheetReplaceCardFromSheet2.isEmpty()) { String[] split = sheetReplaceCardFromSheet2.split("_"); - PrintSheet replaceThis = StaticData.instance().getPrintSheets().get(split[0]); + PrintSheet replaceThis = tryGetStaticSheet(split[0]); List candidates = Lists.newArrayList(); for (PaperCard p : result) { if (replaceThis.all().contains(p)) { @@ -487,8 +509,9 @@ public class BoosterGenerator { for (Pair slot : template.getSlots()) { String slotType = slot.getLeft(); String setCode = template.getEdition(); - String sheetKey = StaticData.instance().getEditions().contains(setCode) ? slotType.trim() + " " + setCode - : slotType.trim(); + String sheetKey = StaticData.instance().getEditions().contains(setCode) + ? slotType.trim() + " " + setCode + : slotType.trim(); PrintSheet ps = getPrintSheet(sheetKey); List cardsInSlot = Lists.newArrayList(ps.toFlatList()); @@ -521,7 +544,7 @@ public class BoosterGenerator { * @param printSheetKey print sheet key from which take the replacement card */ public static void replaceCardFromExtraSheet(List booster, String printSheetKey) { - PrintSheet replacementSheet = StaticData.instance().getPrintSheets().get(printSheetKey); + PrintSheet replacementSheet = tryGetStaticSheet(printSheetKey); PaperCard toAdd = replacementSheet.random(1, false).get(0); BoosterGenerator.replaceCard(booster, toAdd); } @@ -593,7 +616,9 @@ public class BoosterGenerator { public static PrintSheet makeSheet(String sheetKey, Iterable src) { PrintSheet ps = new PrintSheet(sheetKey); String[] sKey = TextUtil.splitWithParenthesis(sheetKey, ' ', 2); - Predicate setPred = sKey.length > 1 ? PaperCardPredicates.printedInSets(sKey[1].split(" ")) : x1 -> true; + Predicate setPred = sKey.length > 1 + ? PaperCardPredicates.printedInSets(sKey[1].split(" ")) + : x1 -> true; List operators = new LinkedList<>(Arrays.asList(TextUtil.splitWithParenthesis(sKey[0], ':'))); Predicate extraPred = buildExtraPredicate(operators); @@ -609,7 +634,7 @@ public class BoosterGenerator { System.out.println("Parsing from main code: " + mainCode); String sheetName = StringUtils.strip(mainCode.substring(10), "()\" "); System.out.println("Attempting to lookup: " + sheetName); - src = StaticData.instance().getPrintSheets().get(sheetName).toFlatList(); + src = tryGetStaticSheet(sheetName).toFlatList(); setPred = x -> true; } else if (mainCode.startsWith("promo") || mainCode.startsWith("name")) { // get exactly the named cards, that's a tiny inlined print sheet @@ -735,7 +760,7 @@ public class BoosterGenerator { toAdd = PaperCardPredicates.printedInSets(sets); } else if (operator.startsWith("fromSheet(") && invert) { String sheetName = StringUtils.strip(operator.substring(9), "()\" "); - Set cards = Sets.newHashSet(StaticData.instance().getPrintSheets().get(sheetName).toFlatList()); + Set cards = Sets.newHashSet(tryGetStaticSheet(sheetName).toFlatList()); toAdd = cards::contains; } From 7ee0431a2f2cb3e4ff083e1975d4d4f9a47faf74 Mon Sep 17 00:00:00 2001 From: Eradev Date: Sat, 19 Jul 2025 21:48:09 -0400 Subject: [PATCH 058/183] Fix Territorial Bruntar --- forge-gui/res/cardsfolder/t/territorial_bruntar.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/territorial_bruntar.txt b/forge-gui/res/cardsfolder/t/territorial_bruntar.txt index 1563bf20510..5075c765310 100644 --- a/forge-gui/res/cardsfolder/t/territorial_bruntar.txt +++ b/forge-gui/res/cardsfolder/t/territorial_bruntar.txt @@ -3,7 +3,7 @@ ManaCost:4 R R Types:Creature Beast PT:6/6 K:Reach -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land you control enters, exile cards from the top of your library until you exile a nonland card. You may cast that card this turn. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ DBDigUntil | TriggerDescription$ Landfall — Whenever a land you control enters, exile cards from the top of your library until you exile a nonland card. You may cast that card this turn. SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.nonLand | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile SVar:Play:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card this turn. From 5fbd2f9552e842bfc2e579b1221f472f0b2321a0 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 19 Jul 2025 19:29:04 +0200 Subject: [PATCH 059/183] Devour: better keyword --- .../src/main/java/forge/game/card/Card.java | 4 +-- .../java/forge/game/card/CardFactoryUtil.java | 25 +++++++++++++------ .../main/java/forge/game/keyword/Devour.java | 14 +++++++++++ .../main/java/forge/game/keyword/Keyword.java | 2 +- .../keyword/KeywordWithAmountAndType.java | 18 ++++++++++--- forge-gui/res/cardsfolder/c/caprichrome.txt | 2 +- .../res/cardsfolder/f/famished_worldsire.txt | 2 +- .../res/cardsfolder/f/feasting_hobbit.txt | 2 +- .../cardsfolder/t/thromok_the_insatiable.txt | 2 +- 9 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/keyword/Devour.java diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 6339125663f..9749305e646 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2639,7 +2639,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr || keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing:") || keyword.startsWith("Afterlife") || keyword.startsWith("Hideaway") || keyword.startsWith("Toxic") || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") - || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { + || keyword.startsWith("Renown") || keyword.startsWith("Annihilator")) { final String[] k = keyword.split(":"); sbLong.append(k[0]).append(" ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Crew")) { @@ -2751,7 +2751,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr || keyword.startsWith("Specialize") || keyword.equals("Ravenous") || keyword.equals("For Mirrodin") || keyword.equals("Job select") || keyword.startsWith("Craft") || keyword.startsWith("Landwalk") || keyword.startsWith("Visit") || keyword.startsWith("Mobilize") - || keyword.startsWith("Station") || keyword.startsWith("Warp")) { + || keyword.startsWith("Station") || keyword.startsWith("Warp") || keyword.startsWith("Devour")) { // keyword parsing takes care of adding a proper description } else if (keyword.equals("Read ahead")) { sb.append(Localizer.getInstance().getMessage("lblReadAhead")).append(" (").append(Localizer.getInstance().getMessage("lblReadAheadDesc")); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 6584abc0216..8893f73de05 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2250,14 +2250,25 @@ public class CardFactoryUtil { final String[] k = keyword.split(":"); final String magnitude = k[1]; String valid = "Creature"; - final String[] s = k[0].split(" "); - if (s.length > 1) { - valid = s[1].substring(0, 1).toUpperCase() + s[1].substring(1); + String type = "creature"; + StringBuilder sbDesc = new StringBuilder("Devour "); + if (k.length > 2 && !k[2].isEmpty()) { + valid = k[2]; + type = valid; + if (CardType.isACardType(type)) { + type = type.toLowerCase(Locale.ENGLISH); + } + sbDesc.append(type).append(" "); + } + sbDesc.append(magnitude); + if (k.length > 3) { + sbDesc.append(k[3]); } - String sacrificeStr = "DB$ Sacrifice | Defined$ You | Amount$ DevourSacX | SacValid$ " + valid + - ".Other | SacMessage$ another " + valid.toLowerCase() + " (Devour " + magnitude + - ") | RememberSacrificed$ True | Optional$ True"; + String sacrificeStr = "DB$ Sacrifice | Defined$ You | Amount$ DevourSacX | RememberSacrificed$ True | Optional$ True" + + " | SacValid$ " + valid + ".Other | SacMessage$ another " + type; + // TODO find better way to add Devour N to Player Msg + // Also better lblDoYouWantSacrifice? String counterStr = "DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ DevourX"; String cleanupStr = "DB$ Cleanup | ClearRemembered$ True"; @@ -2272,7 +2283,7 @@ public class CardFactoryUtil { AbilitySub cleanupSA = (AbilitySub) AbilityFactory.getAbility(cleanupStr, card); counterSA.setSubAbility(cleanupSA); - String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | ReplacementResult$ Updated | Description$ Devour " + magnitude + " ("+ inst.getReminderText() + ")"; + String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | Description$ " + sbDesc + " ("+ inst.getReminderText() + ")"; ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card); diff --git a/forge-game/src/main/java/forge/game/keyword/Devour.java b/forge-game/src/main/java/forge/game/keyword/Devour.java new file mode 100644 index 00000000000..0fb3c13072b --- /dev/null +++ b/forge-game/src/main/java/forge/game/keyword/Devour.java @@ -0,0 +1,14 @@ +package forge.game.keyword; + +import forge.card.CardType; + +public class Devour extends KeywordWithAmountAndType { + @Override + protected void parse(String details) { + super.parse(details); + String[] d = details.split(":"); + type = "creatures"; + if (d.length > 1 && !d[1].isEmpty()) + type = CardType.getPluralType(d[1]); + } +} diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 57fa2fa569c..f29b525b4de 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -52,7 +52,7 @@ public enum Keyword { DELVE("Delve", SimpleKeyword.class, true, "As an additional cost to cast this spell, you may exile any number of cards from your graveyard. Each card exiled this way reduces the cost to cast this spell by {1}."), DEMONSTRATE("Demonstrate", SimpleKeyword.class, false, "When you cast this spell, you may copy it. If you do, choose an opponent to also copy it. Players may choose new targets for their copies."), DETHRONE("Dethrone", SimpleKeyword.class, false, "Whenever this creature attacks the player with the most life or tied for the most life, put a +1/+1 counter on it."), - DEVOUR("Devour", KeywordWithAmount.class, false, "As this creature enters, you may sacrifice any number of creatures. This creature enters with {%d:+1/+1 counter} on it for each creature sacrificed this way."), + DEVOUR("Devour", Devour.class, false, "As this object enters, you may sacrifice any number of %2$s. This permanent enters with {%1$s:+1/+1 counter} on it for each permanent sacrificed this way."), DEVOID("Devoid", SimpleKeyword.class, true, "This card has no color."), DISGUISE("Disguise", KeywordWithCost.class, false, "You may cast this card face down for {3} as a 2/2 creature with ward {2}. Turn it face up any time for its disguise cost."), DISTURB("Disturb", KeywordWithCost.class, false, "You may cast this card from your graveyard transformed for its disturb cost."), diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmountAndType.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmountAndType.java index 54cf90e685d..652a30a994d 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmountAndType.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmountAndType.java @@ -3,8 +3,9 @@ package forge.game.keyword; import forge.util.TextUtil; public class KeywordWithAmountAndType extends KeywordInstance { - private int amount; - private String type; + protected int amount; + private boolean withX; + protected String type; @Override public int getAmount() { @@ -14,12 +15,21 @@ public class KeywordWithAmountAndType extends KeywordInstance 1) { + type = TextUtil.fastReplace(d[1], ",", " and/or "); + } } @Override protected String formatReminderText(String reminderText) { + if (withX) { + return String.format(reminderText.replaceAll("\\%(\\d+\\$)?d", "%$1s"), "X", type); + } return String.format(reminderText, amount, type); } } diff --git a/forge-gui/res/cardsfolder/c/caprichrome.txt b/forge-gui/res/cardsfolder/c/caprichrome.txt index 9d21b03b110..198fa767f0d 100644 --- a/forge-gui/res/cardsfolder/c/caprichrome.txt +++ b/forge-gui/res/cardsfolder/c/caprichrome.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Goat PT:2/2 K:Flash K:Vigilance -K:Devour artifact:1 +K:Devour:1:Artifact DeckHas:Ability$Counters DeckNeeds:Type$Artifact Oracle:Flash\nVigilance\nDevour artifact 1 (As this enters, you may sacrifice any number of artifacts. This creature enters with that many +1/+1 counters on it.) diff --git a/forge-gui/res/cardsfolder/f/famished_worldsire.txt b/forge-gui/res/cardsfolder/f/famished_worldsire.txt index d01baaf3e35..7218f8768b4 100644 --- a/forge-gui/res/cardsfolder/f/famished_worldsire.txt +++ b/forge-gui/res/cardsfolder/f/famished_worldsire.txt @@ -3,7 +3,7 @@ ManaCost:5 G G G Types:Creature Leviathan PT:0/0 K:Ward:3 -K:Devour land:3 +K:Devour:3:Land T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When this creature enters, look at the top X cards of your library, where X is this creature's power. Put any number of land cards from among them onto the battlefield tapped, then shuffle. SVar:TrigDig:DB$ Dig | DigNum$ X | AnyNumber$ True | ChangeValid$ Land | DestinationZone$ Battlefield | Tapped$ True | SkipReorder$ True | SubAbility$ DBShuffle SVar:DBShuffle:DB$ Shuffle | Defined$ You diff --git a/forge-gui/res/cardsfolder/f/feasting_hobbit.txt b/forge-gui/res/cardsfolder/f/feasting_hobbit.txt index aac15d8a56a..3f4717a753f 100644 --- a/forge-gui/res/cardsfolder/f/feasting_hobbit.txt +++ b/forge-gui/res/cardsfolder/f/feasting_hobbit.txt @@ -2,7 +2,7 @@ Name:Feasting Hobbit ManaCost:1 G Types:Creature Halfling Citizen PT:2/2 -K:Devour food:3 +K:Devour:3:Food S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTY | Description$ Creatures with power less than CARDNAME's power can't block it. SVar:Y:Count$CardPower DeckHas:Ability$Sacrifice|Counters diff --git a/forge-gui/res/cardsfolder/t/thromok_the_insatiable.txt b/forge-gui/res/cardsfolder/t/thromok_the_insatiable.txt index 060fe9536ca..a781ab876b7 100644 --- a/forge-gui/res/cardsfolder/t/thromok_the_insatiable.txt +++ b/forge-gui/res/cardsfolder/t/thromok_the_insatiable.txt @@ -2,7 +2,7 @@ Name:Thromok the Insatiable ManaCost:3 R G Types:Legendary Creature Hellion PT:0/0 -K:Devour:X:, where X is the number of creatures devoured this way +K:Devour:X::, where X is the number of creatures devoured this way SVar:X:Count$RememberedSize # Change the script in order to be compatible with Jund, each Devour ability will remember the sacrificed card separately. Remembered$Amount doesn't work Oracle:Devour X, where X is the number of creatures devoured this way (As this enters, you may sacrifice any number of creatures. This creature enters with X +1/+1 counters on it for each of those creatures.) From 31cca02d8de39f75f0551ef22d71f7ee34abb030 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 May 2025 09:12:35 -0400 Subject: [PATCH 060/183] Flavor for Equip --- .../main/java/forge/game/card/CardFactoryUtil.java | 14 ++++++++++++-- .../src/main/java/forge/game/keyword/Keyword.java | 3 +++ forge-gui/res/cardsfolder/d/dragoons_lance.txt | 2 +- forge-gui/res/cardsfolder/s/summoners_grimoire.txt | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 8893f73de05..1a4b9a935e2 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3004,6 +3004,14 @@ public class CardFactoryUtil { System.err.println("Malformed Equip entry! - Card: " + card.toString()); return; } + boolean hasFlav = false; + String flavor = ""; + // Flavor keyword titles should be last in the card script K: line + if (keyword.contains(":Flavor ")) { + flavor = (keyword.split(":Flavor ", 2)[1]) + (" — "); + keyword = keyword.substring(0, keyword.indexOf(":Flavor ")); + hasFlav = true; + } String[] k = keyword.split(":"); // Get cost string String equipCost = k[1]; @@ -3024,7 +3032,9 @@ public class CardFactoryUtil { if (card.hasSVar("AttachAi")) { abilityStr.append("| ").append(card.getSVar("AttachAi")); } - abilityStr.append(" | PrecostDesc$ Equip"); + abilityStr.append(" | PrecostDesc$ "); + if (hasFlav) abilityStr.append(flavor); + abilityStr.append("Equip"); if (k.length > 3 && !k[3].isEmpty()) { abilityStr.append(" ").append(vstr); } @@ -3041,7 +3051,7 @@ public class CardFactoryUtil { if (!extraDesc.isEmpty()) { abilityStr.append(". ").append(extraDesc).append(". "); } - if (!altCost) { + if (!altCost && !hasFlav) { abilityStr.append("(").append(inst.getReminderText()).append(")"); } if (!extra.isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index f29b525b4de..d4fae8aae7c 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -228,6 +228,9 @@ public enum Keyword { final String[] x = k.split(":", 2); keyword = smartValueOf(x[0]); details = x[1]; + // Flavor keyword titles should be last in the card script K: line + if (details.contains(":Flavor ")) details = details.substring(0, details.indexOf(":Flavor ")); + // Simply remove flavor here so it doesn't goof up parsing details } else if (k.contains(" ")) { // First strike keyword = smartValueOf(k); diff --git a/forge-gui/res/cardsfolder/d/dragoons_lance.txt b/forge-gui/res/cardsfolder/d/dragoons_lance.txt index da3189d5140..8e03ca91fd6 100644 --- a/forge-gui/res/cardsfolder/d/dragoons_lance.txt +++ b/forge-gui/res/cardsfolder/d/dragoons_lance.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Job select S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddType$ Knight | Description$ Equipped creature gets +1/+0 and is a Knight in addition to its other types. S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying | Condition$ PlayerTurn | Description$ During your turn, equipped creature has flying. -K:Equip:4 +K:Equip:4:Flavor Gae Bolg DeckHas:Ability$Token & Type$Knight Oracle:Job select (When this Equipment enters, create a 1/1 colorless Hero creature token, then attach this to it.)\nEquipped creature gets +1/+0 and is a Knight in addition to its other types.\nDuring your turn, equipped creature has flying.\nGae Bolg — Equip {4} diff --git a/forge-gui/res/cardsfolder/s/summoners_grimoire.txt b/forge-gui/res/cardsfolder/s/summoners_grimoire.txt index 393cadf7fe8..9c5eb3a31b3 100644 --- a/forge-gui/res/cardsfolder/s/summoners_grimoire.txt +++ b/forge-gui/res/cardsfolder/s/summoners_grimoire.txt @@ -8,7 +8,7 @@ SVar:TrigChoose:DB$ ChooseCard | Mandatory$ True | ChoiceZone$ Hand | Choices$ C SVar:DBChangeOne:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ChosenCard | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Enchantment | Tapped$ True | Attacking$ True | SubAbility$ DBChangeTwo SVar:DBChangeTwo:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ChosenCard | ConditionDefined$ ChosenCard | ConditionPresent$ Card.nonEnchantment | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -K:Equip:3 +K:Equip:3:Flavor Abraxas SVar:AE:SVar:HasAttackEffect:TRUE DeckHas:Ability$Token & Type$Shaman Oracle:Job select\nEquipped creature is a Shaman in addition to its other types and has "Whenever this creature attacks, you may put a creature card from your hand onto the battlefield. If that card is an enchantment card, it enters tapped and attacking."\nAbraxas — Equip {3} From 514d40aefdaca62d47b32b5a7fa1024203d06047 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sun, 20 Jul 2025 10:35:03 +0000 Subject: [PATCH 061/183] Consolidate some PlayEffect logic (#8133) * Fix potential GUI lock if game ends during RepeatEffect * Fix casting Feast of Blood from PlayEffect without creatures in play --- .../java/forge/game/ability/AbilityUtils.java | 19 ++++----------- .../ability/effects/ChangeZoneEffect.java | 4 ++++ .../game/ability/effects/RepeatEffect.java | 4 ++++ .../main/java/forge/game/player/Player.java | 24 +++++++++---------- .../spellability/SpellAbilityRestriction.java | 16 +++++++------ .../cardsfolder/a/alphinaud_leveilleur.txt | 2 +- .../res/cardsfolder/b/bonders_ornament.txt | 4 +--- 7 files changed, 35 insertions(+), 38 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 28f26ae520a..eea56d276ea 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3001,24 +3001,15 @@ public class AbilityUtils { for (SpellAbility s : list) { if (s.isLandAbility()) { s.setActivatingPlayer(controller); - // CR 305.3 - if (controller.getGame().getPhaseHandler().isPlayerTurn(controller) && controller.canPlayLand(tgtCard, true, s)) { + if (controller.canPlayLand(tgtCard, true, s)) { sas.add(s); } } else { final Spell newSA = (Spell) s.copy(controller); - SpellAbilityRestriction res = new SpellAbilityRestriction(); - // timing restrictions still apply - res.setPlayerTurn(s.getRestrictions().getPlayerTurn()); - res.setOpponentTurn(s.getRestrictions().getOpponentTurn()); - res.setPhases(s.getRestrictions().getPhases()); - res.setZone(null); - newSA.setRestrictions(res); - // timing restrictions still apply - if (res.checkTimingRestrictions(tgtCard, newSA) - // still need to check the other restrictions like Aftermath - && res.checkOtherRestrictions(tgtCard, newSA, controller)) { - newSA.setCastFromPlayEffect(true); + newSA.getRestrictions().setZone(null); + newSA.setCastFromPlayEffect(true); + // extra timing restrictions still apply + if (newSA.canPlay()) { sas.add(newSA); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 6944c6fdaf0..2af1066b637 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -916,6 +916,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { player = sa.getTargets().getFirstTargetedPlayer(); } + if (!player.isInGame()) { + continue; + } + List origin = Lists.newArrayList(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 4ccb9ca01d9..c6b4f79b956 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -66,6 +66,10 @@ public class RepeatEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); + if (game.isGameOver()) { + return false; + } + if (sa.hasParam("RepeatPresent")) { final String repeatPresent = sa.getParam("RepeatPresent"); String repeatCompare = sa.getParamOrDefault("RepeatCompare", "GE1"); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 16cc3e9c99f..cc07564aa34 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1705,22 +1705,16 @@ public class Player extends GameEntity implements Comparable { } public final boolean canPlayLand(final Card land, final boolean ignoreZoneAndTiming, SpellAbility landSa) { - if (!ignoreZoneAndTiming) { - // CR 305.3 - if (!game.getPhaseHandler().isPlayerTurn(this)) { - return false; - } - if (!canCastSorcery() && (landSa == null || !landSa.withFlash(land, this))) { - return false; - } - } - - // CantBeCast static abilities - if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { + // CR 305.3 + if (!game.getPhaseHandler().isPlayerTurn(this)) { return false; } - if (land != null && !ignoreZoneAndTiming) { + if (!ignoreZoneAndTiming) { + if (!canCastSorcery() && (landSa == null || !landSa.withFlash(land, this))) { + return false; + } + final boolean mayPlay = landSa == null ? !land.mayPlay(this).isEmpty() : landSa.getMayPlay() != null; if (land.getOwner() != this && !mayPlay) { return false; @@ -1732,6 +1726,10 @@ public class Player extends GameEntity implements Comparable { } } + if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { + return false; + } + // **** Check for land play limit per turn **** // Dev Mode if (getMaxLandPlaysInfinite()) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 3a425af9465..615d27406c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -353,6 +353,10 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { public final boolean checkActivatorRestrictions(final Card c, final SpellAbility sa) { Player activator = sa.getActivatingPlayer(); + if (sa.isCastFromPlayEffect()) { + return true; + } + if (sa.isSpell()) { // Spells should always default to "controller" but use mayPlay check. final CardPlayOption o = c.mayPlay(sa.getMayPlay()); @@ -615,14 +619,12 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { return false; } - if (!sa.isCastFromPlayEffect()) { - if (!checkTimingRestrictions(c, sa)) { - return false; - } + if (!checkActivatorRestrictions(c, sa)) { + return false; + } - if (!checkActivatorRestrictions(c, sa)) { - return false; - } + if (!checkTimingRestrictions(c, sa)) { + return false; } if (!checkZoneRestrictions(c, sa)) { diff --git a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt index bd923bbb42b..36f71d5faf1 100644 --- a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt +++ b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt @@ -1,7 +1,7 @@ Name:Alphinaud Leveilleur ManaCost:3 U Types:Legendary Creature Elf Wizard -PT:3/2 +PT:2/4 K:Partner:Alisaie Leveilleur K:Vigilance T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ2 | TriggerDescription$ Eukrasia — Whenever you cast your second spell each turn, draw a card. diff --git a/forge-gui/res/cardsfolder/b/bonders_ornament.txt b/forge-gui/res/cardsfolder/b/bonders_ornament.txt index 2c41a392166..3fa9ece22e5 100644 --- a/forge-gui/res/cardsfolder/b/bonders_ornament.txt +++ b/forge-gui/res/cardsfolder/b/bonders_ornament.txt @@ -2,7 +2,5 @@ Name:Bonder's Ornament ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -A:AB$ RepeatEach | Cost$ 4 T | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. -SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ Player.IsRemembered | ConditionCheckSVar$ OrnCheck | ConditionSVarCompare$ GE1 -SVar:OrnCheck:PlayerCountRemembered$Valid Permanent.namedBonder's Ornament+RememberedPlayerCtrl +A:AB$ Draw | Cost$ 4 T | Defined$ Player.controlsPermanent.namedBonder's Ornament | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. Oracle:{T}: Add one mana of any color.\n{4}, {T}: Each player who controls a permanent named Bonder's Ornament draws a card. From 83cd6b72914015e0434f8e494015c46bc163d7c0 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jul 2025 21:46:00 -0400 Subject: [PATCH 062/183] Update wheel_of_sun_and_moon.txt --- forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt b/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt index ff01482c374..979515b75d5 100644 --- a/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt +++ b/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt @@ -3,6 +3,6 @@ ManaCost:GW GW Types:Enchantment Aura K:Enchant:Player R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.!token+OwnedBy Player.EnchantedBy | ReplaceWith$ Reveal | Description$ If a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library. -SVar:Reveal:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Library | Defined$ ReplacedCard | LibraryPosition$ -1 | Reveal$ True +SVar:Reveal:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Library | Defined$ ReplacedCard | LibraryPosition$ -1 | Reveal$ True | Shuffle$ False AI:RemoveDeck:Random Oracle:Enchant player\nIf a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library. From 9d3605ee9603877c37c1dc84e7e2784c9a045be2 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 21 Jul 2025 04:22:40 +0000 Subject: [PATCH 063/183] RepeatEach refactoring (#8139) * RepeatEach cleanup * RepeatEach cleanup --------- Co-authored-by: tool4EvEr --- .../forge/game/ability/effects/RepeatEachEffect.java | 6 +----- forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt | 2 +- forge-gui/res/cardsfolder/c/consuming_tide.txt | 8 +++----- forge-gui/res/cardsfolder/c/crypt_champion.txt | 3 +-- forge-gui/res/cardsfolder/c/curfew.txt | 5 +---- forge-gui/res/cardsfolder/d/delirium_skeins.txt | 3 +-- forge-gui/res/cardsfolder/d/descent_into_madness.txt | 5 ++--- forge-gui/res/cardsfolder/e/enslaved_horror.txt | 5 ++--- forge-gui/res/cardsfolder/e/exhume.txt | 3 +-- forge-gui/res/cardsfolder/f/fall_of_the_thran.txt | 5 ++--- forge-gui/res/cardsfolder/f/fell_beasts_shriek.txt | 8 +++----- .../res/cardsfolder/g/gor_muldrak_amphinologist.txt | 5 ++--- forge-gui/res/cardsfolder/g/grime_gorger.txt | 2 +- .../res/cardsfolder/j/jace_architect_of_thought.txt | 3 +-- forge-gui/res/cardsfolder/k/king_narfis_betrayal.txt | 7 ++----- forge-gui/res/cardsfolder/m/mind_swords.txt | 3 +-- .../res/cardsfolder/o/only_i_know_what_awaits.txt | 2 +- forge-gui/res/cardsfolder/p/planar_overlay.txt | 10 ++-------- forge-gui/res/cardsfolder/p/portent_of_calamity.txt | 2 +- forge-gui/res/cardsfolder/s/sail_into_the_west.txt | 5 +---- forge-gui/res/cardsfolder/s/sculpted_sunburst.txt | 7 +++---- forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt | 7 ++----- forge-gui/res/cardsfolder/s/sporogenesis.txt | 3 +-- .../res/cardsfolder/s/summon_esper_valigarmanda.txt | 7 ++----- forge-gui/res/cardsfolder/t/the_three_seasons.txt | 5 ++--- forge-gui/res/cardsfolder/u/urzas_sylex.txt | 7 +++---- forge-gui/res/cardsfolder/v/virtuss_maneuver.txt | 7 ++----- forge-gui/res/cardsfolder/w/words_of_wind.txt | 6 ++---- forge-gui/res/cardsfolder/w/worldpurge.txt | 9 ++++----- forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt | 7 ++----- 30 files changed, 53 insertions(+), 104 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index 7bcc43680a3..c3be0c1369d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -137,12 +137,8 @@ public class RepeatEachEffect extends SpellAbilityEffect { final String[] workingCopy = def.split("_"); final String validFilter = workingCopy[1]; res = CardUtil.getThisTurnCast(validFilter, source, sa, activator); - } else if (def.startsWith("Defined ")) { - res = AbilityUtils.getDefinedCards(source, def.substring(8), sa); } else { - final ZoneType zone = sa.hasParam("TypesFromZone") ? - ZoneType.smartValueOf(sa.getParam("TypesFromZone")) : ZoneType.Battlefield; - res = CardLists.getValidCards(game.getCardsIn(zone), def, source.getController(), source, sa); + res = AbilityUtils.getDefinedCards(source, def, sa); } for (final Card c : res) { for (CardType.CoreType type : c.getType().getCoreTypes()) { diff --git a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt index 47d6f1db616..89e0b3bb4a1 100644 --- a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt +++ b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt @@ -8,7 +8,7 @@ K:Deathtouch K:Lifelink T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigReveal | TriggerDescription$ When CARDNAME enters, reveal the top ten cards of your library. For each card type, you may put a card of that type from among the revealed cards into your hand. Put the rest on the bottom of your library in a random order. (Artifact, battle, creature, enchantment, instant, kindred, land, planeswalker, and sorcery are card types.) SVar:TrigReveal:DB$ PeekAndReveal | PeekAmount$ 10 | Reveal$ True | ImprintRevealed$ True | SubAbility$ TrigRepeatTypes -SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.IsImprinted | TypesFromZone$ Library | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZone +SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ ValidLibrary Card.IsImprinted | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZone SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.ChosenType+YouOwn+IsImprinted | ChoiceZone$ Library | RememberChosen$ True SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Defined$ Remembered | SubAbility$ ShuffleRest SVar:ShuffleRest:DB$ ChangeZoneAll | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | ChangeType$ Card.IsImprinted+!IsRemembered | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/c/consuming_tide.txt b/forge-gui/res/cardsfolder/c/consuming_tide.txt index 55576b4b617..e2ba76191ae 100644 --- a/forge-gui/res/cardsfolder/c/consuming_tide.txt +++ b/forge-gui/res/cardsfolder/c/consuming_tide.txt @@ -1,11 +1,9 @@ Name:Consuming Tide ManaCost:2 U U Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseCard | SubAbility$ DBReturnAll | SpellDescription$ Each player chooses a nonland permanent they control. Return all nonland permanents not chosen this way to their owners' hands. Then you draw a card for each opponent who has more cards in their hand than you. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a nonland permanent you control | RememberChosen$ True -SVar:DBReturnAll:DB$ ChangeZoneAll | ChangeType$ Permanent.nonLand+IsNotRemembered | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | StackDescription$ None | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | Mandatory$ True | ControlledByPlayer$ Chooser | Choices$ Permanent.nonLand | ChoiceTitle$ Choose a nonland permanent you control | SubAbility$ DBReturnAll | SpellDescription$ Each player chooses a nonland permanent they control. Return all nonland permanents not chosen this way to their owners' hands. Then you draw a card for each opponent who has more cards in their hand than you. +SVar:DBReturnAll:DB$ ChangeZoneAll | ChangeType$ Permanent.nonLand+!ChosenCard | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | StackDescription$ None SVar:X:PlayerCountOpponents$HasPropertyHasCardsInHand_Card_GTY SVar:Y:Count$CardsInYourHand Oracle:Each player chooses a nonland permanent they control. Return all nonland permanents not chosen this way to their owners' hands. Then you draw a card for each opponent who has more cards in their hand than you. diff --git a/forge-gui/res/cardsfolder/c/crypt_champion.txt b/forge-gui/res/cardsfolder/c/crypt_champion.txt index 77769d7c685..44f583be803 100644 --- a/forge-gui/res/cardsfolder/c/crypt_champion.txt +++ b/forge-gui/res/cardsfolder/c/crypt_champion.txt @@ -5,8 +5,7 @@ PT:2/2 K:Double Strike T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters, each player puts a creature card with mana value 3 or less from their graveyard onto the battlefield. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | ManaNotSpent$ R | TriggerDescription$ When CARDNAME enters, sacrifice it unless {R} was spent to cast it. -SVar:TrigChangeZone:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl+cmcLE3 | ChangeNum$ 1 | Hidden$ True | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | Mandatory$ True +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.cmcLE3 | ChangeNum$ 1 | Hidden$ True | DefinedPlayer$ Player | Mandatory$ True SVar:TrigSac:DB$ Sacrifice SVar:ManaNeededToAvoidNegativeEffect:red Oracle:Double strike\nWhen Crypt Champion enters, each player puts a creature card with mana value 3 or less from their graveyard onto the battlefield.\nWhen Crypt Champion enters, sacrifice it unless {R} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/c/curfew.txt b/forge-gui/res/cardsfolder/c/curfew.txt index 63ab84f3b96..3b2ab549afb 100644 --- a/forge-gui/res/cardsfolder/c/curfew.txt +++ b/forge-gui/res/cardsfolder/c/curfew.txt @@ -1,9 +1,6 @@ Name:Curfew ManaCost:U Types:Instant -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ PlayChoose | SubAbility$ BounceAll | SpellDescription$ Each player returns a creature they control to its owner's hand. -SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | AILogic$ WorstCard | ChoiceTitle$ Choose a creature you control | RememberChosen$ True -SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChangeZone | DefinedPlayer$ Player | Hidden$ True | Mandatory$ True | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature | SpellDescription$ Each player returns a creature they control to its owner's hand. AI:RemoveDeck:All Oracle:Each player returns a creature they control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/d/delirium_skeins.txt b/forge-gui/res/cardsfolder/d/delirium_skeins.txt index 1e4245d19fa..c0b66dd563f 100644 --- a/forge-gui/res/cardsfolder/d/delirium_skeins.txt +++ b/forge-gui/res/cardsfolder/d/delirium_skeins.txt @@ -1,7 +1,6 @@ Name:Delirium Skeins ManaCost:2 B Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DeliriumDiscard | SpellDescription$ Each player discards three cards. -SVar:DeliriumDiscard:DB$ Discard | Mode$ TgtChoose | Defined$ Remembered | NumCards$ 3 +A:SP$ Discard | Defined$ Player | NumCards$ 3 | Mode$ TgtChoose | SpellDescription$ Each player discards three cards. AI:RemoveDeck:Random Oracle:Each player discards three cards. diff --git a/forge-gui/res/cardsfolder/d/descent_into_madness.txt b/forge-gui/res/cardsfolder/d/descent_into_madness.txt index 3b9b8e2d35b..b129b0d0dc9 100644 --- a/forge-gui/res/cardsfolder/d/descent_into_madness.txt +++ b/forge-gui/res/cardsfolder/d/descent_into_madness.txt @@ -2,9 +2,8 @@ Name:Descent into Madness ManaCost:3 B B Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a despair counter on CARDNAME, then each player exiles X permanents they control and/or cards from their hand, where X is the number of despair counters on CARDNAME. -SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DESPAIR | CounterNum$ 1 | SubAbility$ DBExileSelf -SVar:DBExileSelf:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBExile -SVar:DBExile:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeType$ Permanent.RememberedPlayerCtrl,Card.RememberedPlayerCtrl | ChangeNum$ X | Hidden$ True | Origin$ Battlefield,Hand | Destination$ Exile | Mandatory$ True +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DESPAIR | CounterNum$ 1 | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZone | DefinedPlayer$ Player | ChangeNum$ X | Hidden$ True | Origin$ Battlefield,Hand | Destination$ Exile | Mandatory$ True SVar:X:Count$CardCounters.DESPAIR AI:RemoveDeck:All AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/e/enslaved_horror.txt b/forge-gui/res/cardsfolder/e/enslaved_horror.txt index 0cb357f18da..fa6c9478716 100644 --- a/forge-gui/res/cardsfolder/e/enslaved_horror.txt +++ b/forge-gui/res/cardsfolder/e/enslaved_horror.txt @@ -2,9 +2,8 @@ Name:Enslaved Horror ManaCost:3 B Types:Creature Horror PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RepeatPlayers | TriggerDescription$ When CARDNAME enters, each other player may return a creature card from their graveyard to the battlefield. -SVar:RepeatPlayers:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ TrigChange -SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.Opponent | ChangeNum$ 1 | Hidden$ True | Optional$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters, each other player may return a creature card from their graveyard to the battlefield. +SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature | DefinedPlayer$ Player.Other | ChangeNum$ 1 | Hidden$ True | Optional$ True AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z EQ0 SVar:Z:Count$ValidGraveyard Creature.OppOwn+powerGT4+toughnessGT4 diff --git a/forge-gui/res/cardsfolder/e/exhume.txt b/forge-gui/res/cardsfolder/e/exhume.txt index 8348c12c12d..68f69e72744 100644 --- a/forge-gui/res/cardsfolder/e/exhume.txt +++ b/forge-gui/res/cardsfolder/e/exhume.txt @@ -1,8 +1,7 @@ Name:Exhume ManaCost:1 B Types:Sorcery -A:SP$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player | SpellDescription$ Each player puts a creature card from their graveyard onto the battlefield. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 1 | Hidden$ True | Mandatory$ True +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature | DefinedPlayer$ Player | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | SpellDescription$ Each player puts a creature card from their graveyard onto the battlefield. SVar:X:Count$ValidGraveyard Creature.YouOwn SVar:NeedsToPlayVar:X GE1 Oracle:Each player puts a creature card from their graveyard onto the battlefield. diff --git a/forge-gui/res/cardsfolder/f/fall_of_the_thran.txt b/forge-gui/res/cardsfolder/f/fall_of_the_thran.txt index eba120706b1..588c86a00ce 100644 --- a/forge-gui/res/cardsfolder/f/fall_of_the_thran.txt +++ b/forge-gui/res/cardsfolder/f/fall_of_the_thran.txt @@ -1,8 +1,7 @@ Name:Fall of the Thran ManaCost:5 W Types:Enchantment Saga -K:Chapter:3:DBDestroyAll,DBRepeatEach,DBRepeatEach +K:Chapter:3:DBDestroyAll,DBChangeZone,DBChangeZone SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:DBRepeatEach:DB$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player | SpellDescription$ Each player returns two land cards from their graveyard to the battlefield. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Land.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 2 | Hidden$ True | Mandatory$ True +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 2 | Hidden$ True | Mandatory$ True Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Destroy all lands.\nII, III — Each player returns two land cards from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/f/fell_beasts_shriek.txt b/forge-gui/res/cardsfolder/f/fell_beasts_shriek.txt index 28ecc888300..8006da5717c 100644 --- a/forge-gui/res/cardsfolder/f/fell_beasts_shriek.txt +++ b/forge-gui/res/cardsfolder/f/fell_beasts_shriek.txt @@ -2,10 +2,8 @@ Name:Fell Beast's Shriek ManaCost:U R Types:Sorcery K:Splice:Instant,Sorcery:2 U R -A:SP$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBTapAll | SpellDescription$ Each opponent chooses a creature they control. Tap and goad the chosen creatures. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) -SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True -SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.IsRemembered | SubAbility$ DBGoad -SVar:DBGoad:DB$ Goad | Defined$ Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Opponent | Amount$ 1 | Choices$ Creature | ControlledByPlayer$ Chooser | Mandatory$ True | SubAbility$ DBTapAll | SpellDescription$ Each opponent chooses a creature they control. Tap and goad the chosen creatures. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) +SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.ChosenCard | SubAbility$ DBGoad +SVar:DBGoad:DB$ Goad | Defined$ ChosenCard DeckHints:Type$Instant|Sorcery Oracle:Each opponent chooses a creature they control. Tap and goad the chosen creatures. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)\nSplice onto instant or sorcery {2}{U}{R} (As you cast an instant or sorcery spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/g/gor_muldrak_amphinologist.txt b/forge-gui/res/cardsfolder/g/gor_muldrak_amphinologist.txt index 29f1b1f005a..52ab4533610 100644 --- a/forge-gui/res/cardsfolder/g/gor_muldrak_amphinologist.txt +++ b/forge-gui/res/cardsfolder/g/gor_muldrak_amphinologist.txt @@ -3,9 +3,8 @@ ManaCost:1 G U Types:Legendary Creature Human Scout PT:3/2 S:Mode$ Continuous | Affected$ You,Permanent.YouCtrl | AddKeyword$ Protection:Salamander | Description$ You and permanents you control have protection from Salamanders. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeat | TriggerDescription$ At the beginning of your end step, each player who controls the fewest creatures creates a 4/3 blue Salamander Warrior creature token. -SVar:TrigRepeat:DB$ RepeatEach | RepeatSubAbility$ TrigToken | RepeatPlayers$ Player.controlsCreature_EQX -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_4_3_salamander_warrior | TokenOwner$ Player.IsRemembered +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, each player who controls the fewest creatures creates a 4/3 blue Salamander Warrior creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_4_3_salamander_warrior | TokenOwner$ Player.controlsCreature_EQX SVar:X:PlayerCountPlayers$LowestValid Creature.YouCtrl DeckHas:Ability$Token Oracle:You and permanents you control have protection from Salamanders.\nAt the beginning of your end step, each player who controls the fewest creatures creates a 4/3 blue Salamander Warrior creature token. diff --git a/forge-gui/res/cardsfolder/g/grime_gorger.txt b/forge-gui/res/cardsfolder/g/grime_gorger.txt index f8d9295c753..ef3152bdb0b 100644 --- a/forge-gui/res/cardsfolder/g/grime_gorger.txt +++ b/forge-gui/res/cardsfolder/g/grime_gorger.txt @@ -4,7 +4,7 @@ Types:Creature Horror PT:3/3 K:Menace T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigRepeatTypes | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile up to one card of each card type from defending player's graveyard. Put a +1/+1 counter on CARDNAME for each card exiled this way. -SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.OwnedBy TriggeredDefendingPlayer | TypesFromZone$ Graveyard | RepeatSubAbility$ ChooseCard | SubAbility$ DBExile +SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ ValidGraveyard Card.OwnedBy TriggeredDefendingPlayer | RepeatSubAbility$ ChooseCard | SubAbility$ DBExile SVar:ChooseCard:DB$ ChooseCard | ChoiceZone$ Graveyard | Choices$ Card.ChosenType+OwnedBy TriggeredDefendingPlayer | ChoiceTitle$ You may choose a card of this type from defending player's graveyard to exile | ChoiceTitleAppend$ ChosenType | RememberChosen$ True SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ Remembered | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt b/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt index de2d9e9cdaa..c7843a0d457 100644 --- a/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt +++ b/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt @@ -9,8 +9,7 @@ A:AB$ PeekAndReveal | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | PeekAmo SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBLibraryBottom SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand SVar:DBLibraryBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 -A:AB$ RepeatEach | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBJaceExile | SubAbility$ DBPlayIt | SpellDescription$ For each player, search that player's library for a nonland card and exile it, then that player shuffles. You may cast those cards without paying their mana costs. -SVar:DBJaceExile:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ Remembered | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | Imprint$ True | Shuffle$ True +A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Exile | DefinedPlayer$ Player | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | Imprint$ True | Shuffle$ True | SubAbility$ DBPlayIt | SpellDescription$ For each player, search that player's library for a nonland card and exile it, then that player shuffles. You may cast those cards without paying their mana costs. SVar:DBPlayIt:DB$ Play | Defined$ Imprinted | Amount$ All | Controller$ You | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True Oracle:[+1]: Until your next turn, whenever a creature an opponent controls attacks, it gets -1/-0 until end of turn.\n[-2]: Reveal the top three cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other on the bottom of your library in any order.\n[-8]: For each player, search that player's library for a nonland card and exile it, then that player shuffles. You may cast those cards without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/k/king_narfis_betrayal.txt b/forge-gui/res/cardsfolder/k/king_narfis_betrayal.txt index f73420cf26b..193ff926372 100644 --- a/forge-gui/res/cardsfolder/k/king_narfis_betrayal.txt +++ b/forge-gui/res/cardsfolder/k/king_narfis_betrayal.txt @@ -2,11 +2,8 @@ Name:King Narfi's Betrayal ManaCost:1 U B Types:Enchantment Saga K:Chapter:3:DBMill,DBEffect,DBEffect -SVar:DBMill:DB$ Mill | NumCards$ 4 | Defined$ Player | SubAbility$ DBRepeatEach | SpellDescription$ Each player mills four cards. Then you may exile a creature or planeswalker card from each graveyard. -SVar:DBRepeatEach:DB$ RepeatEach | Optional$ True | OptionPrompt$ Do you want to exile a creature or planeswalker card from each graveyard? | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseCard | SubAbility$ DBExile -SVar:DBChooseCard:DB$ ChooseCard | Defined$ You | Choices$ Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl | ChoiceZone$ Graveyard | ChoiceTitle$ Choose a creature or planeswalker card in a graveyard | Mandatory$ True | RememberChosen$ True -SVar:DBExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:DBMill:DB$ Mill | NumCards$ 4 | Defined$ Player | SubAbility$ DBChangeZone | SpellDescription$ Each player mills four cards. Then you may exile a creature or planeswalker card from each graveyard. +SVar:DBChangeZone:DB$ ChangeZone | DefinedPlayer$ Player | Chooser$ You | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Creature,Planeswalker SVar:DBEffect:DB$ Effect | StaticAbilities$ PlayExile | RememberObjects$ ValidExile Card.ExiledWithSource+nonLand | ForgetOnMoved$ Exile | SpellDescription$ Until end of turn, you may cast spells from among cards exiled with CARDNAME, and you may spend mana as though it were mana of any color to cast those spells. SVar:PlayExile:Mode$ Continuous | MayPlayIgnoreType$ True | MayPlayIgnoreColor$ True | MayPlay$ True | Affected$ Card.ExiledWithEffectSource+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast spells from among cards exiled with EFFECTSOURCE, and you may spend mana as though it were mana of any color to cast those spells. DeckHas:Ability$Mill diff --git a/forge-gui/res/cardsfolder/m/mind_swords.txt b/forge-gui/res/cardsfolder/m/mind_swords.txt index 8e5a1a36da6..76eaf97cecb 100644 --- a/forge-gui/res/cardsfolder/m/mind_swords.txt +++ b/forge-gui/res/cardsfolder/m/mind_swords.txt @@ -2,7 +2,6 @@ Name:Mind Swords ManaCost:1 B Types:Sorcery S:Mode$ AlternativeCost | ValidSA$ Spell.Self | EffectZone$ All | Cost$ Sac<1/Creature/creature> | IsPresent$ Swamp.YouCtrl | Description$ If you control a Swamp, you may sacrifice a creature rather than pay this spell's mana cost. -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBExile | StackDescription$ SpellDescription | SpellDescription$ Each player exiles two cards from their hand. -SVar:DBExile:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | SpellDescription$ exiles two cards from their hand. +A:SP$ ChangeZone | DefinedPlayer$ Player | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | StackDescription$ SpellDescription | SpellDescription$ Each player exiles two cards from their hand. AI:RemoveDeck:All Oracle:If you control a Swamp, you may sacrifice a creature rather than pay this spell's mana cost.\nEach player exiles two cards from their hand. diff --git a/forge-gui/res/cardsfolder/o/only_i_know_what_awaits.txt b/forge-gui/res/cardsfolder/o/only_i_know_what_awaits.txt index 191fef467c1..f19ae0d4324 100644 --- a/forge-gui/res/cardsfolder/o/only_i_know_what_awaits.txt +++ b/forge-gui/res/cardsfolder/o/only_i_know_what_awaits.txt @@ -2,7 +2,7 @@ Name:Only I Know What Awaits ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigRepeatEach | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, for each card type among permanents your opponents control, you may put a permanent card of that type from your hand onto the battlefield. -SVar:TrigRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ Permanent.OppCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll +SVar:TrigRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ Valid Permanent.OppCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.YouOwn+ChosenType | ChoiceTitle$ You may choose a card of this type to put onto the battlefield | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Hand SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Hand | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True diff --git a/forge-gui/res/cardsfolder/p/planar_overlay.txt b/forge-gui/res/cardsfolder/p/planar_overlay.txt index a0890f9191b..b11d4cbc6fa 100644 --- a/forge-gui/res/cardsfolder/p/planar_overlay.txt +++ b/forge-gui/res/cardsfolder/p/planar_overlay.txt @@ -1,14 +1,8 @@ Name:Planar Overlay ManaCost:2 U Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseMountain | StackDescription$ SpellDescription | SubAbility$ DBChangeZone | SpellDescription$ Each player chooses a land they control of each basic land type. Return those lands to their owners' hands. -SVar:ChooseMountain:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Mountain.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ ChooseSwamp | AILogic$ WorstCard -SVar:ChooseSwamp:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Swamp.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ ChooseIsland | AILogic$ WorstCard -SVar:ChooseIsland:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Island.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ ChoosePlains | AILogic$ WorstCard -SVar:ChoosePlains:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Plains.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ ChooseForest | AILogic$ WorstCard -SVar:ChooseForest:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Forest.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | AILogic$ WorstCard -SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Battlefield | Destination$ Hand | StackDescription$ None | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | EachBasicType$ True | ControlledByPlayer$ Chooser | SubAbility$ DBChangeZone | SpellDescription$ Each player chooses a land they control of each basic land type. Return those lands to their owners' hands. +SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Card.ChosenCard | Origin$ Battlefield | Destination$ Hand | StackDescription$ None AI:RemoveDeck:All AI:RemoveDeck:Random Oracle:Each player chooses a land they control of each basic land type. Return those lands to their owners' hands. diff --git a/forge-gui/res/cardsfolder/p/portent_of_calamity.txt b/forge-gui/res/cardsfolder/p/portent_of_calamity.txt index 7e801459559..204f9d250ff 100644 --- a/forge-gui/res/cardsfolder/p/portent_of_calamity.txt +++ b/forge-gui/res/cardsfolder/p/portent_of_calamity.txt @@ -2,7 +2,7 @@ Name:Portent of Calamity ManaCost:X U Types:Sorcery A:SP$ PeekAndReveal | PeekAmount$ X | Reveal$ True | ImprintRevealed$ True | SubAbility$ DBRepeatTypes | SpellDescription$ Reveal the top X cards of your library. For each card type, you may exile a card of that type from among them. Put the rest into your graveyard. You may cast a spell from among the exiled cards without paying its mana cost if you exiled four or more cards this way. Then put the rest of the exiled cards into your hand. -SVar:DBRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.IsImprinted | TypesFromZone$ Library | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZone +SVar:DBRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ ValidLibrary Card.IsImprinted | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZone SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.ChosenType+YouOwn+IsImprinted | ChoiceZone$ Library | RememberChosen$ True SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Remembered | SubAbility$ DBGraveyard SVar:DBGraveyard:DB$ ChangeZoneAll | Origin$ Library | Destination$ Graveyard | ChangeType$ Card.IsImprinted+!IsRemembered | SubAbility$ DBPlay diff --git a/forge-gui/res/cardsfolder/s/sail_into_the_west.txt b/forge-gui/res/cardsfolder/s/sail_into_the_west.txt index 070f5de70cc..bb014c6d7e5 100644 --- a/forge-gui/res/cardsfolder/s/sail_into_the_west.txt +++ b/forge-gui/res/cardsfolder/s/sail_into_the_west.txt @@ -2,10 +2,7 @@ Name:Sail into the West ManaCost:2 G U Types:Instant A:SP$ Vote | Defined$ Player | VoteType$ Return,Embark | VoteReturn$ DBChangeZone | VoteEmbark$ DBWheel | Tied$ DBWheel | StackDescription$ REP you, each player votes_{p:You}, {p:Player} each vote & each player returns_{p:Player} each return & each player may_{p:Player} may each | SpellDescription$ Will of the council — Starting with you, each player votes for return or embark. If return gets more votes, each player returns up to two cards from their graveyard to their hand, then you exile CARDNAME. If embark gets more votes or the vote is tied, each player may discard their hand and draw seven cards. -SVar:DBChangeZone:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBChangeZoneAll | SpellDescription$ If return gets more votes, each player returns up to two cards from their graveyard to their hand, then you exile CARDNAME. -SVar:DBChoose:DB$ ChooseCard | Choices$ Card.RememberedPlayerCtrl | ChoiceZone$ Graveyard | Defined$ Player.IsRemembered | MinAmount$ 0 | Amount$ 2 | ChoiceTitle$ Select up to two cards from your graveyard | RememberChosen$ True -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True | SubAbility$ ExileSelf +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Player | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 2 | Hidden$ True | SubAbility$ ExileSelf | SpellDescription$ If return gets more votes, each player returns up to two cards from their graveyard to their hand, then you exile CARDNAME. SVar:ExileSelf:DB$ ChangeZone | Origin$ Stack | Destination$ Exile SVar:DBWheel:DB$ GenericChoice | TempRemember$ Chooser | ShowChoice$ ExceptSelf | Defined$ Player | Choices$ Discard,No | SubAbility$ DBDiscard | SpellDescription$ If embark gets more votes or the vote is tied, each player may discard their hand and draw seven cards. SVar:Discard:DB$ Pump | Defined$ Remembered | NoteCards$ Self | NoteCardsFor$ Discard | SpellDescription$ I will discard my hand. diff --git a/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt b/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt index bbafc2b474d..b1b83a8df9a 100644 --- a/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt +++ b/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt @@ -1,10 +1,9 @@ Name:Sculpted Sunburst ManaCost:3 W W Types:Sorcery -A:SP$ ChooseCard | Choices$ Creature.YouCtrl | ChoiceDesc$ creature they control | Mandatory$ True | ChoiceTitle$ Choose a creature you control | RememberChosen$ True | ImprintChosen$ True | SubAbility$ DBRepeatEach | SpellDescription$ Choose a creature you control, then each opponent chooses a creature they control with equal or lesser power. -SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBChangeZoneAll | StackDescription$ Then each opponent chooses a creature they control with equal or lesser power. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl+powerLEX | Mandatory$ True | ChoiceTitle$ Choose a creature you control with equal or lesser power | RememberChosen$ True +A:SP$ ChooseCard | Choices$ Creature.YouCtrl | ChoiceDesc$ creature they control | Mandatory$ True | ChoiceTitle$ Choose a creature you control | ImprintChosen$ True | SubAbility$ DBChooseCard | SpellDescription$ Choose a creature you control, then each opponent chooses a creature they control with equal or lesser power. +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Opponent | ControlledByPlayer$ Chooser | Choices$ Creature.powerLEX | Mandatory$ True | ChoiceTitle$ Choose a creature you control with equal or lesser power | RememberChosen$ True SVar:X:Imprinted$CardPower -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ConditionDefined$ Imprinted | ConditionPresent$ Creature | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.IsNotRemembered | SubAbility$ DBCleanup | SpellDescription$ If you chose a creature this way, exile each creature not chosen by any player this way. +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ConditionDefined$ Imprinted | ConditionPresent$ Creature | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.IsNotRemembered+IsNotImprinted | SubAbility$ DBCleanup | SpellDescription$ If you chose a creature this way, exile each creature not chosen by any player this way. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True Oracle:Choose a creature you control, then each opponent chooses a creature they control with equal or lesser power. If you chose a creature this way, exile each creature not chosen by any player this way. diff --git a/forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt b/forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt index 5f13040c2b1..c8eab7fdabd 100644 --- a/forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt +++ b/forge-gui/res/cardsfolder/s/sothera_the_supervoid.txt @@ -1,11 +1,8 @@ Name:Sothera, the Supervoid ManaCost:2 B B Types:Legendary Enchantment -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigRepeatEach | TriggerDescription$ Whenever a creature you control dies, each opponent chooses a creature they control and exiles it. -SVar:TrigRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBExile -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature you control | Mandatory$ True | RememberChosen$ True -SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever a creature you control dies, each opponent chooses a creature they control and exiles it. +SVar:TrigExile:DB$ ChangeZone | ChangeType$ Creature | Origin$ Battlefield | Destination$ Exile | Hidden$ True | Mandatory$ True | DefinedPlayer$ Opponent T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your end step, if a player controls no creatures, sacrifice NICKNAME, then put a creature card exiled with it onto the battlefield under your control with two additional +1/+1 counters on it. SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | ChangeType$ Creature.ExiledWithSource | GainControl$ True | Origin$ Exile | Hidden$ True | Mandatory$ True | Destination$ Battlefield | WithCountersType$ P1P1 | WithCountersAmount$ 2 diff --git a/forge-gui/res/cardsfolder/s/sporogenesis.txt b/forge-gui/res/cardsfolder/s/sporogenesis.txt index 00c9a28e435..04d352be956 100644 --- a/forge-gui/res/cardsfolder/s/sporogenesis.txt +++ b/forge-gui/res/cardsfolder/s/sporogenesis.txt @@ -7,7 +7,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZone SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ g_1_1_saproling | TokenOwner$ You SVar:X:TriggeredCard$CardCounters.FUNGUS T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigRemove | TriggerDescription$ When CARDNAME leaves the battlefield, remove all fungus counters from all creatures. -SVar:TrigRemove:DB$ RepeatEach | RepeatCards$ Creature | RepeatSubAbility$ DBRemoveFungus -SVar:DBRemoveFungus:DB$ RemoveCounter | Defined$ Remembered | CounterType$ FUNGUS | CounterNum$ All +SVar:TrigRemove:DB$ RemoveCounterAll | ValidCards$ Creature | CounterType$ FUNGUS | AllCounters$ True DeckHas:Ability$Token Oracle:At the beginning of your upkeep, you may put a fungus counter on target nontoken creature.\nWhenever a creature with a fungus counter on it dies, create a 1/1 green Saproling creature token for each fungus counter on that creature.\nWhen Sporogenesis leaves the battlefield, remove all fungus counters from all creatures. diff --git a/forge-gui/res/cardsfolder/s/summon_esper_valigarmanda.txt b/forge-gui/res/cardsfolder/s/summon_esper_valigarmanda.txt index b31653cea82..e698ac93c59 100644 --- a/forge-gui/res/cardsfolder/s/summon_esper_valigarmanda.txt +++ b/forge-gui/res/cardsfolder/s/summon_esper_valigarmanda.txt @@ -2,11 +2,8 @@ Name:Summon: Esper Valigarmanda ManaCost:3 R Types:Enchantment Creature Saga Drake PT:3/3 -K:Chapter:4:DBRepeatEach,DBMana,DBMana,DBMana -SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseCard | SubAbility$ DBExile | SpellDescription$ Exile an instant or sorcery card from each graveyard. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ You | Choices$ Instant.RememberedPlayerOwn,Sorcery.RememberedPlayerOwn | ChoiceZone$ Graveyard | ChoiceTitle$ Choose an instant or sorcery card in a graveyard | Mandatory$ True | RememberChosen$ True -SVar:DBExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +K:Chapter:4:DBExile,DBMana,DBMana,DBMana +SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | Mandatory$ True | DefinedPlayer$ Player | Chooser$ You | ChangeType$ Instant,Sorcery SVar:DBMana:DB$ Mana | Produced$ R | Amount$ X | SubAbility$ DBPlay | SpellDescription$ Add {R} for each lore counter on this Saga. You may cast an instant or sorcery card exiled with this Saga, and mana of any type can be spent to cast that spell. SVar:DBPlay:DB$ Play | Valid$ Instant.ExiledWithSource,Sorcery.ExiledWithSource | ValidSA$ Spell | ManaConversion$ AnyType->AnyType | ValidZone$ Exile | Optional$ True K:Flying diff --git a/forge-gui/res/cardsfolder/t/the_three_seasons.txt b/forge-gui/res/cardsfolder/t/the_three_seasons.txt index 511d1a01176..82c2214b192 100644 --- a/forge-gui/res/cardsfolder/t/the_three_seasons.txt +++ b/forge-gui/res/cardsfolder/t/the_three_seasons.txt @@ -1,10 +1,9 @@ Name:The Three Seasons ManaCost:G U Types:Enchantment Saga -K:Chapter:3:DBMill,DBChangeZone1,DBRepeatEach +K:Chapter:3:DBMill,DBChangeZone1,DBChangeZone2 SVar:DBMill:DB$ Mill | NumCards$ 3 | Defined$ You | SpellDescription$ Mill three cards. SVar:DBChangeZone1:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target snow permanent cards in your graveyard | ValidTgts$ Permanent.Snow+YouOwn | SpellDescription$ Return up to two target snow permanent cards from your graveyard to your hand. -SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone2 | SpellDescription$ Choose three cards in each graveyard. Their owners shuffle those cards into their libraries. -SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | ChangeType$ Card.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ You | ChangeNum$ 3 | Hidden$ True | Shuffle$ True | Mandatory$ True +SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | DefinedPlayer$ Player | Chooser$ You | ChangeNum$ 3 | Hidden$ True | Shuffle$ True | Mandatory$ True | SpellDescription$ Choose three cards in each graveyard. Their owners shuffle those cards into their libraries. DeckHas:Ability$Mill Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Mill three cards.\nII — Return up to two target snow permanent cards from your graveyard to your hand.\nIII — Choose three cards in each graveyard. Their owners shuffle those cards into their libraries. diff --git a/forge-gui/res/cardsfolder/u/urzas_sylex.txt b/forge-gui/res/cardsfolder/u/urzas_sylex.txt index 494838f1a89..f76f44fdcff 100644 --- a/forge-gui/res/cardsfolder/u/urzas_sylex.txt +++ b/forge-gui/res/cardsfolder/u/urzas_sylex.txt @@ -1,10 +1,9 @@ Name:Urza's Sylex ManaCost:3 Types:Legendary Artifact -A:AB$ RepeatEach | Cost$ 2 W W T Exile<1/CARDNAME> | RepeatPlayers$ Player | RepeatSubAbility$ ChooseSixLands | SorcerySpeed$ True | SubAbility$ DestroyAll | SpellDescription$ Each player chooses six lands they control. -SVar:ChooseSixLands:DB$ ChooseCard | Defined$ Remembered | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose six lands you control | Amount$ 6 | Mandatory$ True | RememberChosen$ True -SVar:DestroyAll:DB$ DestroyAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup | SpellDescription$ Destroy all other permanents. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SpellDescription$ Activate only as a sorcery. +A:AB$ ChooseCard | Cost$ 2 W W T Exile<1/CARDNAME> | DefinedPlayer$ Player | Choices$ Land | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose six lands you control | Amount$ 6 | Mandatory$ True | SorcerySpeed$ True | SubAbility$ DestroyAll | SpellDescription$ Each player chooses six lands they control. +SVar:DestroyAll:DB$ DestroyAll | ValidCards$ Permanent.!ChosenCard | SubAbility$ DBCleanup | SpellDescription$ Destroy all other permanents. +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | SpellDescription$ Activate only as a sorcery. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Exile | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSearch | TriggerDescription$ When CARDNAME is put into exile from the battlefield, you may pay {2}. If you do, search your library for a planeswalker card, reveal it, put it into your hand, then shuffle. SVar:TrigSearch:AB$ ChangeZone | Cost$ 2 | ChangeType$ Planeswalker.YouOwn | Origin$ Library | Destination$ Hand DeckHas:Ability$Sacrifice diff --git a/forge-gui/res/cardsfolder/v/virtuss_maneuver.txt b/forge-gui/res/cardsfolder/v/virtuss_maneuver.txt index 43eb811b7e6..ec3fc71676a 100644 --- a/forge-gui/res/cardsfolder/v/virtuss_maneuver.txt +++ b/forge-gui/res/cardsfolder/v/virtuss_maneuver.txt @@ -1,11 +1,8 @@ Name:Virtus's Maneuver ManaCost:2 B Types:Sorcery -A:SP$ AssignGroup | Defined$ Player | Choices$ FriendRepeat,DBSacrifice | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend returns a creature card from their graveyard to their hand. Each foe sacrifices a creature they control. -SVar:FriendRepeat:DB$ RepeatEach | RepeatPlayers$ Remembered | RepeatSubAbility$ PlayChoose | ClearRememberedBeforeLoop$ True | SubAbility$ ReturnAll | StackDescription$ SpellDescription | SpellDescription$ Each friend returns a creature card from their graveyard to their hand. -SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | ChoiceZone$ Graveyard | ChoiceTitle$ Choose a creature in your graveyard | RememberChosen$ True -SVar:ReturnAll:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Hand | ChangeType$ Creature.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +A:SP$ AssignGroup | Defined$ Player | Choices$ DBToHand,DBSacrifice | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend returns a creature card from their graveyard to their hand. Each foe sacrifices a creature they control. +SVar:DBToHand:DB$ ChangeZone | DefinedPlayer$ Remembered | ChangeType$ Creature | Hidden$ True | Mandatory$ True | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Each friend returns a creature card from their graveyard to their hand SVar:DBSacrifice:DB$ Sacrifice | Defined$ Remembered | SacValid$ Creature | SacMessage$ creature | StackDescription$ SpellDescription | SpellDescription$ Each foe sacrifices a creature they control. SVar:NeedsToPlayVar:Z GE2 SVar:Z:SVar$Z1/Plus.Z2 diff --git a/forge-gui/res/cardsfolder/w/words_of_wind.txt b/forge-gui/res/cardsfolder/w/words_of_wind.txt index fc8a6f90308..577312afb32 100644 --- a/forge-gui/res/cardsfolder/w/words_of_wind.txt +++ b/forge-gui/res/cardsfolder/w/words_of_wind.txt @@ -2,10 +2,8 @@ Name:Words of Wind ManaCost:2 U Types:Enchantment A:AB$ Effect | Cost$ 1 | ReplacementEffects$ DrawReplace | SpellDescription$ The next time you would draw a card this turn, each player returns a permanent they control to its owner's hand instead. -SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ Repeat | Description$ The next time you would draw a card this turn, each player returns a permanent they control to its owner's hand instead. -SVar:Repeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ PlayChoose | SubAbility$ BounceAll -SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | AILogic$ WorstCard | ChoiceTitle$ Choose a permanent you control | RememberChosen$ True -SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent.IsRemembered | SubAbility$ ExileEffect +SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ Bounce | Description$ The next time you would draw a card this turn, each player returns a permanent they control to its owner's hand instead. +SVar:BounceAll:DB$ ChangeZone | DefinedPlayer$ Player | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile AI:RemoveDeck:All Oracle:{1}: The next time you would draw a card this turn, each player returns a permanent they control to its owner's hand instead. diff --git a/forge-gui/res/cardsfolder/w/worldpurge.txt b/forge-gui/res/cardsfolder/w/worldpurge.txt index 0d2c3b7f65f..a0926c35552 100644 --- a/forge-gui/res/cardsfolder/w/worldpurge.txt +++ b/forge-gui/res/cardsfolder/w/worldpurge.txt @@ -1,10 +1,9 @@ Name:Worldpurge ManaCost:4 WU WU WU WU Types:Sorcery -A:SP$ ChangeZoneAll | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBRepeat | SpellDescription$ Return all permanents to their owners' hands. Each player chooses up to seven cards in their hand, then shuffles the rest into their library. Each player loses all unspent mana. -SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose -SVar:DBChoose:DB$ ChooseCard | MinAmount$ 0 | Amount$ 7 | Defined$ Remembered | Choices$ Card.RememberedPlayerCtrl | ChoiceZone$ Hand | SubAbility$ DBReturn -SVar:DBReturn:DB$ ChangeZone | Defined$ ValidHand Card.nonChosenCard+RememberedPlayerCtrl | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ DBEmpty -SVar:DBEmpty:DB$ DrainMana | Defined$ Remembered +A:SP$ ChangeZoneAll | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBChoose | SpellDescription$ Return all permanents to their owners' hands. Each player chooses up to seven cards in their hand, then shuffles the rest into their library. Each player loses all unspent mana. +SVar:DBChoose:DB$ ChooseCard | MinAmount$ 0 | Amount$ 7 | Defined$ Player | ControlledByPlayer$ Chooser | ChoiceZone$ Hand | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Defined$ ValidHand Card.nonChosenCard | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ DBEmpty +SVar:DBEmpty:DB$ DrainMana | Defined$ Player AI:RemoveDeck:All Oracle:Return all permanents to their owners' hands. Each player chooses up to seven cards in their hand, then shuffles the rest into their library. Each player loses all unspent mana. diff --git a/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt b/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt index ce04235baca..9de5a3485cb 100644 --- a/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt +++ b/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt @@ -1,13 +1,10 @@ Name:Zndrsplt's Judgment ManaCost:4 U Types:Sorcery -A:SP$ AssignGroup | Defined$ Player | Choices$ FriendRepeat,FoeRepeat | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend creates a token that's a copy of a creature they control. Each foe returns a creature they control to its owner's hand. +A:SP$ AssignGroup | Defined$ Player | Choices$ FriendRepeat,FoeBounce | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend creates a token that's a copy of a creature they control. Each foe returns a creature they control to its owner's hand. SVar:FriendRepeat:DB$ RepeatEach | RepeatPlayers$ Remembered | RepeatSubAbility$ DBClone | ClearRememberedBeforeLoop$ True | ChangeZoneTable$ True | StackDescription$ Each friend creates a token that's a copy of a creature they control. | SpellDescription$ Friend creates a token that's a copy of a creature they control. SVar:DBClone:DB$ CopyPermanent | Choices$ Creature.RememberedPlayerCtrl | Chooser$ Remembered | Controller$ Remembered -SVar:FoeRepeat:DB$ RepeatEach | RepeatPlayers$ Remembered | RepeatSubAbility$ PlayChoose | ClearRememberedBeforeLoop$ True | SubAbility$ BounceAll | StackDescription$ Each foe returns a creature they control to its owner's hand. | SpellDescription$ Foe returns a creature they control to its owner's hand. -SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | AILogic$ WorstCard | ChoiceTitle$ Choose a creature you control | RememberChosen$ True -SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:FoeBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature | Mandatory$ True | Hidden$ True | DefinedPlayer$ Remembered | SpellDescription$ Each foe returns a creature they control to its owner's hand. SVar:NeedsToPlayVar:Z GE2 SVar:Z:SVar$Z1/Plus.Z2 SVar:Z1:Count$Valid Creature.YourTeamCtrl From 84ff75c9cf57d91e194bc9f5eac5f7346faaa3fe Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 21 Jul 2025 07:52:30 +0200 Subject: [PATCH 064/183] Update frontline_war_rager.txt --- forge-gui/res/cardsfolder/f/frontline_war_rager.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/f/frontline_war_rager.txt b/forge-gui/res/cardsfolder/f/frontline_war_rager.txt index c313b1f74fc..7102213af5a 100644 --- a/forge-gui/res/cardsfolder/f/frontline_war_rager.txt +++ b/forge-gui/res/cardsfolder/f/frontline_war_rager.txt @@ -1,8 +1,7 @@ Name:Frontline War-Rager ManaCost:2 R Types:Creature Kavu Soldier -PT:4/5 -K:Lifelink +PT:2/3 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Creature.YouCtrl+tapped | PresentCompare$ GE2 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if you control two or more tapped creatures, put a +1/+1 counter on this creature. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters From 3e2eb86bd479aae28fb101308a1f5a38fe9eac7b Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 21 Jul 2025 07:53:47 +0200 Subject: [PATCH 065/183] Update dockworker_drone.txt --- forge-gui/res/cardsfolder/d/dockworker_drone.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/dockworker_drone.txt b/forge-gui/res/cardsfolder/d/dockworker_drone.txt index 5f50e96dd40..3355df8386c 100644 --- a/forge-gui/res/cardsfolder/d/dockworker_drone.txt +++ b/forge-gui/res/cardsfolder/d/dockworker_drone.txt @@ -1,7 +1,7 @@ Name:Dockworker Drone ManaCost:1 W Types:Artifact Creature Robot -PT:0/0 +PT:1/1 K:etbCounter:P1P1:1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature dies, put its counters on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ EachFromSource | EachFromSource$ TriggeredCardLKICopy From 68790891498889490bb7123381f5dfe0476511ef Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Jul 2025 17:10:05 +0800 Subject: [PATCH 066/183] adjust playersprite spawn point on new game --- .../src/forge/adventure/character/PlayerSprite.java | 8 ++++++-- .../src/forge/adventure/stage/WorldStage.java | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java index 841a6a0807e..cca0ced5f8c 100644 --- a/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java @@ -40,8 +40,12 @@ public class PlayerSprite extends CharacterSprite { } public void storePos() { - AdventurePlayer.current().setWorldPosX(getX()); - AdventurePlayer.current().setWorldPosY(getY()); + storePos(getX(), getY()); + } + + public void storePos(final float x, final float y) { + AdventurePlayer.current().setWorldPosX(x); + AdventurePlayer.current().setWorldPosY(y); } public Vector2 getMovementDirection() { diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index 31af580cf6a..cacfab7e10c 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -402,6 +402,8 @@ public class WorldStage extends GameStage implements SaveFileContent { PointOfInterest poi = Current.world().findPointsOfInterest("Spawn"); if (poi != null) { //shouldn't be null WorldStage.getInstance().loadPOI(poi); + // adjust player sprite to prevent triggering the poi collision point when leaving the spawn on New Game + WorldStage.getInstance().getPlayerSprite().storePos(poi.getPosition().x, poi.getPosition().y + 18f); } } else { From 92b96aea75097f6888c55d9732dda3f7a95d7085 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Jul 2025 18:37:07 +0800 Subject: [PATCH 067/183] fix Rewarded Deck dialogs --- .../forge/adventure/player/AdventurePlayer.java | 13 +++++++------ .../src/forge/adventure/scene/NewGameScene.java | 2 +- .../src/forge/adventure/scene/SaveLoadScene.java | 2 +- .../src/forge/adventure/scene/TileMapScene.java | 16 +++++++++++++++- .../stage/ConsoleCommandInterpreter.java | 2 +- .../src/forge/adventure/stage/GameStage.java | 8 ++++++-- .../src/forge/adventure/stage/WorldStage.java | 10 ---------- .../src/forge/adventure/util/MapDialog.java | 4 ++-- 8 files changed, 33 insertions(+), 24 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 840509881a6..1e0a45aa8b2 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -1160,20 +1160,20 @@ public class AdventurePlayer implements Serializable, SaveFileContent { questFlags.clear(); } - public void addQuest(String questID) { + public void addQuest(String questID, boolean isNewGame) { int id = Integer.parseInt(questID); - addQuest(id); + addQuest(id, isNewGame); } - public void addQuest(int questID) { + public void addQuest(int questID, boolean isNewGame) { AdventureQuestData toAdd = AdventureQuestController.instance().generateQuest(questID); if (toAdd != null) { - addQuest(toAdd); + addQuest(toAdd, isNewGame); } } - public void addQuest(AdventureQuestData q) { + public void addQuest(AdventureQuestData q, boolean isNewGame) { //TODO: add a config flag for this boolean noTrackedQuests = true; for (AdventureQuestData existing : quests) { @@ -1186,7 +1186,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { if (noTrackedQuests || q.autoTrack) AdventureQuestController.trackQuest(q); q.activateNextStages(); - AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance()); + if (!isNewGame) + AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance()); } public List getQuests() { diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 652c6174179..774f710c309 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -268,7 +268,7 @@ public class NewGameScene extends MenuScene { SoundSystem.instance.changeBackgroundTrack(); WorldStage.getInstance().enterSpawnPOI(); if (AdventurePlayer.current().getQuests().stream().noneMatch(q -> q.getID() == 28)) { - AdventurePlayer.current().addQuest("28"); //Temporary link to Shandalar main questline + AdventurePlayer.current().addQuest("28", true); //Temporary link to Shandalar main questline } Forge.switchScene(GameScene.instance()); }; diff --git a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java index fba3703912d..4635c0d1022 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java @@ -254,7 +254,7 @@ public class SaveLoadScene extends UIScene { Current.player().resetQuestFlags(); Current.player().setCharacterFlag("newGamePlus", 1); Current.player().removeAllQuestItems(); - AdventurePlayer.current().addQuest("28"); + AdventurePlayer.current().addQuest("28", true); WorldSave.getCurrentSave().clearBookmarks(); WorldStage.getInstance().enterSpawnPOI(); SoundSystem.instance.changeBackgroundTrack(); diff --git a/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java index 640e85523b3..b65a2695d65 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java @@ -98,10 +98,24 @@ public class TileMapScene extends HudScene { if (Current.player().fullHeal()) autoheal = true; // to play sound/effect on act } + if (WorldSave.getCurrentSave().getPlayer().hasAnnounceFantasy()) { + WorldSave.getCurrentSave().getPlayer().clearAnnounceFantasy(); + MapStage.getInstance().showDeckAwardDialog("{BLINK=WHITE;RED}Chaos Mode!{ENDBLINK}\n" + + "Enemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty.", + WorldSave.getCurrentSave().getPlayer().getSelectedDeck(), this::initializeDialogs); + } else if (WorldSave.getCurrentSave().getPlayer().hasAnnounceCustom()) { + WorldSave.getCurrentSave().getPlayer().clearAnnounceCustom(); + MapStage.getInstance().showDeckAwardDialog("{GRADIENT}Custom Deck Mode!{ENDGRADIENT}\n" + + "Some enemies will use Genetic AI Decks randomly.", WorldSave.getCurrentSave().getPlayer().getSelectedDeck(), this::initializeDialogs); + } else { + initializeDialogs(); + } + } + + private void initializeDialogs() { AdventureQuestController.instance().updateEnteredPOI(rootPoint); AdventureQuestController.instance().showQuestDialogs(stage); } - @Override public boolean leave() { // clear player collision on WorldStage and the GameHUD will restore it after the flicker animation. diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index ceccdffda23..324e5888405 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -178,7 +178,7 @@ public class ConsoleCommandInterpreter { catch (Exception e){ return "Can not convert " +s[0]+" to number"; } - Current.player().addQuest(ID); + Current.player().addQuest(ID, false); return "Quest generated"; }); registerCommand(new String[]{"give", "shards"}, s -> { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 880c2f544ac..930931ef16d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -191,7 +191,7 @@ public abstract class GameStage extends Stage { showDialog(); } - public void showDeckAwardDialog(String message, Deck deck) { + public void showDeckAwardDialog(String message, Deck deck, Runnable runnable) { dialog.getContentTable().clear(); dialog.getButtonTable().clear(); dialog.clearListeners(); @@ -236,7 +236,11 @@ public abstract class GameStage extends Stage { L.skipToTheEnd(); dialog.getContentTable().add(L).width(250); - dialog.getButtonTable().add(Controls.newTextButton("OK", this::hideDialog)).width(240); + dialog.getButtonTable().add(Controls.newTextButton("OK", () -> { + hideDialog(); + if (runnable != null) + runnable.run(); + })).width(240); dialog.setKeepWithinStage(true); setDialogStage(GameHUD.getInstance()); showDialog(); diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index cacfab7e10c..254f7d66a3f 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -364,16 +364,6 @@ public class WorldStage extends GameStage implements SaveFileContent { background.setPlayerPos(player.getX(), player.getY()); //spriteGroup.setCullingArea(new Rectangle(player.getX()-getViewport().getWorldHeight()/2,player.getY()-getViewport().getWorldHeight()/2,getViewport().getWorldHeight(),getViewport().getWorldHeight())); super.draw(); - if (WorldSave.getCurrentSave().getPlayer().hasAnnounceFantasy()) { - MapStage.getInstance().showDeckAwardDialog("{BLINK=WHITE;RED}Chaos Mode!{ENDBLINK}\n" + - "Enemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty.", - WorldSave.getCurrentSave().getPlayer().getSelectedDeck()); - WorldSave.getCurrentSave().getPlayer().clearAnnounceFantasy(); - } else if (WorldSave.getCurrentSave().getPlayer().hasAnnounceCustom()) { - MapStage.getInstance().showDeckAwardDialog("{GRADIENT}Custom Deck Mode!{ENDGRADIENT}\n" + - "Some enemies will use Genetic AI Decks randomly.", WorldSave.getCurrentSave().getPlayer().getSelectedDeck()); - WorldSave.getCurrentSave().getPlayer().clearAnnounceCustom(); - } } public void enterSpawnPOI(){ diff --git a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java index df5b2d1a447..aabe5e24030 100644 --- a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java +++ b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java @@ -92,10 +92,10 @@ public class MapDialog { @Override public void changed(ChangeEvent changeEvent, Actor actor) { if (prebuiltQuestData != null && Integer.parseInt(questAccepted) == prebuiltQuestData.getID()) { - Current.player().addQuest(prebuiltQuestData); + Current.player().addQuest(prebuiltQuestData, false); } else { - Current.player().addQuest(questAccepted); + Current.player().addQuest(questAccepted, false); } } }; From 9a6ebce85a186aaf76ed74439e822b81f2343cbf Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Mon, 21 Jul 2025 22:22:48 +0800 Subject: [PATCH 068/183] Increase MemoryStack should prevent Out of stack space when exporting the large inventory of cards to clipboard, though not tested for the whole card database --- forge-gui-mobile-dev/src/forge/app/GameLauncher.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java index 8c6e1dd19da..28280d89ad4 100644 --- a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java +++ b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java @@ -24,6 +24,8 @@ public class GameLauncher { if (SharedLibraryLoader.isMac) { Configuration.GLFW_LIBRARY_NAME.set("glfw_async"); } + //increase MemoryStack to 1MB, default is 64 + Configuration.STACK_SIZE.set(1024); Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice assetsDir, false, false, 0, false, 0, "", ""); From ff963b2cb9e285e736f650a65871da904c7e0b0b Mon Sep 17 00:00:00 2001 From: Drecon84 Date: Mon, 21 Jul 2025 16:45:41 +0200 Subject: [PATCH 069/183] Fix for red castle Hard mode didn't have the defeat dialogue because it spawned a different version of Lathliss without the defeat code. --- .../map/main_story/castles/red_castle_f1.tmx | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/adventure/common/maps/map/main_story/castles/red_castle_f1.tmx b/forge-gui/res/adventure/common/maps/map/main_story/castles/red_castle_f1.tmx index 1c8e3799fc8..be41ac33ad3 100644 --- a/forge-gui/res/adventure/common/maps/map/main_story/castles/red_castle_f1.tmx +++ b/forge-gui/res/adventure/common/maps/map/main_story/castles/red_castle_f1.tmx @@ -64,6 +64,32 @@ + + + [{ + "condition": [{"checkQuestFlag": "Ch1CastlesComplete", "not":true}], + "text": "As you land your final blow against Lathliss, you feel a significant pulse of mana. But with the immediate threat removed, you can now see clearly that the locked room at the north end of the chamber does not hold any prisoners.", + "options": [{ + "name": "(Continue)", + "action": [{"setQuestFlag": {"key":"Ch1RedCastleComplete", "val": 1} }, {"deleteMapObject": -1}, {"advanceQuestFlag": "Ch1CastlesComplete"}] + }] + }, + { + "condition": [{"checkQuestFlag": "Ch1CastlesComplete"}], + "text": "As you land your final blow against Lathliss, you feel a another pulse of mana. But just as before, the locked room behind your fallen foe does not hold any prisoners.", + "options": [{ + "name": "(Continue)", + "action": [{"setQuestFlag": {"key":"Ch1RedCastleComplete", "val": 1} }, {"deleteMapObject": -1}, {"advanceQuestFlag": "Ch1CastlesComplete"}] + }] + }] + + + + + + + + @@ -105,15 +131,5 @@ ] - - - - - - - - - - From 31ebe48bf3be1a0fbe3e176e28d2515c4f7e5012 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 21 Jul 2025 17:15:09 +0200 Subject: [PATCH 070/183] Update diplomatic_relations.txt --- forge-gui/res/cardsfolder/d/diplomatic_relations.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/diplomatic_relations.txt b/forge-gui/res/cardsfolder/d/diplomatic_relations.txt index d358780b37d..c44fa6cdf53 100644 --- a/forge-gui/res/cardsfolder/d/diplomatic_relations.txt +++ b/forge-gui/res/cardsfolder/d/diplomatic_relations.txt @@ -1,7 +1,7 @@ Name:Diplomatic Relations ManaCost:2 G Types:Instant -A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Vigilance | SubAbility$ DBDealDamage | AILogic$ Fight | SpellDescription$ Target creature gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +1 | KW$ Vigilance | SubAbility$ DBDealDamage | AILogic$ Fight | SpellDescription$ Target creature you control gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature an opponent controls | NumDmg$ X | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower -Oracle:Target creature gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. +Oracle:Target creature you control gets +1/+0 and gains vigilance until end of turn. It deals damage equal to its power to target creature an opponent controls. From 53e2f199cc48bea5fdf5947b0ef26b0f9f0332a0 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Mon, 21 Jul 2025 21:55:48 +0100 Subject: [PATCH 071/183] EOE Historic bans --- forge-gui/res/formats/Archived/Historic/2025-07-29.txt | 2 +- forge-gui/res/formats/Sanctioned/Historic.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/formats/Archived/Historic/2025-07-29.txt b/forge-gui/res/formats/Archived/Historic/2025-07-29.txt index 92112d7ddca..7062eaf7b4d 100644 --- a/forge-gui/res/formats/Archived/Historic/2025-07-29.txt +++ b/forge-gui/res/formats/Archived/Historic/2025-07-29.txt @@ -4,5 +4,5 @@ Type:Archived Subtype:Arena Effective:2025-07-29 Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA, EOE, EOS -Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills +Banned:Agent of Treachery; Ancient Tomb; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Magus of the Moon; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Strip Mine; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index 19552890ebe..c678bb08c38 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -5,5 +5,5 @@ Subtype:Arena Effective:2019-11-21 Order:142 Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK, YDSK, FDN, J25, PIO, DFT, YDFT, TDM, YTDM, PA1, FIN, FCA, EOE, EOS -Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills +Banned:Agent of Treachery; Ancient Tomb; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Chrome Mox; Commandeer; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Magus of the Moon; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Strip Mine; Subtlety; Swords to Plowshares; Temporal Manipulation; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector From 5aea2e5bbe8ba8db2780a2fc01e22ed65ebed59f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Jul 2025 08:58:12 +0800 Subject: [PATCH 072/183] update some dialog translation, KeyBoardDialog --- .../src/forge/app/GameLauncher.java | 2 +- .../src/forge/adventure/scene/TileMapScene.java | 13 +++++++++---- .../src/forge/adventure/stage/GameHUD.java | 3 +-- .../src/forge/adventure/stage/GameStage.java | 4 +++- .../src/forge/adventure/stage/MapStage.java | 2 +- .../src/forge/adventure/util/Controls.java | 7 ++++++- .../src/forge/adventure/util/KeyBoardDialog.java | 10 +++++----- forge-gui/res/languages/de-DE.properties | 9 +++++++-- forge-gui/res/languages/en-US.properties | 7 ++++++- forge-gui/res/languages/es-ES.properties | 7 ++++++- forge-gui/res/languages/fr-FR.properties | 7 ++++++- forge-gui/res/languages/it-IT.properties | 7 ++++++- forge-gui/res/languages/ja-JP.properties | 7 ++++++- forge-gui/res/languages/pt-BR.properties | 7 ++++++- forge-gui/res/languages/zh-CN.properties | 7 ++++++- 15 files changed, 75 insertions(+), 24 deletions(-) diff --git a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java index 28280d89ad4..e9b745d7b7b 100644 --- a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java +++ b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java @@ -24,7 +24,7 @@ public class GameLauncher { if (SharedLibraryLoader.isMac) { Configuration.GLFW_LIBRARY_NAME.set("glfw_async"); } - //increase MemoryStack to 1MB, default is 64 + //increase MemoryStack to 1MB, default is 64kb Configuration.STACK_SIZE.set(1024); Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice diff --git a/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java index b65a2695d65..5c1112b6b3b 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java @@ -100,13 +100,18 @@ public class TileMapScene extends HudScene { } if (WorldSave.getCurrentSave().getPlayer().hasAnnounceFantasy()) { WorldSave.getCurrentSave().getPlayer().clearAnnounceFantasy(); - MapStage.getInstance().showDeckAwardDialog("{BLINK=WHITE;RED}Chaos Mode!{ENDBLINK}\n" + - "Enemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty.", + MapStage.getInstance().showDeckAwardDialog("{BLINK=WHITE;RED}" + + Forge.getLocalizer().getMessage("lblMode") + " " + + Forge.getLocalizer().getMessage("lblChaos") + "{ENDBLINK}\n" + + Forge.getLocalizer().getMessage("lblChaosModeDescription"), WorldSave.getCurrentSave().getPlayer().getSelectedDeck(), this::initializeDialogs); } else if (WorldSave.getCurrentSave().getPlayer().hasAnnounceCustom()) { WorldSave.getCurrentSave().getPlayer().clearAnnounceCustom(); - MapStage.getInstance().showDeckAwardDialog("{GRADIENT}Custom Deck Mode!{ENDGRADIENT}\n" + - "Some enemies will use Genetic AI Decks randomly.", WorldSave.getCurrentSave().getPlayer().getSelectedDeck(), this::initializeDialogs); + MapStage.getInstance().showDeckAwardDialog("{GRADIENT}" + + Forge.getLocalizer().getMessage("lblMode") + " " + + Forge.getLocalizer().getMessage("lblCustom") + "{ENDGRADIENT}\n" + + Forge.getLocalizer().getMessage("lblCustomModeDescription"), + WorldSave.getCurrentSave().getPlayer().getSelectedDeck(), this::initializeDialogs); } else { initializeDialogs(); } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 151f0aeff69..c83a83a40e3 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -482,8 +482,7 @@ public class GameHUD extends Stage { Current.player().addShards(-data.shardsNeeded); ConsoleCommandInterpreter.getInstance().command(data.commandOnUse); AdventureQuestController.instance().updateItemUsed(data); - }); - button.setStyle(Controls.getTextButtonStyle("menu")); + }, "menu"); abilityButtonMap.add(button); } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 930931ef16d..15729503e1c 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -135,7 +135,9 @@ public abstract class GameStage extends Stage { dialog.clearListeners(); TextraButton ok = Controls.newTextButton("OK", this::hideDialog); ok.setVisible(false); - TypingLabel L = Controls.newTypingLabel("{GRADIENT=CYAN;WHITE;1;1}Strange magical energies flow within this place...{ENDGRADIENT}\nAll opponents get:\n" + effectData.getDescription()); + TypingLabel L = Controls.newTypingLabel("{GRADIENT=CYAN;WHITE;1;1}" + + Forge.getLocalizer().getMessage("lblEffectDialogDescription") + "{ENDGRADIENT}\n" + + Forge.getLocalizer().getMessage("lblEffectDataHeader") + "\n" + effectData.getDescription()); L.setWrap(true); L.setTypingListener(new TypingAdapter() { @Override diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index d745aa92241..ad96a87f1f5 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -820,7 +820,7 @@ public class MapStage extends GameStage { dialog.clearListeners(); TextraButton ok = Controls.newTextButton("OK", this::hideDialog); ok.setVisible(false); - TypingLabel L = Controls.newTypingLabel("{GRADIENT=RED;WHITE;1;1}Defeated and unable to continue, you use the last of your power to escape the area."); + TypingLabel L = Controls.newTypingLabel("{GRADIENT=RED;WHITE;1;1}" + Forge.getLocalizer().getMessage("lblDefeatedDescription")); L.setWrap(true); L.setTypingListener(new TypingAdapter() { @Override diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index 5cf69d32f29..5eb8997bdf7 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -302,6 +302,10 @@ public class Controls { } static public TextraButton newTextButton(String text, Runnable func) { + return newTextButton(text, func, ""); + } + + static public TextraButton newTextButton(String text, Runnable func, String styleName) { TextraButton ret = newTextButton(text); ret.addListener(new ClickListener() { @Override @@ -314,7 +318,8 @@ public class Controls { } } }); - + if (!styleName.isEmpty()) + ret.setStyle(getTextButtonStyle(styleName)); return ret; } diff --git a/forge-gui-mobile/src/forge/adventure/util/KeyBoardDialog.java b/forge-gui-mobile/src/forge/adventure/util/KeyBoardDialog.java index ca81978b2d1..672202b81de 100644 --- a/forge-gui-mobile/src/forge/adventure/util/KeyBoardDialog.java +++ b/forge-gui-mobile/src/forge/adventure/util/KeyBoardDialog.java @@ -123,11 +123,11 @@ public class KeyBoardDialog extends Dialog { key0 = Controls.newTextButton("0", () -> kbLabel.setText(kbLabel.getText()+"0")); keyDot = Controls.newTextButton(".", () -> kbLabel.setText(kbLabel.getText()+".")); keyComma = Controls.newTextButton(",", () -> kbLabel.setText(kbLabel.getText()+",")); - keyShift = Controls.newTextButton("Aa", this::shiftKey); - keyBackspace = Controls.newTextButton("<<", () -> kbLabel.setText(removeLastChar(String.valueOf(kbLabel.getText())))); - keySpace = Controls.newTextButton("SPACE", () -> kbLabel.setText(kbLabel.getText()+" ")); - keyOK = Controls.newTextButton("OK", this::setKeyboardDialogText); - keyAbort = Controls.newTextButton("Abort", this::abortKeyInput); + keyShift = Controls.newTextButton("\u2191", this::shiftKey); + keyBackspace = Controls.newTextButton("\u2190", () -> kbLabel.setText(removeLastChar(String.valueOf(kbLabel.getText())))); + keySpace = Controls.newTextButton("_____", () -> kbLabel.setText(kbLabel.getText()+" ")); + keyOK = Controls.newTextButton("[+OK]", this::setKeyboardDialogText); + keyAbort = Controls.newTextButton("[+Exit]", this::abortKeyInput); this.getContentTable().add(kbLabel).width(220).height(20).colspan(10).expandX().align(Align.center); this.getButtonTable().row(); this.getButtonTable().add(key1).width(20).height(20); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index ad7d783a8a0..3386e9d23a0 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -3033,7 +3033,7 @@ lblLoyalty=Loyaltät lblStandard=Standard lblChaos=Chaos lblPile=Haufen -lblCustom=angepaßt +lblCustom=Angepaßt lblStarterEdition=Beginner-Ausgabe lblElf=Elf lblMetathran=Metathran @@ -3520,4 +3520,9 @@ lblPromptAutoSell=Aufforderung zum Autoverkauf cbAITimeout=AI Time-out nlAITimeout=Zeitüberschreitung in Sekunden für AI, wenn die zu spielenden Zauber berechnet und Angreifer deklariert werden lblAddDeck=Hinzufügen -lblMaxDeckCountReached=Sie haben bereits die maximale Anzahl an Kartendecks erstellt \ No newline at end of file +lblMaxDeckCountReached=Sie haben bereits die maximale Anzahl an Kartendecks erstellt +lblChaosModeDescription=Der Gegner verwendet vorgefertigte oder zufällig generierte Decks. Genetische AI-Decks stehen einigen Gegnern im Schwierigkeitsgrad „Schwer“ zur Verfügung. +lblCustomModeDescription=Einige Feinde verwenden zufällig genetische AI-Decks. +lblEffectDialogDescription=An diesem Ort fließen seltsame magische Energien... +lblEffectDataHeader=Alle Gegner erhalten: +lblDefeatedDescription=Sie sind besiegt und können nicht weitermachen. Mit letzter Kraft versuchen Sie, aus dem Gebiet zu entkommen. \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index c2d48a6e259..4bf7a642cab 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3267,4 +3267,9 @@ lblPromptAutoSell=Prompt for auto sell cbAITimeout=AI Timeout nlAITimeout=Time-out in seconds for AI when computing for spells to play and declaring attackers lblAddDeck=Add -lblMaxDeckCountReached=You've already created the maximum amount of decks \ No newline at end of file +lblMaxDeckCountReached=You've already created the maximum amount of decks +lblChaosModeDescription=Enemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty. +lblCustomModeDescription=Some enemies will use Genetic AI Decks randomly. +lblEffectDialogDescription=Strange magical energies flow within this place... +lblEffectDataHeader=All opponents get: +lblDefeatedDescription=Defeated and unable to continue, you use the last of your power to escape the area. \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index c2a39fc9f0d..93b10998509 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -3524,4 +3524,9 @@ lblPromptAutoSell=Solicitar venta automática cbAITimeout=AI Se acabó el tiempo nlAITimeout=Tiempo de espera en segundos para AI al calcular los hechizos a jugar y declarar atacantes lblAddDeck=Añadir -lblMaxDeckCountReached=Ya has creado la cantidad máxima de mazos \ No newline at end of file +lblMaxDeckCountReached=Ya has creado la cantidad máxima de mazos +lblChaosModeDescription=El enemigo usará mazos preconstruidos o generados aleatoriamente. Algunos enemigos tendrán mazos de AI genética en dificultad Difícil. +lblCustomModeDescription=Algunos enemigos usarán Decks de AI Genéticos aleatoriamente. +lblEffectDialogDescription=Extrañas energías mágicas fluyen dentro de este lugar... +lblEffectDataHeader=Todos los oponentes obtienen: +lblDefeatedDescription=Derrotado e incapaz de continuar, utilizas lo último de tu poder para escapar del área. \ No newline at end of file diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 2807451d49a..407eab60f48 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -3525,4 +3525,9 @@ lblPromptAutoSell=Invite pour la vente automatique cbAITimeout=AI Temps mort nlAITimeout=Délai d'attente en secondes pour AI lors du calcul des sorts à jouer et de la déclaration des attaquants lblAddDeck=Ajouter -lblMaxDeckCountReached=Vous avez déjà créé le montant maximum \ No newline at end of file +lblMaxDeckCountReached=Vous avez déjà créé le montant maximum +lblChaosModeDescription=Les ennemis utiliseront des decks préconstruits ou générés aléatoirement. Certains ennemis pourront utiliser des decks AI génétiques en difficulté Difficile. +lblCustomModeDescription=Certains ennemis utiliseront des decks d'AI génétique de manière aléatoire. +lblEffectDialogDescription=D'étranges énergies magiques circulent dans ce lieu... +lblEffectDataHeader=Tous les adversaires obtiennent: +lblDefeatedDescription=Vaincu et incapable de continuer, vous utilisez le reste de votre pouvoir pour vous échapper de la zone. \ No newline at end of file diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 7c9d4630d96..46297a9c074 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -3523,4 +3523,9 @@ lblPromptAutoSell=Richiesta di vendita auto cbAITimeout=AI Tempo scaduto nlAITimeout=Timeout in secondi per AI durante il calcolo degli incantesimi da giocare e la dichiarazione degli attaccanti lblAddDeck=Aggiungere -lblMaxDeckCountReached=Hai già creato il numero massimo di mazzi \ No newline at end of file +lblMaxDeckCountReached=Hai già creato il numero massimo di mazzi +lblChaosModeDescription=I nemici useranno mazzi precostruiti o generati casualmente. I mazzi AI genetica saranno disponibili per alcuni nemici a difficoltà Difficile. +lblCustomModeDescription=Alcuni nemici useranno i Deck IA genetica in modo casuale. +lblEffectDialogDescription=In questo luogo fluiscono strane energie magiche... +lblEffectDataHeader=Tutti gli avversari ottengono: +lblDefeatedDescription=Sconfitto e impossibilitato a proseguire, usi le ultime energie che ti restano per fuggire dalla zona. \ No newline at end of file diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index e82d2aa482d..4e1f6dfbd56 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -3519,4 +3519,9 @@ lblPromptAutoSell=自動車販売のプロンプト cbAITimeout=AI タイムアウト nlAITimeout=プレイする呪文を計算し、攻撃者を宣言するときの AI のタイムアウト (秒単位) lblAddDeck=追加 -lblMaxDeckCountReached=すでに最大額を作成しました \ No newline at end of file +lblMaxDeckCountReached=すでに最大額を作成しました +lblChaosModeDescription=敵は構築済みデッキまたはランダム生成デッキを使用します。難易度「ハード」では、一部の敵はジェネティックAIデッキを使用することができます。 +lblCustomModeDescription=一部の敵はランダムに Genetic AI デッキを使用します。 +lblEffectDialogDescription=この場所には不思議な魔力が流れている。。。 +lblEffectDataHeader=対戦相手全員が得るもの: +lblDefeatedDescription=敗北し、続行不可能となったあなたは、最後の力を振り絞ってそのエリアから脱出します。 \ No newline at end of file diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 1dc8e9bdea5..2c9f1f35db4 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -3609,4 +3609,9 @@ lblPromptAutoSell=Solicitação de venda automática cbAITimeout=AI Tempo esgotado nlAITimeout=Tempo limite em segundos para AI ao calcular feitiços para jogar e declarar atacantes lblAddDeck=Adicionar -lblMaxDeckCountReached=Você já criou a quantidade máxima de decks \ No newline at end of file +lblMaxDeckCountReached=Você já criou a quantidade máxima de decks +lblChaosModeDescription=O inimigo usará Decks Pré-construídos ou Gerados Aleatoriamente. Decks de AI Genética estarão disponíveis para alguns inimigos na dificuldade Difícil. +lblCustomModeDescription=Alguns inimigos usarão Decks de AI Genética aleatoriamente. +lblEffectDialogDescription=Estranhas energias mágicas fluem dentro deste lugar... +lblEffectDataHeader=Todos os oponentes recebem: +lblDefeatedDescription=Derrotado e incapaz de continuar, você usa o que resta de seu poder para escapar da área. \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index d4d6c462a9a..c08cfbec2aa 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -3510,4 +3510,9 @@ lblPromptAutoSell=提示汽车出售 cbAITimeout=AI 暂停 nlAITimeout=计算要播放的咒语并宣布攻击者时,AI 超时(以秒为单位) lblAddDeck=添加 -lblMaxDeckCountReached=你已经创建了最大数量的卡牌组 \ No newline at end of file +lblMaxDeckCountReached=你已经创建了最大数量的卡牌组 +lblChaosModeDescription=敌人将使用预构筑或随机生成的卡组。部分敌人在困难难度下可以使用基因AI卡组。 +lblCustomModeDescription=一些敌人会随机使用基因 AI 卡组。 +lblEffectDialogDescription=奇怪的魔法能量在这个地方流动。。。 +lblEffectDataHeader=所有对手获得: +lblDefeatedDescription=你被击败了,无法继续前进,你用尽最后的力量逃离了该区域。 \ No newline at end of file From 5dd6a5b45a0d0476ac50fed226b3eb6e5ab523b6 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jul 2025 21:54:49 -0400 Subject: [PATCH 073/183] Revert "Consolidate some PlayEffect logic (#8133)" This reverts commit 514d40aefdaca62d47b32b5a7fa1024203d06047. --- .../java/forge/game/ability/AbilityUtils.java | 19 +++++++++++++----- .../ability/effects/ChangeZoneEffect.java | 4 ---- .../game/ability/effects/RepeatEffect.java | 4 ---- .../main/java/forge/game/player/Player.java | 20 ++++++++++--------- .../spellability/SpellAbilityRestriction.java | 16 +++++++-------- .../cardsfolder/a/alphinaud_leveilleur.txt | 2 +- .../res/cardsfolder/b/bonders_ornament.txt | 4 +++- 7 files changed, 36 insertions(+), 33 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index eea56d276ea..28f26ae520a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3001,15 +3001,24 @@ public class AbilityUtils { for (SpellAbility s : list) { if (s.isLandAbility()) { s.setActivatingPlayer(controller); - if (controller.canPlayLand(tgtCard, true, s)) { + // CR 305.3 + if (controller.getGame().getPhaseHandler().isPlayerTurn(controller) && controller.canPlayLand(tgtCard, true, s)) { sas.add(s); } } else { final Spell newSA = (Spell) s.copy(controller); - newSA.getRestrictions().setZone(null); - newSA.setCastFromPlayEffect(true); - // extra timing restrictions still apply - if (newSA.canPlay()) { + SpellAbilityRestriction res = new SpellAbilityRestriction(); + // timing restrictions still apply + res.setPlayerTurn(s.getRestrictions().getPlayerTurn()); + res.setOpponentTurn(s.getRestrictions().getOpponentTurn()); + res.setPhases(s.getRestrictions().getPhases()); + res.setZone(null); + newSA.setRestrictions(res); + // timing restrictions still apply + if (res.checkTimingRestrictions(tgtCard, newSA) + // still need to check the other restrictions like Aftermath + && res.checkOtherRestrictions(tgtCard, newSA, controller)) { + newSA.setCastFromPlayEffect(true); sas.add(newSA); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 2af1066b637..6944c6fdaf0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -916,10 +916,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect { player = sa.getTargets().getFirstTargetedPlayer(); } - if (!player.isInGame()) { - continue; - } - List origin = Lists.newArrayList(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index c6b4f79b956..4ccb9ca01d9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -66,10 +66,6 @@ public class RepeatEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); - if (game.isGameOver()) { - return false; - } - if (sa.hasParam("RepeatPresent")) { final String repeatPresent = sa.getParam("RepeatPresent"); String repeatCompare = sa.getParamOrDefault("RepeatCompare", "GE1"); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index cc07564aa34..16cc3e9c99f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1705,16 +1705,22 @@ public class Player extends GameEntity implements Comparable { } public final boolean canPlayLand(final Card land, final boolean ignoreZoneAndTiming, SpellAbility landSa) { - // CR 305.3 - if (!game.getPhaseHandler().isPlayerTurn(this)) { - return false; - } - if (!ignoreZoneAndTiming) { + // CR 305.3 + if (!game.getPhaseHandler().isPlayerTurn(this)) { + return false; + } if (!canCastSorcery() && (landSa == null || !landSa.withFlash(land, this))) { return false; } + } + // CantBeCast static abilities + if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { + return false; + } + + if (land != null && !ignoreZoneAndTiming) { final boolean mayPlay = landSa == null ? !land.mayPlay(this).isEmpty() : landSa.getMayPlay() != null; if (land.getOwner() != this && !mayPlay) { return false; @@ -1726,10 +1732,6 @@ public class Player extends GameEntity implements Comparable { } } - if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { - return false; - } - // **** Check for land play limit per turn **** // Dev Mode if (getMaxLandPlaysInfinite()) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 615d27406c6..3a425af9465 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -353,10 +353,6 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { public final boolean checkActivatorRestrictions(final Card c, final SpellAbility sa) { Player activator = sa.getActivatingPlayer(); - if (sa.isCastFromPlayEffect()) { - return true; - } - if (sa.isSpell()) { // Spells should always default to "controller" but use mayPlay check. final CardPlayOption o = c.mayPlay(sa.getMayPlay()); @@ -619,12 +615,14 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { return false; } - if (!checkActivatorRestrictions(c, sa)) { - return false; - } + if (!sa.isCastFromPlayEffect()) { + if (!checkTimingRestrictions(c, sa)) { + return false; + } - if (!checkTimingRestrictions(c, sa)) { - return false; + if (!checkActivatorRestrictions(c, sa)) { + return false; + } } if (!checkZoneRestrictions(c, sa)) { diff --git a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt index 36f71d5faf1..bd923bbb42b 100644 --- a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt +++ b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt @@ -1,7 +1,7 @@ Name:Alphinaud Leveilleur ManaCost:3 U Types:Legendary Creature Elf Wizard -PT:2/4 +PT:3/2 K:Partner:Alisaie Leveilleur K:Vigilance T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ2 | TriggerDescription$ Eukrasia — Whenever you cast your second spell each turn, draw a card. diff --git a/forge-gui/res/cardsfolder/b/bonders_ornament.txt b/forge-gui/res/cardsfolder/b/bonders_ornament.txt index 3fa9ece22e5..2c41a392166 100644 --- a/forge-gui/res/cardsfolder/b/bonders_ornament.txt +++ b/forge-gui/res/cardsfolder/b/bonders_ornament.txt @@ -2,5 +2,7 @@ Name:Bonder's Ornament ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -A:AB$ Draw | Cost$ 4 T | Defined$ Player.controlsPermanent.namedBonder's Ornament | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. +A:AB$ RepeatEach | Cost$ 4 T | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ Player.IsRemembered | ConditionCheckSVar$ OrnCheck | ConditionSVarCompare$ GE1 +SVar:OrnCheck:PlayerCountRemembered$Valid Permanent.namedBonder's Ornament+RememberedPlayerCtrl Oracle:{T}: Add one mana of any color.\n{4}, {T}: Each player who controls a permanent named Bonder's Ornament draws a card. From 94e3c718090dcbb959c5928d18fefdce11a09551 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Jul 2025 11:19:26 +0800 Subject: [PATCH 074/183] fix CardRules setColorID reset --- forge-core/src/main/java/forge/card/CardRules.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index d47dda4e707..4164705a2ee 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -475,6 +475,7 @@ public final class CardRules implements ICardCharacteristics { * Reset all fields to parse next card (to avoid allocating new CardRulesReader N times) */ public final void reset() { + this.setColorID = 0; this.curFace = 0; this.faces[0] = null; this.faces[1] = null; From 7d4369fdcadc5e650f83769d901af2a4e29669c1 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 22 Jul 2025 05:23:57 +0000 Subject: [PATCH 075/183] Cast after warping only for owner (#8148) * Cast after warping only for owner * give effect to owner --------- Co-authored-by: tool4EvEr --- .../main/java/forge/game/ability/effects/ChangeZoneEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 6944c6fdaf0..6f0d22fb263 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -755,7 +755,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (sa.isTrigger() && sa.getTrigger().isKeyword(Keyword.WARP)) { - Card eff = createEffect(sa, activator, "Warped " + sa.getHostCard(), sa.getHostCard().getImageKey()); + Card eff = createEffect(sa, sa.getHostCard().getOwner(), "Warped " + sa.getHostCard(), sa.getHostCard().getImageKey()); StringBuilder sbPlay = new StringBuilder(); sbPlay.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand+!ThisTurnEntered"); sbPlay.append(" | AffectedZone$ Exile | Description$ You may cast the card."); From c7b98bc57890257c8a3fe3286a9fe6edccaa979a Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 22 Jul 2025 06:18:36 +0000 Subject: [PATCH 076/183] Restore some fixes (#8154) --- .../java/forge/game/ability/effects/ChangeZoneEffect.java | 4 ++++ .../main/java/forge/game/ability/effects/RepeatEffect.java | 4 ++++ forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt | 2 +- forge-gui/res/cardsfolder/b/bonders_ornament.txt | 4 +--- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 6f0d22fb263..1dbe07a7956 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -916,6 +916,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { player = sa.getTargets().getFirstTargetedPlayer(); } + if (!player.isInGame()) { + continue; + } + List origin = Lists.newArrayList(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 4ccb9ca01d9..c6b4f79b956 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -66,6 +66,10 @@ public class RepeatEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); + if (game.isGameOver()) { + return false; + } + if (sa.hasParam("RepeatPresent")) { final String repeatPresent = sa.getParam("RepeatPresent"); String repeatCompare = sa.getParamOrDefault("RepeatCompare", "GE1"); diff --git a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt index bd923bbb42b..36f71d5faf1 100644 --- a/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt +++ b/forge-gui/res/cardsfolder/a/alphinaud_leveilleur.txt @@ -1,7 +1,7 @@ Name:Alphinaud Leveilleur ManaCost:3 U Types:Legendary Creature Elf Wizard -PT:3/2 +PT:2/4 K:Partner:Alisaie Leveilleur K:Vigilance T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ2 | TriggerDescription$ Eukrasia — Whenever you cast your second spell each turn, draw a card. diff --git a/forge-gui/res/cardsfolder/b/bonders_ornament.txt b/forge-gui/res/cardsfolder/b/bonders_ornament.txt index 2c41a392166..3fa9ece22e5 100644 --- a/forge-gui/res/cardsfolder/b/bonders_ornament.txt +++ b/forge-gui/res/cardsfolder/b/bonders_ornament.txt @@ -2,7 +2,5 @@ Name:Bonder's Ornament ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -A:AB$ RepeatEach | Cost$ 4 T | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. -SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ Player.IsRemembered | ConditionCheckSVar$ OrnCheck | ConditionSVarCompare$ GE1 -SVar:OrnCheck:PlayerCountRemembered$Valid Permanent.namedBonder's Ornament+RememberedPlayerCtrl +A:AB$ Draw | Cost$ 4 T | Defined$ Player.controlsPermanent.namedBonder's Ornament | SpellDescription$ Each player who controls a permanent named Bonder's Ornament draws a card. Oracle:{T}: Add one mana of any color.\n{4}, {T}: Each player who controls a permanent named Bonder's Ornament draws a card. From e37dac6cbeddf9f33ed01f2306bb484cf1318a51 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Tue, 22 Jul 2025 07:51:57 +0100 Subject: [PATCH 077/183] Update giott_king_of_the_dwarves.txt --- forge-gui/res/cardsfolder/g/giott_king_of_the_dwarves.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/giott_king_of_the_dwarves.txt b/forge-gui/res/cardsfolder/g/giott_king_of_the_dwarves.txt index 7f7edc5d591..15267d2cc4d 100644 --- a/forge-gui/res/cardsfolder/g/giott_king_of_the_dwarves.txt +++ b/forge-gui/res/cardsfolder/g/giott_king_of_the_dwarves.txt @@ -3,6 +3,6 @@ ManaCost:R W Types:Legendary Creature Dwarf Noble PT:1/1 K:Double Strike -T:Mode$ ChangesZone | ValidCard$ Card.Self,Dwarf.YouCtrl,Equipment.YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME or another Dwarf you control enters and whenever an Equipment you control enters, you may discard a card. If you do, draw a card. +T:Mode$ ChangesZone | ValidCard$ Card.Self,Dwarf.Other+YouCtrl,Equipment.YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME or another Dwarf you control enters and whenever an Equipment you control enters, you may discard a card. If you do, draw a card. SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 1 Oracle:Double strike\nWhenever Giott or another Dwarf you control enters and whenever an Equipment you control enters, you may discard a card. If you do, draw a card. From 94feb1b63b8c585d8339b31738987cf4704ad6f0 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Tue, 22 Jul 2025 07:41:52 +0100 Subject: [PATCH 078/183] Add files via upload --- forge-gui/res/cardsfolder/g/gilder_bairn.txt | 2 +- forge-gui/res/cardsfolder/h/hateflayer.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt | 2 +- forge-gui/res/cardsfolder/o/order_of_whiteclay.txt | 2 +- forge-gui/res/cardsfolder/p/pale_wayfarer.txt | 2 +- forge-gui/res/cardsfolder/p/patrol_signaler.txt | 2 +- forge-gui/res/cardsfolder/p/primeval_bounty.txt | 2 +- forge-gui/res/cardsfolder/p/puresight_merrow.txt | 2 +- forge-gui/res/cardsfolder/r/restless_fortress.txt | 2 +- forge-gui/res/cardsfolder/r/ryu_world_warrior.txt | 2 +- forge-gui/res/cardsfolder/s/safehold_sentry.txt | 2 +- forge-gui/res/cardsfolder/s/short_circuit.txt | 4 +--- forge-gui/res/cardsfolder/s/silkbind_faerie.txt | 2 +- forge-gui/res/cardsfolder/s/summon_magus_sisters.txt | 2 +- forge-gui/res/cardsfolder/t/the_aesir_escape_valhalla.txt | 8 ++++---- forge-gui/res/cardsfolder/t/the_creation_of_avacyn.txt | 8 ++++---- forge-gui/res/cardsfolder/y/your_plans_mean_nothing.txt | 4 ++-- forge-gui/res/cardsfolder/y/yunas_decision.txt | 1 - 19 files changed, 25 insertions(+), 28 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/gilder_bairn.txt b/forge-gui/res/cardsfolder/g/gilder_bairn.txt index b99a5468c2b..dfdae5fdbef 100644 --- a/forge-gui/res/cardsfolder/g/gilder_bairn.txt +++ b/forge-gui/res/cardsfolder/g/gilder_bairn.txt @@ -2,6 +2,6 @@ Name:Gilder Bairn ManaCost:1 GU GU Types:Creature Ouphe PT:1/3 -A:AB$ MultiplyCounter | Cost$ 2 GU Untap | ValidTgts$ Permanent | StackDescription$ SpellDescription | SpellDescription$ Double the number of each kind of counter on target permanent. +A:AB$ MultiplyCounter | Cost$ 2 GU Q | ValidTgts$ Permanent | StackDescription$ SpellDescription | SpellDescription$ Double the number of each kind of counter on target permanent. DeckHints:Ability$Counters Oracle:{2}{G/U}, {Q}: Double the number of each kind of counter on target permanent. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/h/hateflayer.txt b/forge-gui/res/cardsfolder/h/hateflayer.txt index c010030bfe1..a158d075513 100644 --- a/forge-gui/res/cardsfolder/h/hateflayer.txt +++ b/forge-gui/res/cardsfolder/h/hateflayer.txt @@ -3,6 +3,6 @@ ManaCost:5 R R Types:Creature Elemental PT:5/5 K:Wither -A:AB$ DealDamage | Cost$ 2 R Untap | ValidTgts$ Any | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to any target. +A:AB$ DealDamage | Cost$ 2 R Q | ValidTgts$ Any | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to any target. SVar:X:Count$CardPower Oracle:Wither (This deals damage to creatures in the form of -1/-1 counters.)\n{2}{R}, {Q}: Hateflayer deals damage equal to its power to any target. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt b/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt index 9fd6a7d719b..ab1b16dbaba 100644 --- a/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt +++ b/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt @@ -2,6 +2,6 @@ Name:Merrow Grimeblotter ManaCost:3 UB Types:Creature Merfolk Wizard PT:2/2 -A:AB$ Pump | Cost$ 1 UB Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. +A:AB$ Pump | Cost$ 1 UB Q | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. AI:RemoveDeck:All Oracle:{1}{U/B}, {Q}: Target creature gets -2/-0 until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt b/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt index cebb466a37d..97fb1c01fa9 100644 --- a/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt +++ b/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt @@ -2,6 +2,6 @@ Name:Merrow Wavebreakers ManaCost:4 U Types:Creature Merfolk Soldier PT:3/3 -A:AB$ Pump | Cost$ 1 U Untap | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. +A:AB$ Pump | Cost$ 1 U Q | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. AI:RemoveDeck:All Oracle:{1}{U}, {Q}: Merrow Wavebreakers gains flying until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/o/order_of_whiteclay.txt b/forge-gui/res/cardsfolder/o/order_of_whiteclay.txt index 265b57ef2ad..b2d560615ec 100644 --- a/forge-gui/res/cardsfolder/o/order_of_whiteclay.txt +++ b/forge-gui/res/cardsfolder/o/order_of_whiteclay.txt @@ -2,5 +2,5 @@ Name:Order of Whiteclay ManaCost:1 W W Types:Creature Kithkin Cleric PT:1/4 -A:AB$ ChangeZone | Cost$ 1 W W Untap | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.cmcLE3+YouCtrl | TgtPrompt$ Select target creature card with mana value 3 or less in your graveyard | ChangeNum$ 1 | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. +A:AB$ ChangeZone | Cost$ 1 W W Q | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.cmcLE3+YouCtrl | TgtPrompt$ Select target creature card with mana value 3 or less in your graveyard | ChangeNum$ 1 | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. Oracle:{1}{W}{W}, {Q}: Return target creature card with mana value 3 or less from your graveyard to the battlefield. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/pale_wayfarer.txt b/forge-gui/res/cardsfolder/p/pale_wayfarer.txt index 11b0688a9c2..271e7b3c0ad 100644 --- a/forge-gui/res/cardsfolder/p/pale_wayfarer.txt +++ b/forge-gui/res/cardsfolder/p/pale_wayfarer.txt @@ -2,6 +2,6 @@ Name:Pale Wayfarer ManaCost:5 W W Types:Creature Spirit Giant PT:4/4 -A:AB$ Protection | Cost$ 2 W W Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choices$ AnyColor | Choser$ Controller | SpellDescription$ Target creature gains protection from the color of its controller's choice until end of turn. +A:AB$ Protection | Cost$ 2 W W Q | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choices$ AnyColor | Choser$ Controller | SpellDescription$ Target creature gains protection from the color of its controller's choice until end of turn. AI:RemoveDeck:All Oracle:{2}{W}{W}, {Q}: Target creature gains protection from the color of its controller's choice until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/patrol_signaler.txt b/forge-gui/res/cardsfolder/p/patrol_signaler.txt index 697e3549247..769b66bf2f4 100644 --- a/forge-gui/res/cardsfolder/p/patrol_signaler.txt +++ b/forge-gui/res/cardsfolder/p/patrol_signaler.txt @@ -2,5 +2,5 @@ Name:Patrol Signaler ManaCost:1 W Types:Creature Kithkin Soldier PT:1/1 -A:AB$ Token | Cost$ 1 W Untap | TokenAmount$ 1 | TokenScript$ w_1_1_kithkin_soldier | TokenOwner$ You | SpellDescription$ Create a 1/1 white Kithkin Soldier creature token. +A:AB$ Token | Cost$ 1 W Q | TokenAmount$ 1 | TokenScript$ w_1_1_kithkin_soldier | TokenOwner$ You | SpellDescription$ Create a 1/1 white Kithkin Soldier creature token. Oracle:{1}{W}, {Q}: Create a 1/1 white Kithkin Soldier creature token. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/primeval_bounty.txt b/forge-gui/res/cardsfolder/p/primeval_bounty.txt index 4bfe6fbc5df..96d74aa2cc7 100644 --- a/forge-gui/res/cardsfolder/p/primeval_bounty.txt +++ b/forge-gui/res/cardsfolder/p/primeval_bounty.txt @@ -8,4 +8,4 @@ SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 3 | ValidTg T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Landfall — Whenever a land you control enters, you gain 3 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 SVar:BuffedBy:nonCreature -Oracle:Whenever you cast a creature spell, create a 3/3 green Beast creature token.\nWhenever you cast a noncreature spell, put three +1/+1 counters on target creature you control.\Landfall — nWhenever a land you control enters, you gain 3 life. +Oracle:Whenever you cast a creature spell, create a 3/3 green Beast creature token.\nWhenever you cast a noncreature spell, put three +1/+1 counters on target creature you control.\nLandfall — nWhenever a land you control enters, you gain 3 life. diff --git a/forge-gui/res/cardsfolder/p/puresight_merrow.txt b/forge-gui/res/cardsfolder/p/puresight_merrow.txt index c313aa017d5..d6220e07dc3 100644 --- a/forge-gui/res/cardsfolder/p/puresight_merrow.txt +++ b/forge-gui/res/cardsfolder/p/puresight_merrow.txt @@ -2,6 +2,6 @@ Name:Puresight Merrow ManaCost:WU WU Types:Creature Merfolk Wizard PT:2/2 -A:AB$ Dig | Cost$ WU Untap | DigNum$ 1 | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 | Optional$ True | SpellDescription$ Look at the top card of your library. You may exile that card. +A:AB$ Dig | Cost$ WU Q | DigNum$ 1 | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 | Optional$ True | SpellDescription$ Look at the top card of your library. You may exile that card. AI:RemoveDeck:All Oracle:{W/U}, {Q}: Look at the top card of your library. You may exile that card. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/r/restless_fortress.txt b/forge-gui/res/cardsfolder/r/restless_fortress.txt index 9024177e869..26d55e5eb24 100644 --- a/forge-gui/res/cardsfolder/r/restless_fortress.txt +++ b/forge-gui/res/cardsfolder/r/restless_fortress.txt @@ -10,4 +10,4 @@ SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 SVar:HasAttackEffect:TRUE DeckHas:Ability$LifeGain & Type$Nightmare & Color$White|Black -Oracle:Restless Fortress enters tapped.\n{T}: Add {W} or {B}.\n\n{2}{W}{B}: Restless Fortress becomes a 1/4 white and black Nightmare creature until end of turn. It's still a land.\nWhenever Restless Fortress attacks, defending player loses 2 life and you gain 2 life. +Oracle:Restless Fortress enters tapped.\n{T}: Add {W} or {B}.\n{2}{W}{B}: Restless Fortress becomes a 1/4 white and black Nightmare creature until end of turn. It's still a land.\nWhenever Restless Fortress attacks, defending player loses 2 life and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/r/ryu_world_warrior.txt b/forge-gui/res/cardsfolder/r/ryu_world_warrior.txt index 4a9bcc6ab5a..306db9b9d21 100644 --- a/forge-gui/res/cardsfolder/r/ryu_world_warrior.txt +++ b/forge-gui/res/cardsfolder/r/ryu_world_warrior.txt @@ -4,7 +4,7 @@ ManaCost:2 W Types:Legendary Creature Human Warrior PT:2/4 K:Training -A:AB$ DealDamage | PrecostDesc$ Hadoken — | Cost$ 4 R Untap Discard<1/Card> | ValidTgts$ Any | NumDmg$ X | AILogic$ PowerDmg | ExcessSVar$ Excess | ExcessSVarCondition$ Creature | SubAbility$ DBDraw | SpellDescription$ CARDNAME deals damage equal to his power to any target. +A:AB$ DealDamage | PrecostDesc$ Hadoken — | Cost$ 4 R Q Discard<1/Card> | ValidTgts$ Any | NumDmg$ X | AILogic$ PowerDmg | ExcessSVar$ Excess | ExcessSVarCondition$ Creature | SubAbility$ DBDraw | SpellDescription$ CARDNAME deals damage equal to his power to any target. SVar:DBDraw:DB$ Draw | ConditionCheckSVar$ Excess | IfDesc$ True | SpellDescription$ If excess damage was dealt to a creature this way, draw a card. ({Q} is the untap symbol.) SVar:X:Count$CardPower DeckHas:Ability$Counters|Discard diff --git a/forge-gui/res/cardsfolder/s/safehold_sentry.txt b/forge-gui/res/cardsfolder/s/safehold_sentry.txt index d6a33e08359..8f434105473 100644 --- a/forge-gui/res/cardsfolder/s/safehold_sentry.txt +++ b/forge-gui/res/cardsfolder/s/safehold_sentry.txt @@ -2,5 +2,5 @@ Name:Safehold Sentry ManaCost:1 W Types:Creature Elf Warrior PT:2/2 -A:AB$ Pump | Cost$ 2 W Untap | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. +A:AB$ Pump | Cost$ 2 W Q | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. Oracle:{2}{W}, {Q}: Safehold Sentry gets +0/+2 until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/s/short_circuit.txt b/forge-gui/res/cardsfolder/s/short_circuit.txt index 43c613bf0ab..43292ecc9bb 100644 --- a/forge-gui/res/cardsfolder/s/short_circuit.txt +++ b/forge-gui/res/cardsfolder/s/short_circuit.txt @@ -3,9 +3,7 @@ ManaCost:1 U Types:Enchantment Aura K:Flash K:Enchant:Creature,Artifact:artifact or creature -SVar:AttachAITgts:Creature -SVar:AttachAILogic:Curse -SVar:AttachAITgts:Creature +SVar:AttachAITgts:Creature,Vehicle SVar:AttachAILogic:Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -3 | RemoveKeyword$ Flying | Description$ As long as enchanted permanent is a creature, it gets -3/-0 and loses flying. Oracle:Flash\nEnchant artifact or creature\nAs long as enchanted permanent is a creature, it gets -3/-0 and loses flying. diff --git a/forge-gui/res/cardsfolder/s/silkbind_faerie.txt b/forge-gui/res/cardsfolder/s/silkbind_faerie.txt index 67ac3835782..3f15aeeae90 100644 --- a/forge-gui/res/cardsfolder/s/silkbind_faerie.txt +++ b/forge-gui/res/cardsfolder/s/silkbind_faerie.txt @@ -3,5 +3,5 @@ ManaCost:2 WU Types:Creature Faerie Rogue PT:1/3 K:Flying -A:AB$ Tap | Cost$ 1 WU Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. +A:AB$ Tap | Cost$ 1 WU Q | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. Oracle:Flying\n{1}{W/U}, {Q}: Tap target creature. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/s/summon_magus_sisters.txt b/forge-gui/res/cardsfolder/s/summon_magus_sisters.txt index 310fc6edc63..24373217f84 100644 --- a/forge-gui/res/cardsfolder/s/summon_magus_sisters.txt +++ b/forge-gui/res/cardsfolder/s/summon_magus_sisters.txt @@ -9,4 +9,4 @@ SVar:DBDefense:DB$ PutCounter | ValidTgts$ Creature | CounterType$ SHIELD | Coun SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 SVar:DBFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select up to one target creature an opponent controls | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Fight! — This creature fights up to one target creature an opponent controls. K:Haste -Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI,II,III — Choose one at random —\n• Combine Powers! — Put three +1/+1 counters on target creature.\n• Defense! — Put a shield counter on target creature. You gain 3 life.\n• Fight! — This creature fights up to one target creature an opponent controls.\nHaste +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI, II, III — Choose one at random —\n• Combine Powers! — Put three +1/+1 counters on target creature.\n• Defense! — Put a shield counter on target creature. You gain 3 life.\n• Fight! — This creature fights up to one target creature an opponent controls.\nHaste diff --git a/forge-gui/res/cardsfolder/t/the_aesir_escape_valhalla.txt b/forge-gui/res/cardsfolder/t/the_aesir_escape_valhalla.txt index 3093debb875..91be95f69d5 100644 --- a/forge-gui/res/cardsfolder/t/the_aesir_escape_valhalla.txt +++ b/forge-gui/res/cardsfolder/t/the_aesir_escape_valhalla.txt @@ -1,10 +1,10 @@ Name:The Aesir Escape Valhalla ManaCost:2 G Types:Enchantment Saga -K:Chapter:3:I,II,III -SVar:I:DB$ ChangeZone | ChangeNum$ 1 | ChangeType$ Permanent.YouOwn | Mandatory$ True | Origin$ Graveyard | Destination$ Exile | Hidden$ True | RememberChanged$ True | SubAbility$ DBGainLife | SpellDescription$ Exile a permanent card from your graveyard. You gain life equal to its mana value. +K:Chapter:3:DBExile,DBPutCounter,DBReturn +SVar:DBExile:DB$ ChangeZone | ChangeNum$ 1 | ChangeType$ Permanent.YouOwn | Mandatory$ True | Origin$ Graveyard | Destination$ Exile | Hidden$ True | RememberChanged$ True | SubAbility$ DBGainLife | SpellDescription$ Exile a permanent card from your graveyard. You gain life equal to its mana value. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ Remembered$CardManaCost | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:II:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ ExiledWith$CardManaCost | SpellDescription$ Put a number of +1/+1 counters on target creature you control equal to the mana value of the exiled card. -SVar:III:DB$ ChangeZone | Defined$ Self & ExiledWith | Origin$ Battlefield,Exile | Destination$ Hand | SpellDescription$ Return CARDNAME and the exiled card to their owner's hand. +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ ExiledWith$CardManaCost | SpellDescription$ Put a number of +1/+1 counters on target creature you control equal to the mana value of the exiled card. +SVar:DBReturn:DB$ ChangeZone | Defined$ Self & ExiledWith | Origin$ Battlefield,Exile | Destination$ Hand | SpellDescription$ Return CARDNAME and the exiled card to their owner's hand. Oracle:(As this Saga enters and after your draw step, add a lore counter.)\nI — Exile a permanent card from your graveyard. You gain life equal to its mana value.\nII — Put a number of +1/+1 counters on target creature you control equal to the mana value of the exiled card.\nIII — Return The Aesir Escape Valhalla and the exiled card to their owner's hand. diff --git a/forge-gui/res/cardsfolder/t/the_creation_of_avacyn.txt b/forge-gui/res/cardsfolder/t/the_creation_of_avacyn.txt index 1046293c050..540169abd8c 100644 --- a/forge-gui/res/cardsfolder/t/the_creation_of_avacyn.txt +++ b/forge-gui/res/cardsfolder/t/the_creation_of_avacyn.txt @@ -1,10 +1,10 @@ Name:The Creation of Avacyn ManaCost:1 B B Types:Enchantment Saga -K:Chapter:3:I,II,III -SVar:I:DB$ ChangeZone | ChangeNum$ 1 | ChangeType$ Card | Mandatory$ True | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | SpellDescription$ Search your library for a card, exile it face down, then shuffle. -SVar:II:DB$ SetState | Defined$ ExiledWith | Mode$ TurnFaceUp | SubAbility$ DBLoseLife | SpellDescription$ Turn the exiled card face up. If it's a creature card, you lose life equal to its mana value. +K:Chapter:3:DBExile,DBSetState,DBReturn +SVar:DBExile:DB$ ChangeZone | ChangeNum$ 1 | ChangeType$ Card | Mandatory$ True | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | SpellDescription$ Search your library for a card, exile it face down, then shuffle. +SVar:DBSetState:DB$ SetState | Defined$ ExiledWith | Mode$ TurnFaceUp | SubAbility$ DBLoseLife | SpellDescription$ Turn the exiled card face up. If it's a creature card, you lose life equal to its mana value. SVar:DBLoseLife:DB$ LoseLife | ConditionDefined$ ExiledWith | ConditionPresent$ Creature | LifeAmount$ ExiledWith$CardManaCost -SVar:III:DB$ ChangeZone | Optional$ True | Defined$ ExiledWith | Origin$ Exile | Destination$ Battlefield | ConditionDefined$ ExiledWith | ConditionPresent$ Creature | SubAbility$ DBChangeZone | SpellDescription$ You may put the exiled card onto the battlefield if it's a creature card. If you don't put it onto the battlefield, put it into its owner's hand. +SVar:DBReturn:DB$ ChangeZone | Optional$ True | Defined$ ExiledWith | Origin$ Exile | Destination$ Battlefield | ConditionDefined$ ExiledWith | ConditionPresent$ Creature | SubAbility$ DBChangeZone | SpellDescription$ You may put the exiled card onto the battlefield if it's a creature card. If you don't put it onto the battlefield, put it into its owner's hand. SVar:DBChangeZone:DB$ ChangeZone | Defined$ ExiledWith | Origin$ Exile | Destination$ Hand Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Search your library for a card, exile it face down, then shuffle.\nII — Turn the exiled card face up. If it's a creature card, you lose life equal to its mana value.\nIII — You may put the exiled card onto the battlefield if it's a creature card. If you don't put it onto the battlefield, put it into its owner's hand. diff --git a/forge-gui/res/cardsfolder/y/your_plans_mean_nothing.txt b/forge-gui/res/cardsfolder/y/your_plans_mean_nothing.txt index 56be9794cef..437aaaa1e81 100644 --- a/forge-gui/res/cardsfolder/y/your_plans_mean_nothing.txt +++ b/forge-gui/res/cardsfolder/y/your_plans_mean_nothing.txt @@ -2,12 +2,12 @@ Name:Your Plans Mean Nothing ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DBChoosePlayer | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, any number of target players each discard their hands. Each opponent draws cards equal to the number of cards that player discarded minus one. Then if you discarded a card this way, draw seven cards. -SVar:DBChoosePlayer:DB$ Pump | ValidTgts$ Player | TargetMin$ 0 | TargetMax$ PlayerCount | TgtPrompt$ Choose any number of players | SubAbility$ DBRepeat +SVar:DBChoosePlayer:DB$ Pump | ValidTgts$ Player | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Choose any number of players | SubAbility$ DBRepeat SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Targeted | RepeatSubAbility$ DBDiscard | SubAbility$ DBYouDraw | SpellDescription$ Each opponent draws cards equal to the number of cards that player discarded minus one. Then if you discarded a card this way, draw seven cards. SVar:DBDiscard:DB$ Discard | Defined$ Remembered | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ Player.Opponent+IsRemembered SVar:DBYouDraw:DB$ Draw | Defined$ You | NumCards$ 7 | ConditionDefined$ Remembered | ConditionPresent$ Card.YouOwn | SubAbility$ DBClearRemembered SVar:DBClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:PlayerCount:PlayerCountPlayers$Amount +SVar:MaxTgts:PlayerCountPlayers$Amount SVar:X:Remembered$Valid Card.RememberedPlayerOwn/Minus.1 Oracle:When you set this scheme in motion, any number of target players each discard their hands. Each opponent draws cards equal to the number of cards that player discarded minus one. Then if you discarded a card this way, draw seven cards. diff --git a/forge-gui/res/cardsfolder/y/yunas_decision.txt b/forge-gui/res/cardsfolder/y/yunas_decision.txt index b4ad65d1866..687a972dcb8 100644 --- a/forge-gui/res/cardsfolder/y/yunas_decision.txt +++ b/forge-gui/res/cardsfolder/y/yunas_decision.txt @@ -2,7 +2,6 @@ Name:Yuna's Decision ManaCost:3 G Types:Sorcery A:SP$ Charm | Choices$ DBSacrifice,DBReturn -SVar:DBSacrifice:DB$ SVar:DBSacrifice:DB$ Sacrifice | SacValid$ Creature | RememberSacrificed$ True | SubAbility$ DBDraw | SpellDescription$ Continue the Pilgrimage — Sacrifice a creature. If you do, draw a card, then you may put a creature card and/or a land card from your hand onto the battlefield. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | SubAbility$ DBChangeZone | StackDescription$ None SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ EACH Creature & Land | ChangeTypeDesc$ creature and/or land card | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | Optional$ True | SubAbility$ DBCleanup | StackDescription$ None From 8293d4de635f6c482e0c9314657facb47bd0e033 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 22 Jul 2025 10:41:06 +0200 Subject: [PATCH 079/183] Update Edge of Eternities.txt Add Emblem --- forge-gui/res/editions/Edge of Eternities.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index a0cc09294a7..912617ecd07 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -425,3 +425,6 @@ ScryfallCode=EOE 8 c_a_lander_sac_search @Jorge Jacinto 9 munitions @Leonardo Santanna 10 c_2_2_a_robot @Leonardo Santanna + +[other] +11 emblem_tezzeret_cruel_captain @Chris Rahn From 977d46bca53a7494981b4b40b70350c91d5c6803 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Jul 2025 19:17:57 +0800 Subject: [PATCH 080/183] Prevents crashes when calculating soft buttons bar height --- .../com/badlogic/gdx/backends/android/DefaultAndroidInput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-android/src/com/badlogic/gdx/backends/android/DefaultAndroidInput.java b/forge-gui-android/src/com/badlogic/gdx/backends/android/DefaultAndroidInput.java index 7eac411a8e7..9fc69729d33 100644 --- a/forge-gui-android/src/com/badlogic/gdx/backends/android/DefaultAndroidInput.java +++ b/forge-gui-android/src/com/badlogic/gdx/backends/android/DefaultAndroidInput.java @@ -630,7 +630,7 @@ public class DefaultAndroidInput extends AbstractInput implements AndroidInput, private TextInputWrapper textInputWrapper; private int getSoftButtonsBarHeight () { - AndroidApplication androidApplication = (AndroidApplication)Gdx.app; + AndroidApplication androidApplication = (AndroidApplication)app; DisplayMetrics metrics = new DisplayMetrics(); androidApplication.getWindowManager().getDefaultDisplay().getMetrics(metrics); From d3a13d45159e7b18d40ceb0ad2b74f2b3c7a8f98 Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Tue, 22 Jul 2025 18:14:19 +0100 Subject: [PATCH 081/183] Update draft rankings --- forge-gui/res/draft/rankings/dft.rnk | 548 ++++++++++---------- forge-gui/res/draft/rankings/fin.rnk | 722 +++++++++++++-------------- forge-gui/res/draft/rankings/pio.rnk | 56 +-- forge-gui/res/draft/rankings/tdm.rnk | 550 ++++++++++---------- 4 files changed, 938 insertions(+), 938 deletions(-) diff --git a/forge-gui/res/draft/rankings/dft.rnk b/forge-gui/res/draft/rankings/dft.rnk index d2d032551f2..15694c4e9b9 100644 --- a/forge-gui/res/draft/rankings/dft.rnk +++ b/forge-gui/res/draft/rankings/dft.rnk @@ -1,285 +1,285 @@ //Rank|Name|Rarity|Set #1|Mu Yanling, Wind Rider|M|DFT -#2|Salvation Engine|M|DFT -#3|Spectacular Pileup|R|DFT -#4|Valor's Flagship|M|DFT -#5|Possession Engine|R|DFT -#6|Gonti, Night Minister|R|DFT -#7|Chandra, Spark Hunter|M|DFT -#8|Pyrewood Gearhulk|M|DFT -#9|Skysovereign, Consul Flagship|M|SPG -#10|Draconautics Engineer|R|DFT -#11|Pathbreaker Ibex|M|SPG -#12|Guardian Sunmare|R|DFT -#13|Voyager Glidecar|R|DFT -#14|Thopter Fabricator|R|DFT -#15|March of the World Ooze|M|DFT -#16|Thunderous Velocipede|M|DFT -#17|Explosive Getaway|R|DFT -#18|Loot, the Pathfinder|M|DFT -#19|The Speed Demon|M|DFT -#20|Agonasaur Rex|R|DFT -#21|Basri, Tomorrow's Champion|R|DFT -#22|Bulwark Ox|R|DFT -#23|Perilous Snare|R|DFT -#24|Cryptcaller Chariot|R|DFT -#25|Cursecloth Wrappings|R|DFT -#26|Lumbering Worldwagon|R|DFT -#27|Regal Imperiosaur|R|DFT -#28|Aatchik, Emerald Radian|R|DFT -#29|Debris Beetle|R|DFT -#30|Mendicant Core, Guidelight|R|DFT -#31|Mimeoplasm, Revered One|M|DFT -#32|Riptide Gearhulk|M|DFT -#33|Sab-Sunen, Luxa Embodied|M|DFT -#34|The Aetherspark|M|DFT -#35|Bone Miser|M|SPG -#36|Lord of the Undead|M|SPG -#37|Chandra's Ignition|M|SPG -#38|Skyseer's Chariot|R|DFT -#39|Boommobile|R|DFT -#40|Howlsquad Heavy|R|DFT -#41|Oildeep Gearhulk|M|DFT -#42|Samut, the Driving Force|R|DFT -#43|Zahur, Glory's Past|R|DFT -#44|Demonic Junker|R|DFT -#45|District Mascot|R|DFT -#46|Brightglass Gearhulk|M|DFT -#47|Caradora, Heart of Alacria|R|DFT +#2|Skysovereign, Consul Flagship|M|SPG +#3|Draconautics Engineer|R|DFT +#4|Pyrewood Gearhulk|M|DFT +#5|Riptide Gearhulk|M|DFT +#6|Howlsquad Heavy|R|DFT +#7|Possession Engine|R|DFT +#8|Thopter Fabricator|R|DFT +#9|Thunderous Velocipede|M|DFT +#10|Aatchik, Emerald Radian|R|DFT +#11|Debris Beetle|R|DFT +#12|Sab-Sunen, Luxa Embodied|M|DFT +#13|Burnout Bashtronaut|R|DFT +#14|Chandra, Spark Hunter|M|DFT +#15|Agonasaur Rex|R|DFT +#16|Explosive Getaway|R|DFT +#17|The Aetherspark|M|DFT +#18|Spectacular Pileup|R|DFT +#19|Afterburner Expert|R|DFT +#20|Basri, Tomorrow's Champion|R|DFT +#21|Bulwark Ox|R|DFT +#22|Salvation Engine|M|DFT +#23|Boommobile|R|DFT +#24|Caradora, Heart of Alacria|R|DFT +#25|Embalmed Ascendant|U|DFT +#26|Loot, the Pathfinder|M|DFT +#27|Gloryheath Lynx|U|DFT +#28|Guardian Sunmare|R|DFT +#29|Perilous Snare|R|DFT +#30|Voyager Glidecar|R|DFT +#31|Demonic Junker|R|DFT +#32|District Mascot|R|DFT +#33|Brightglass Gearhulk|M|DFT +#34|Captain Howler, Sea Scourge|R|DFT +#35|Cloudspire Coordinator|U|DFT +#36|Skyserpent Seeker|U|DFT +#37|Spikeshell Harrier|U|DFT +#38|The Speed Demon|M|DFT +#39|Haunt the Network|U|DFT +#40|Mendicant Core, Guidelight|R|DFT +#41|Marketback Walker|R|DFT +#42|Road Rage|U|DFT +#43|Broadside Barrage|U|DFT +#44|Nesting Bot|U|DFT +#45|Valor's Flagship|M|DFT +#46|Transit Mage|U|DFT +#47|March of the World Ooze|M|DFT #48|Coalstoke Gearhulk|M|DFT #49|Far Fortune, End Boss|R|DFT -#50|Kolodin, Triumph Caster|R|DFT -#51|Redshift, Rocketeer Chief|R|DFT -#52|Winter, Cursed Rider|R|DFT -#53|Lifecraft Engine|R|DFT -#54|Dracosaur Auxiliary|U|DFT -#55|Gastal Thrillroller|R|DFT -#56|Haunt the Network|U|DFT -#57|Rangers' Aetherhive|U|DFT -#58|Skyserpent Seeker|U|DFT -#59|Gastal Thrillseeker|U|DFT -#60|Cavalier of Dawn|M|SPG -#61|Canyon Vaulter|U|DFT -#62|Cloudspire Captain|U|DFT -#63|Nesting Bot|U|DFT -#64|Roadside Assistance|U|DFT -#65|Unswerving Sloth|U|DFT -#66|Mindspring Merfolk|R|DFT -#67|Transit Mage|U|DFT -#68|Vnwxt, Verbose Host|R|DFT -#69|Carrion Cruiser|U|DFT -#70|Gas Guzzler|R|DFT -#71|Burnout Bashtronaut|R|DFT -#72|Full Throttle|R|DFT -#73|Hazoret, Godseeker|M|DFT -#74|Reckless Velocitaur|U|DFT -#75|Spire Mechcycle|U|DFT -#76|Afterburner Expert|R|DFT -#77|Autarch Mammoth|U|DFT -#78|Oviya, Automech Artisan|R|DFT -#79|Webstrike Elite|R|DFT -#80|Apocalypse Runner|U|DFT -#81|Captain Howler, Sea Scourge|R|DFT -#82|Cloudspire Skycycle|U|DFT -#83|Embalmed Ascendant|U|DFT -#84|Fearless Swashbuckler|R|DFT -#85|Guidelight Pathmaker|U|DFT -#86|Haunted Hellride|U|DFT -#87|Ketramose, the New Dawn|M|DFT -#88|Lagorin, Soul of Alacria|U|DFT -#89|Sita Varma, Masked Racer|R|DFT -#90|Veteran Beastrider|U|DFT -#91|Marketback Walker|R|DFT -#92|Monument to Endurance|R|DFT -#93|Plow Through|U|DFT -#94|Air Response Unit|U|DFT -#95|Collision Course|C|DFT -#96|Hulldrifter|C|DFT -#97|Rangers' Refueler|U|DFT -#98|Risen Necroregent|U|DFT -#99|Outpace Oblivion|U|DFT -#100|Elvish Refueler|U|DFT -#101|Boom Scholar|U|DFT -#102|Cloudspire Coordinator|U|DFT -#103|Rocketeer Boostbuggy|U|DFT -#104|Voyage Home|U|DFT -#105|Sabotage Strategist|U|DFT -#106|Scrounging Skyray|U|DFT -#107|Thoughtcast|M|SPG -#108|Galvanic Blast|M|SPG -#109|Gloryheath Lynx|U|DFT -#110|Interface Ace|C|DFT -#111|Spotcycle Scouter|C|DFT -#112|Flood the Engine|C|DFT -#113|Spikeshell Harrier|U|DFT -#114|Waxen Shapethief|R|DFT -#115|Grim Bauble|C|DFT +#50|Oildeep Gearhulk|M|DFT +#51|Veteran Beastrider|U|DFT +#52|Gastal Thrillseeker|U|DFT +#53|Chandra's Ignition|M|SPG +#54|Skyseer's Chariot|R|DFT +#55|Quag Feast|R|DFT +#56|Gastal Thrillroller|R|DFT +#57|Hazoret, Godseeker|M|DFT +#58|Autarch Mammoth|U|DFT +#59|Webstrike Elite|R|DFT +#60|Rangers' Aetherhive|U|DFT +#61|Rocketeer Boostbuggy|U|DFT +#62|Sita Varma, Masked Racer|R|DFT +#63|Winter, Cursed Rider|R|DFT +#64|Scrounging Skyray|U|DFT +#65|Mindspring Merfolk|R|DFT +#66|Vnwxt, Verbose Host|R|DFT +#67|Cryptcaller Chariot|R|DFT +#68|Gonti, Night Minister|R|DFT +#69|Greasewrench Goblin|U|DFT +#70|Lightning Strike|C|DFT +#71|Marauding Mako|U|DFT +#72|Lumbering Worldwagon|R|DFT +#73|Regal Imperiosaur|R|DFT +#74|Fearless Swashbuckler|R|DFT +#75|Kolodin, Triumph Caster|R|DFT +#76|Lagorin, Soul of Alacria|U|DFT +#77|Redshift, Rocketeer Chief|R|DFT +#78|Voyage Home|U|DFT +#79|Zahur, Glory's Past|R|DFT +#80|Lifecraft Engine|R|DFT +#81|Cavalier of Dawn|M|SPG +#82|Diversion Unit|U|DFT +#83|Cursecloth Wrappings|R|DFT +#84|Gas Guzzler|R|DFT +#85|Dracosaur Auxiliary|U|DFT +#86|Outpace Oblivion|U|DFT +#87|Spire Mechcycle|U|DFT +#88|Greenbelt Guardian|U|DFT +#89|Boosted Sloop|U|DFT +#90|Cloudspire Skycycle|U|DFT +#91|Guidelight Pathmaker|U|DFT +#92|Nimble Thopterist|C|DFT +#93|Fang Guardian|U|DFT +#94|Plow Through|U|DFT +#95|Galvanic Blast|M|SPG +#96|Rangers' Refueler|U|DFT +#97|Roadside Blowout|U|DFT +#98|Waxen Shapethief|R|DFT +#99|Carrion Cruiser|U|DFT +#100|Grim Bauble|C|DFT +#101|Pactdoll Terror|C|DFT +#102|Fang-Druid Summoner|U|DFT +#103|Samut, the Driving Force|R|DFT +#104|Bleachbone Verge|R|DFT +#105|Night Market|C|DFT +#106|Riverpyre Verge|R|DFT +#107|Sunbillow Verge|R|DFT +#108|Wastewood Verge|R|DFT +#109|Willowrush Verge|R|DFT +#110|Sundial, Dawn Tyrant|U|DFT +#111|Wreckage Wickerfolk|C|DFT +#112|Skycrash|U|DFT +#113|Canyon Vaulter|U|DFT +#114|Cloudspire Captain|U|DFT +#115|Back on Track|U|DFT #116|Momentum Breaker|U|DFT -#117|Endrider Catalyzer|C|DFT -#118|Gastal Blockbuster|C|DFT -#119|Greasewrench Goblin|U|DFT -#120|Lightning Strike|C|DFT -#121|Marauding Mako|U|DFT -#122|Dune Drifter|U|DFT -#123|Thundering Broodwagon|U|DFT -#124|Road Rage|U|DFT -#125|Broadside Barrage|U|DFT -#126|Detention Chariot|U|DFT -#127|Lightshield Parry|C|DFT -#128|Diversion Unit|U|DFT -#129|Bloodghast|R|DFT -#130|Hour of Victory|U|DFT -#131|Pactdoll Terror|C|DFT -#132|Quag Feast|R|DFT -#133|Count on Luck|R|DFT -#134|Daretti, Rocketeer Engineer|R|DFT -#135|Gilded Ghoda|C|DFT -#136|Tyrox, Saurid Tyrant|U|DFT -#137|Fang-Druid Summoner|U|DFT -#138|Ooze Patrol|U|DFT -#139|Terrian, World Tyrant|U|DFT -#140|Boosted Sloop|U|DFT -#141|Leonin Surveyor|C|DFT -#142|Lotusguard Disciple|C|DFT -#143|Gearseeker Serpent|C|DFT -#144|Memory Guardian|U|DFT -#145|Nimble Thopterist|C|DFT -#146|Spin Out|C|DFT -#147|Magmakin Artillerist|C|DFT -#148|Fang Guardian|U|DFT -#149|Pothole Mole|C|DFT -#150|Alacrian Armory|U|DFT -#151|Pride of the Road|U|DFT -#152|Adrenaline Jockey|U|DFT -#153|Defend the Rider|U|DFT -#154|Broodheart Engine|U|DFT -#155|Marshals' Pathcruiser|U|DFT -#156|Bleachbone Verge|R|DFT -#157|Muraganda Raceway|R|DFT -#158|Riverpyre Verge|R|DFT -#159|Sunbillow Verge|R|DFT -#160|Wastewood Verge|R|DFT -#161|Willowrush Verge|R|DFT -#162|Broadcast Rambler|C|DFT -#163|Guidelight Synergist|U|DFT -#164|Sundial, Dawn Tyrant|U|DFT -#165|Chitin Gravestalker|C|DFT -#166|Dynamite Diver|C|DFT -#167|Endrider Spikespitter|U|DFT -#168|Skycrash|U|DFT -#169|Run Over|C|DFT -#170|Tune Up|U|DFT -#171|Howler's Heavy|C|DFT -#172|Midnight Mangler|C|DFT -#173|Stock Up|U|DFT -#174|Trade the Helm|U|DFT -#175|Back on Track|U|DFT -#176|Ripclaw Wrangler|C|DFT -#177|Wickerfolk Indomitable|U|DFT -#178|Goblin Surveyor|C|DFT -#179|Pacesetter Paragon|U|DFT -#180|Prowcatcher Specialist|C|DFT -#181|Beastrider Vanguard|C|DFT -#182|Dredger's Insight|U|DFT -#183|Earthrumbler|U|DFT -#184|Rise from the Wreck|U|DFT -#185|Amonkhet Raceway|U|DFT -#186|Country Roads|U|DFT -#187|Foul Roads|U|DFT -#188|Reef Roads|U|DFT -#189|Rocky Roads|U|DFT -#190|Wild Roads|U|DFT -#191|Gallant Strike|U|DFT -#192|Voyager Quickwelder|C|DFT -#193|Grim Javelineer|C|DFT -#194|Locust Spray|U|DFT -#195|Burner Rocket|C|DFT -#196|Hazard of the Dunes|C|DFT -#197|Jibbirik Omnivore|C|DFT -#198|Migrating Ketradon|C|DFT -#199|Rover Blades|U|DFT -#200|Brightfield Glider|C|DFT -#201|Brightfield Mustang|C|DFT -#202|Daring Mechanic|C|DFT -#203|Lightwheel Enhancements|C|DFT -#204|Bounce Off|C|DFT -#205|Roadside Blowout|U|DFT -#206|Gastal Raider|U|DFT -#207|Maximum Overdrive|C|DFT -#208|Shefet Archfiend|U|DFT -#209|Streaking Oilgorger|C|DFT -#210|Wretched Doll|U|DFT -#211|Clamorous Ironclad|C|DFT -#212|Crash and Burn|C|DFT -#213|Kickoff Celebrations|C|DFT -#214|Pedal to the Metal|C|DFT -#215|Bestow Greatness|C|DFT -#216|Greenbelt Guardian|U|DFT -#217|Loxodon Surveyor|C|DFT -#218|Molt Tender|U|DFT -#219|Stampeding Scurryfoot|C|DFT -#220|Veloheart Bike|C|DFT -#221|Venomsac Lagac|C|DFT -#222|Aetherjacket|C|DFT -#223|Racers' Scoreboard|U|DFT -#224|Avishkar Raceway|C|DFT -#225|Bloodfell Caves|C|DFT -#226|Blossoming Sands|C|DFT -#227|Dismal Backwater|C|DFT -#228|Jungle Hollow|C|DFT -#229|Night Market|C|DFT -#230|Rugged Highlands|C|DFT -#231|Scoured Barrens|C|DFT -#232|Swiftwater Cliffs|C|DFT -#233|Thornwood Falls|C|DFT -#234|Tranquil Cove|C|DFT -#235|Wind-Scarred Crag|C|DFT -#236|Skystreak Engineer|C|DFT -#237|Trip Up|C|DFT -#238|Hellish Sideswipe|U|DFT -#239|Wreckage Wickerfolk|C|DFT -#240|Thunderhead Gunner|C|DFT -#241|Broken Wings|C|DFT -#242|Ride's End|C|DFT -#243|Caelorna, Coral Tyrant|U|DFT -#244|Slick Imitator|U|DFT -#245|Deathless Pilot|C|DFT -#246|Intimidation Tactics|U|DFT -#247|Kalakscion, Hunger Tyrant|U|DFT -#248|Pit Automaton|U|DFT -#249|Scrap Compactor|C|DFT -#250|Starting Column|C|DFT -#251|Wreck Remover|C|DFT -#252|Swiftwing Assailant|C|DFT -#253|Glitch Ghost Surveyor|C|DFT -#254|Guidelight Optimizer|C|DFT -#255|Keen Buccaneer|C|DFT -#256|Spectral Interference|C|DFT -#257|Stall Out|C|DFT -#258|Engine Rat|C|DFT -#259|Mutant Surveyor|C|DFT -#260|Risky Shortcut|C|DFT -#261|Syphon Fuel|C|DFT -#262|Alacrian Jaguar|C|DFT -#263|Silken Strength|C|DFT +#117|Defend the Rider|U|DFT +#118|Earthrumbler|U|DFT +#119|Boom Scholar|U|DFT +#120|Dune Drifter|U|DFT +#121|Haunted Hellride|U|DFT +#122|Thundering Broodwagon|U|DFT +#123|Monument to Endurance|R|DFT +#124|Gallant Strike|U|DFT +#125|Leonin Surveyor|C|DFT +#126|Memory Guardian|U|DFT +#127|Locust Spray|U|DFT +#128|Spin Out|C|DFT +#129|Migrating Ketradon|C|DFT +#130|Run Over|C|DFT +#131|Collision Course|C|DFT +#132|Detention Chariot|U|DFT +#133|Ride's End|C|DFT +#134|Roadside Assistance|U|DFT +#135|Adrenaline Jockey|U|DFT +#136|Crash and Burn|C|DFT +#137|Ooze Patrol|U|DFT +#138|Stampeding Scurryfoot|C|DFT +#139|Apocalypse Runner|U|DFT +#140|Bloodfell Caves|C|DFT +#141|Blossoming Sands|C|DFT +#142|Dismal Backwater|C|DFT +#143|Jungle Hollow|C|DFT +#144|Rugged Highlands|C|DFT +#145|Scoured Barrens|C|DFT +#146|Swiftwater Cliffs|C|DFT +#147|Thornwood Falls|C|DFT +#148|Tranquil Cove|C|DFT +#149|Wind-Scarred Crag|C|DFT +#150|Chitin Gravestalker|C|DFT +#151|Air Response Unit|U|DFT +#152|Flood the Engine|C|DFT +#153|Hulldrifter|C|DFT +#154|Stock Up|U|DFT +#155|Intimidation Tactics|U|DFT +#156|Risen Necroregent|U|DFT +#157|Wretched Doll|U|DFT +#158|Daretti, Rocketeer Engineer|R|DFT +#159|Gilded Ghoda|C|DFT +#160|Dredger's Insight|U|DFT +#161|Elvish Refueler|U|DFT +#162|Country Roads|U|DFT +#163|Foul Roads|U|DFT +#164|Reef Roads|U|DFT +#165|Rocky Roads|U|DFT +#166|Wild Roads|U|DFT +#167|Broadcast Rambler|C|DFT +#168|Guidelight Synergist|U|DFT +#169|Dynamite Diver|C|DFT +#170|Pothole Mole|C|DFT +#171|Pathbreaker Ibex|M|SPG +#172|Bounce Off|C|DFT +#173|Howler's Heavy|C|DFT +#174|Hour of Victory|U|DFT +#175|Ripclaw Wrangler|C|DFT +#176|Endrider Catalyzer|C|DFT +#177|Pacesetter Paragon|U|DFT +#178|Prowcatcher Specialist|C|DFT +#179|Tyrox, Saurid Tyrant|U|DFT +#180|Molt Tender|U|DFT +#181|Rise from the Wreck|U|DFT +#182|Venomsac Lagac|C|DFT +#183|Mimeoplasm, Revered One|M|DFT +#184|Lotusguard Disciple|C|DFT +#185|Voyager Quickwelder|C|DFT +#186|Spectral Interference|C|DFT +#187|Trip Up|C|DFT +#188|Grim Javelineer|C|DFT +#189|Hellish Sideswipe|U|DFT +#190|Burner Rocket|C|DFT +#191|Magmakin Artillerist|C|DFT +#192|Thunderhead Gunner|C|DFT +#193|Hazard of the Dunes|C|DFT +#194|Bone Miser|M|SPG +#195|Lord of the Undead|M|SPG +#196|Lightshield Parry|C|DFT +#197|Tune Up|U|DFT +#198|Unswerving Sloth|U|DFT +#199|Gastal Blockbuster|C|DFT +#200|Goblin Surveyor|C|DFT +#201|Gearseeker Serpent|C|DFT +#202|Sabotage Strategist|U|DFT +#203|Skystreak Engineer|C|DFT +#204|Engine Rat|C|DFT +#205|Mutant Surveyor|C|DFT +#206|Syphon Fuel|C|DFT +#207|Broken Wings|C|DFT +#208|Jibbirik Omnivore|C|DFT +#209|Brightfield Glider|C|DFT +#210|Interface Ace|C|DFT +#211|Pride of the Road|U|DFT +#212|Spotcycle Scouter|C|DFT +#213|Midnight Mangler|C|DFT +#214|Deathless Pilot|C|DFT +#215|Gastal Raider|U|DFT +#216|Maximum Overdrive|C|DFT +#217|Streaking Oilgorger|C|DFT +#218|Clamorous Ironclad|C|DFT +#219|Kickoff Celebrations|C|DFT +#220|Reckless Velocitaur|U|DFT +#221|Beastrider Vanguard|C|DFT +#222|Bestow Greatness|C|DFT +#223|Loxodon Surveyor|C|DFT +#224|Oviya, Automech Artisan|R|DFT +#225|Terrian, World Tyrant|U|DFT +#226|Veloheart Bike|C|DFT +#227|Aetherjacket|C|DFT +#228|Pit Automaton|U|DFT +#229|Endrider Spikespitter|U|DFT +#230|Thoughtcast|M|SPG +#231|Brightfield Mustang|C|DFT +#232|Daring Mechanic|C|DFT +#233|Lightwheel Enhancements|C|DFT +#234|Aether Syphon|U|DFT +#235|Caelorna, Coral Tyrant|U|DFT +#236|Slick Imitator|U|DFT +#237|Trade the Helm|U|DFT +#238|Bloodghast|R|DFT +#239|Shefet Archfiend|U|DFT +#240|Wickerfolk Indomitable|U|DFT +#241|Fuel the Flames|U|DFT +#242|Pedal to the Metal|C|DFT +#243|Broodheart Engine|U|DFT +#244|Marshals' Pathcruiser|U|DFT +#245|Scrap Compactor|C|DFT +#246|Avishkar Raceway|C|DFT +#247|Guidelight Optimizer|C|DFT +#248|Risky Shortcut|C|DFT +#249|Silken Strength|C|DFT +#250|Rover Blades|U|DFT +#251|Skybox Ferry|C|DFT +#252|Spell Pierce|U|DFT +#253|Kalakscion, Hunger Tyrant|U|DFT +#254|Racers' Scoreboard|U|DFT +#255|Starting Column|C|DFT +#256|Wreck Remover|C|DFT +#257|Amonkhet Raceway|U|DFT +#258|Muraganda Raceway|R|DFT +#259|Swiftwing Assailant|C|DFT +#260|Glitch Ghost Surveyor|C|DFT +#261|Keen Buccaneer|C|DFT +#262|Stall Out|C|DFT +#263|Alacrian Jaguar|C|DFT #264|Camera Launcher|C|DFT #265|Guidelight Matrix|C|DFT -#266|Skybox Ferry|C|DFT -#267|Ticket Tortoise|C|DFT -#268|Walking Sarcophagus|C|DFT -#269|Fuel the Flames|U|DFT -#270|Aether Syphon|U|DFT -#271|Repurposing Bay|R|DFT -#272|Spell Pierce|U|DFT -#273|Unstoppable Plan|R|DFT -#274|The Last Ride|M|DFT -#275|Push the Limit|U|DFT +#266|Ticket Tortoise|C|DFT +#267|Walking Sarcophagus|C|DFT +#268|The Last Ride|M|DFT +#269|Full Throttle|R|DFT +#270|Count on Luck|R|DFT +#271|Push the Limit|U|DFT +#272|Alacrian Armory|U|DFT +#273|Ketramose, the New Dawn|M|DFT +#274|Whir of Invention|M|SPG +#275|Chrome Mox|M|SPG #276|Point the Way|U|DFT -#277|Chrome Mox|M|SPG -#278|Riverchurn Monument|R|DFT -#279|Radiant Lotus|M|DFT -#280|Ancient Vendetta|U|DFT -#281|Whir of Invention|M|SPG +#277|Repurposing Bay|R|DFT +#278|Unstoppable Plan|R|DFT +#279|Riverchurn Monument|R|DFT +#280|Radiant Lotus|M|DFT +#281|Ancient Vendetta|U|DFT #282|Plains|C|DFT #283|Island|C|DFT #284|Swamp|C|DFT diff --git a/forge-gui/res/draft/rankings/fin.rnk b/forge-gui/res/draft/rankings/fin.rnk index d6bb9e69307..16c69720e78 100644 --- a/forge-gui/res/draft/rankings/fin.rnk +++ b/forge-gui/res/draft/rankings/fin.rnk @@ -1,364 +1,364 @@ //Rank|Name|Rarity|Set -#1|Adeline, Resplendent Cathar|R|FCA +#1|Atraxa, Grand Unifier|M|FCA #2|Dion, Bahamut's Dominant|R|FIN -#3|Smuggler's Copter|R|FCA -#4|Summon: Leviathan|R|FIN -#5|Atraxa, Grand Unifier|M|FCA -#6|Ardyn, the Usurper|R|FIN -#7|Yawgmoth, Thran Physician|M|FCA -#8|The Lunar Whale|R|FIN -#9|Gilgamesh, Master-at-Arms|R|FIN -#10|Joshua, Phoenix's Dominant|R|FIN -#11|Sin, Spira's Punishment|R|FIN -#12|Urza, Lord High Artificer|M|FCA -#13|Jenova, Ancient Calamity|R|FIN -#14|The Regalia|R|FIN -#15|Primeval Titan|R|FCA -#16|Ragavan, Nimble Pilferer|M|FCA -#17|Summon: Primal Odin|R|FIN -#18|Clive, Ifrit's Dominant|M|FIN -#19|Sazh Katzroy|R|FIN -#20|Summon: Titan|R|FIN -#21|Absolute Virtue|M|FIN -#22|Kuja, Genome Sorcerer|R|FIN -#23|Lightning, Army of One|M|FIN -#24|Kenrith, the Returned King|R|FCA -#25|Machinist's Arsenal|R|FIN -#26|Jill, Shiva's Dominant|R|FIN -#27|Kefka, Court Mage|M|FIN -#28|Gix, Yawgmoth Praetor|M|FCA -#29|Godo, Bandit Warlord|R|FCA -#30|Venser, Shaper Savant|R|FCA -#31|Winota, Joiner of Forces|R|FCA -#32|Cloud, Midgar Mercenary|M|FIN -#33|Delivery Moogle|U|FIN -#34|Summon: Knights of Round|M|FIN -#35|Edgar, King of Figaro|R|FIN -#36|Bartz and Boko|R|FIN -#37|Yuna, Hope of Spira|M|FIN -#38|Balamb Garden, SeeD Academy|R|FIN -#39|Zanarkand, Ancient Metropolis|R|FIN -#40|Bruse Tarl, Boorish Herder|R|FCA -#41|Cryptic Command|R|FCA -#42|Venat, Heart of Hydaelyn|R|FIN -#43|Sephiroth, Fabled SOLDIER|M|FIN -#44|Firion, Wild Rose Warrior|R|FIN -#45|Terra, Magical Adept|M|FIN -#46|Akroma's Will|M|FCA +#3|Ardyn, the Usurper|R|FIN +#4|Nibelheim Aflame|M|FIN +#5|Smuggler's Copter|R|FCA +#6|Urza, Lord High Artificer|M|FCA +#7|Winota, Joiner of Forces|R|FCA +#8|Summon Primal Odin|R|FIN +#9|Esper Origins|R|FIN +#10|Sazh Katzroy|R|FIN +#11|Akroma's Will|M|FCA +#12|Jill, Shiva's Dominant|R|FIN +#13|Sephiroth, Fabled SOLDIER|M|FIN +#14|Kefka, Court Mage|M|FIN +#15|Kuja, Genome Sorcerer|R|FIN +#16|Bruse Tarl, Boorish Herder|R|FCA +#17|Cryptic Command|R|FCA +#18|Yawgmoth, Thran Physician|M|FCA +#19|Adeline, Resplendent Cathar|R|FCA +#20|Dragoon's Lance|U|FIN +#21|Choco-Comet|U|FIN +#22|Buster Sword|M|FIN +#23|Summon Fenrir|U|FIN +#24|Jenova, Ancient Calamity|R|FIN +#25|Yuna, Hope of Spira|M|FIN +#26|Ranger-Captain of Eos|M|FCA +#27|Sidequest Hunt the Mark|U|FIN +#28|Samurai's Katana|U|FIN +#29|Cloud of Darkness|U|FIN +#30|Primeval Titan|R|FCA +#31|Delivery Moogle|U|FIN +#32|Memories Returning|R|FIN +#33|Zenos yae Galvus|R|FIN +#34|Sazh's Chocobo|U|FIN +#35|Sram, Senior Edificer|R|FCA +#36|Loran of the Third Path|R|FCA +#37|Moogles' Valor|R|FIN +#38|Sidequest Card Collection|U|FIN +#39|Swallowed by Leviathan|U|FIN +#40|Dark Confidant|M|FIN +#41|Overkill|U|FIN +#42|Summon Titan|R|FIN +#43|The Emperor of Palamecia|U|FIN +#44|Sin, Spira's Punishment|R|FIN +#45|Fatal Push|U|FCA +#46|Kenrith, the Returned King|R|FCA #47|Lightning Bolt|U|FCA -#48|Najeela, the Blade-Blossom|M|FCA -#49|Loran of the Third Path|R|FCA -#50|Eject|U|FIN -#51|Memories Returning|R|FIN -#52|Jecht, Reluctant Guardian|R|FIN -#53|Zenos yae Galvus|R|FIN -#54|Choco-Comet|U|FIN -#55|Nibelheim Aflame|M|FIN -#56|Samurai's Katana|U|FIN -#57|Seifer Almasy|R|FIN -#58|Esper Origins|R|FIN -#59|Summon: Fenrir|U|FIN -#60|Torgal, A Fine Hound|U|FIN -#61|Traveling Chocobo|M|FIN -#62|Cloud of Darkness|U|FIN -#63|Squall, SeeD Mercenary|R|FIN -#64|Ultimecia, Time Sorceress|U|FIN -#65|Kraum, Ludevic's Opus|R|FCA -#66|Varragoth, Bloodsky Sire|R|FCA -#67|Vial Smasher the Fierce|M|FCA -#68|Summon: Bahamut|M|FIN -#69|Dragoon's Lance|U|FIN -#70|Moogles' Valor|R|FIN -#71|Astrologian's Planisphere|R|FIN -#72|Valkyrie Aerial Unit|U|FIN -#73|Summon: Brynhildr|R|FIN -#74|Sazh's Chocobo|U|FIN -#75|Vanille, Cheerful l'Cie|U|FIN -#76|Balthier and Fran|R|FIN -#77|Choco, Seeker of Paradise|R|FIN -#78|Garland, Knight of Cornelia|U|FIN -#79|Garnet, Princess of Alexandria|U|FIN -#80|Giott, King of the Dwarves|U|FIN -#81|Ignis Scientia|U|FIN -#82|Buster Sword|M|FIN -#83|Lindblum, Industrial Regency|R|FIN -#84|Captain Lannery Storm|U|FCA -#85|Mangara, the Diplomat|R|FCA -#86|Muldrotha, the Gravetide|R|FCA -#87|Ranger-Captain of Eos|M|FCA -#88|Thrasios, Triton Hero|M|FCA -#89|Wall of Omens|U|FCA -#90|Ambrosia Whiteheart|U|FIN -#91|Battle Menu|U|FIN -#92|Ultima|R|FIN -#93|Il Mheg Pixie|U|FIN -#94|Cecil, Dark Knight|R|FIN -#95|Reno and Rude|U|FIN -#96|Raubahn, Bull of Ala Mhigo|R|FIN -#97|Summon: G.F. Cerberus|R|FIN -#98|Locke Cole|U|FIN -#99|Omega, Heartless Evolution|U|FIN -#100|Vivi Ornitier|M|FIN -#101|Midgar, City of Mako|R|FIN -#102|Fynn, the Fangbearer|U|FCA -#103|Traxos, Scourge of Kroog|R|FCA -#104|Yuriko, the Tiger's Shadow|R|FCA -#105|Adelbert Steiner|U|FIN -#106|Magitek Armor|U|FIN -#107|Weapons Vendor|C|FIN -#108|White Auracite|C|FIN -#109|Zack Fair|U|FIN -#110|Sleep Magic|U|FIN -#111|Summon: Shiva|U|FIN -#112|Demon Wall|U|FIN -#113|Overkill|U|FIN -#114|Sephiroth's Intervention|C|FIN -#115|Summon: Anima|U|FIN -#116|Vayne's Treachery|C|FIN -#117|Freya Crescent|U|FIN -#118|Thunder Magic|C|FIN -#119|Zell Dincht|R|FIN -#120|Clash of the Eikons|U|FIN -#121|Town Greeter|C|FIN -#122|Cid, Timeless Artificer|U|FIN -#123|Emet-Selch, Unsundered|M|FIN -#124|The Emperor of Palamecia|U|FIN -#125|Gladiolus Amicitia|U|FIN -#126|Noctis, Prince of Lucis|R|FIN -#127|Rinoa Heartilly|U|FIN -#128|Shantotto, Tactician Magician|U|FIN -#129|Zidane, Tantalus Thief|U|FIN -#130|Fatal Push|U|FCA -#131|Jodah, the Unifier|R|FCA -#132|Light Up the Stage|U|FCA -#133|Purphoros, God of the Forge|M|FCA -#134|The Crystal's Chosen|U|FIN -#135|Gaelicat|C|FIN -#136|Minwu, White Mage|R|FIN -#137|Dragoon's Wyvern|C|FIN -#138|Travel the Overworld|U|FIN -#139|Gaius van Baelsar|U|FIN -#140|Golbez, Crystal Collector|R|FIN -#141|Tidus, Blitzball Star|U|FIN -#142|Ishgard, the Holy See|R|FIN -#143|Rydia, Summoner of Mist|U|FIN -#144|Blitzball|C|FIN -#145|Ancient Copper Dragon|M|FCA -#146|Danitha Capashen, Paragon|U|FCA -#147|Deadly Dispute|U|FCA -#148|Sram, Senior Edificer|R|FCA -#149|Ashe, Princess of Dalmasca|U|FIN -#150|Magitek Infantry|C|FIN -#151|You're Not Alone|C|FIN -#152|Ice Magic|C|FIN -#153|Stuck in Summoner's Sanctum|C|FIN -#154|Ultros, Obnoxious Octopus|U|FIN -#155|Y'shtola Rhul|M|FIN -#156|Al Bhed Salvagers|U|FIN -#157|Hecteyes|C|FIN -#158|Ninja's Blades|R|FIN -#159|Call the Mountain Chocobo|C|FIN -#160|Queen Brahne|U|FIN -#161|Suplex|C|FIN -#162|Balamb T-Rexaur|C|FIN -#163|Coliseum Behemoth|U|FIN -#164|Diamond Weapon|U|FIN -#165|Summon: Fat Chocobo|C|FIN -#166|Hope Estheim|R|FIN -#167|Judge Magister Gabranth|U|FIN -#168|Crossroads Village|C|FIN -#169|Vincent's Limit Break|C|FIN -#170|Tifa's Limit Break|U|FIN -#171|Exdeath, Void Warlock|U|FIN -#172|Counterspell|U|FCA -#173|Syr Konrad, the Grim|U|FCA -#174|Tymna the Weaver|R|FCA -#175|Kinnan, Bonder Prodigy|M|FCA -#176|Teferi, Mage of Zhalfir|R|FCA -#177|Ultima, Origin of Oblivion|R|FIN -#178|Aerith Gainsborough|R|FIN -#179|Dwarven Castle Guard|C|FIN -#180|G'raha Tia|U|FIN -#181|Restoration Magic|U|FIN -#182|Slash of Light|C|FIN -#183|Stiltzkin, Moogle Merchant|R|FIN -#184|The Wind Crystal|R|FIN -#185|Cargo Ship|U|FIN -#186|Combat Tutorial|C|FIN -#187|Matoya, Archon Elder|R|FIN -#188|Retrieve the Esper|C|FIN -#189|Swallowed by Leviathan|U|FIN -#190|Black Mage's Rod|C|FIN -#191|Dark Knight's Greatsword|U|FIN -#192|Evil Reawakened|U|FIN -#193|The Final Days|U|FIN -#194|Sidequest: Hunt the Mark|U|FIN -#195|Vincent Valentine|R|FIN -#196|Prompto Argentum|U|FIN -#197|Sandworm|U|FIN -#198|Ancient Adamantoise|M|FIN -#199|Quina, Qu Gourmet|U|FIN -#200|Sidequest: Raise a Chocobo|U|FIN -#201|Tifa Lockhart|R|FIN -#202|Rufus Shinra|U|FIN -#203|Tellah, Great Sage|R|FIN -#204|Baron, Airship Kingdom|C|FIN -#205|Gohn, Town of Ruin|C|FIN -#206|Gongaga, Reactor Town|C|FIN -#207|Guadosalam, Farplane Gateway|C|FIN -#208|Insomnia, Crown City|C|FIN -#209|Jidoor, Aristocratic Capital|R|FIN -#210|Rabanastre, Royal City|C|FIN -#211|Sharlayan, Nation of Scholars|C|FIN -#212|Treno, Dark City|C|FIN -#213|Vector, Imperial Capital|C|FIN -#214|Windurst, Federation Center|C|FIN -#215|Aerith Rescue Mission|C|FIN -#216|Summon: Choco/Mog|C|FIN -#217|Summon: Primal Garuda|U|FIN -#218|White Mage's Staff|C|FIN -#219|Dreams of Laguna|C|FIN -#220|Sahagin|C|FIN -#221|Cornered by Black Mages|C|FIN -#222|The Darkness Crystal|R|FIN -#223|Shinra Reinforcements|C|FIN -#224|Fire Magic|U|FIN -#225|Item Shopkeep|C|FIN -#226|Mysidian Elder|C|FIN -#227|Opera Love Song|U|FIN -#228|Summon: Esper Ramuh|U|FIN -#229|Vaan, Street Thief|R|FIN -#230|Bard's Bow|C|FIN -#231|Chocobo Kick|C|FIN -#232|The Earth Crystal|R|FIN -#233|Gysahl Greens|C|FIN -#234|Jumbo Cactuar|R|FIN -#235|Black Waltz No. 3|U|FIN -#236|Serah Farron|R|FIN -#237|The Wandering Minstrel|R|FIN -#238|Lion Heart|U|FIN -#239|Relentless X-ATM092|U|FIN -#240|Starting Town|R|FIN -#241|Rydia's Return|U|FIN -#242|Brainstorm|U|FCA -#243|Isshin, Two Heavens as One|R|FCA -#244|Nyxbloom Ancient|M|FCA -#245|Snow Villiers|U|FIN -#246|Magic Damper|C|FIN -#247|Quistis Trepe|U|FIN -#248|Rook Turret|C|FIN -#249|Sage's Nouliths|C|FIN -#250|Sidequest: Card Collection|U|FIN -#251|Syncopate|C|FIN -#252|Circle of Power|U|FIN -#253|Shambling Cie'th|U|FIN -#254|Tonberry|U|FIN -#255|Barret Wallace|U|FIN -#256|Warrior's Sword|C|FIN -#257|Blitzball Shot|C|FIN -#258|Commune with Beavers|C|FIN -#259|Gran Pulse Ochu|C|FIN -#260|Ride the Shoopuf|U|FIN -#261|Summon: G.F. Ifrit|C|FIN -#262|Farseek|U|FCA -#263|Ishai, Ojutai Dragonspeaker|R|FCA -#264|Auron's Inspiration|U|FIN -#265|Fate of the Sun-Cryst|C|FIN -#266|Paladin's Arms|C|FIN -#267|Gogo, Master of Mimicry|M|FIN -#268|Scorpion Sentinel|C|FIN -#269|Thief's Knife|U|FIN -#270|Ahriman|C|FIN -#271|Fang, Fearless l'Cie|U|FIN -#272|Kain, Traitorous Dragoon|R|FIN -#273|Malboro|C|FIN -#274|Namazu Trader|C|FIN -#275|Poison the Waters|U|FIN -#276|Resentful Revelation|C|FIN -#277|Undercity Dire Rat|C|FIN -#278|Blazing Bomb|C|FIN -#279|Coral Sword|U|FIN -#280|Red Mage's Rapier|C|FIN -#281|Sabotender|C|FIN -#282|Sidequest: Play Blitzball|U|FIN -#283|Chocobo Racetrack|U|FIN -#284|Goobbue Gardener|C|FIN -#285|Loporrit Scout|C|FIN -#286|Prishe's Wanderings|C|FIN -#287|Summoner's Grimoire|R|FIN -#288|Adventurer's Airship|C|FIN -#289|The Masamune|R|FIN -#290|Monk's Fist|C|FIN -#291|Capital City|U|FIN -#292|Chromatic Lantern|R|FCA -#293|Cloudbound Moogle|C|FIN -#294|Coeurl|C|FIN -#295|Crystal Fragments|U|FIN -#296|Ice Flan|C|FIN -#297|The Prima Vista|U|FIN -#298|Qiqirn Merchant|C|FIN -#299|Relm's Sketching|U|FIN -#300|Fight On!|C|FIN -#301|Haste Magic|C|FIN -#302|Hill Gigas|C|FIN -#303|Laughing Mad|C|FIN -#304|Light of Judgment|C|FIN -#305|Unexpected Request|U|FIN -#306|Airship Crash|C|FIN -#307|Cactuar|U|FIN -#308|Galuf's Final Act|U|FIN -#309|Gigantoad|C|FIN -#310|Instant Ramen|C|FIN -#311|World Map|C|FIN -#312|Adventurer's Inn|C|FIN -#313|Clive's Hideaway|R|FIN -#314|Mizzix's Mastery|R|FCA -#315|Nature's Claim|U|FCA -#316|Dark Confidant|M|FIN -#317|Phantom Train|U|FIN -#318|Qutrub Forayer|C|FIN -#319|Reach the Horizon|U|FIN -#320|PuPu UFO|U|FIN -#321|Phoenix Down|U|FIN -#322|Sidequest: Catch a Fish|U|FIN -#323|The Water Crystal|R|FIN -#324|The Fire Crystal|R|FIN -#325|Sorceress's Schemes|U|FIN -#326|Elixir|U|FIN -#327|Excalibur II|R|FIN -#328|Genji Glove|R|FIN -#329|Magic Pot|C|FIN -#330|Ring of the Lucii|U|FIN -#331|Inalla, Archmage Ritualist|R|FCA -#332|Aettir and Priwen|M|FIN -#333|Azusa, Lost but Seeking|R|FCA -#334|K'rrik, Son of Yawgmoth|R|FCA -#335|Rhystic Study|M|FCA -#336|Strixhaven Stadium|U|FCA -#337|Lunatic Pandora|C|FIN -#338|Bolas's Citadel|R|FCA -#339|Stroke of Midnight|U|FCA -#340|Louisoix's Sacrifice|R|FIN -#341|Eden, Seat of the Sanctum|U|FIN -#342|Zodiark, Umbral God|R|FIN -#343|Iron Giant|C|FIN -#344|The Gold Saucer|U|FIN -#345|Laboratory Maniac|U|FCA -#346|Ether|U|FIN -#347|Self-Destruct|U|FIN -#348|Triple Triad|R|FIN -#349|Random Encounter|U|FIN -#350|Wastes|C|FIN -#351|From Father to Son|R|FIN -#352|Diabolic Intent|R|FCA -#353|Dovin's Veto|U|FCA -#354|A Realm Reborn|R|FIN -#355|Carpet of Flowers|R|FCA -#356|Command Beacon|R|FCA -#357|Dark Ritual|R|FCA -#358|Stolen Uniform|U|FIN -#359|Plains|C|FIN -#360|Island|C|FIN -#361|Swamp|C|FIN -#362|Mountain|C|FIN -#363|Forest|C|FIN +#48|Machinist's Arsenal|R|FIN +#49|Summon Knights of Round|M|FIN +#50|White Auracite|C|FIN +#51|Combat Tutorial|C|FIN +#52|Dragoon's Wyvern|C|FIN +#53|Eject|U|FIN +#54|The Lunar Whale|R|FIN +#55|Summon Leviathan|R|FIN +#56|Cecil, Dark Knight|R|FIN +#57|Sephiroth's Intervention|C|FIN +#58|Seifer Almasy|R|FIN +#59|Traveling Chocobo|M|FIN +#60|Shantotto, Tactician Magician|U|FIN +#61|Ragavan, Nimble Pilferer|M|FCA +#62|Tymna the Weaver|R|FCA +#63|Adelbert Steiner|U|FIN +#64|Battle Menu|U|FIN +#65|Cloud, Midgar Mercenary|M|FIN +#66|Ice Magic|C|FIN +#67|Sleep Magic|U|FIN +#68|Ultros, Obnoxious Octopus|U|FIN +#69|Cornered by Black Mages|C|FIN +#70|Vincent Valentine|R|FIN +#71|Gilgamesh, Master-at-Arms|R|FIN +#72|Thunder Magic|C|FIN +#73|Ancient Adamantoise|M|FIN +#74|Coliseum Behemoth|U|FIN +#75|Torgal, A Fine Hound|U|FIN +#76|Town Greeter|C|FIN +#77|Vanille, Cheerful l'Cie|U|FIN +#78|Absolute Virtue|M|FIN +#79|Emet-Selch, Unsundered|M|FIN +#80|Ignis Scientia|U|FIN +#81|Vivi Ornitier|M|FIN +#82|Balamb Garden, SeeD Academy|R|FIN +#83|Counterspell|U|FCA +#84|Gix, Yawgmoth Praetor|M|FCA +#85|Magitek Infantry|C|FIN +#86|White Mage's Staff|C|FIN +#87|Dreams of Laguna|C|FIN +#88|Il Mheg Pixie|U|FIN +#89|Sahagin|C|FIN +#90|Circle of Power|U|FIN +#91|Ninja's Blades|R|FIN +#92|Resentful Revelation|C|FIN +#93|Vayne's Treachery|C|FIN +#94|Sorceress's Schemes|U|FIN +#95|Joshua, Phoenix's Dominant|R|FIN +#96|Omega, Heartless Evolution|U|FIN +#97|Squall, SeeD Mercenary|R|FIN +#98|Zidane, Tantalus Thief|U|FIN +#99|Exdeath, Void Warlock|U|FIN +#100|Captain Lannery Storm|U|FCA +#101|Muldrotha, the Gravetide|R|FCA +#102|Venser, Shaper Savant|R|FCA +#103|Venat, Heart of Hydaelyn|R|FIN +#104|Zack Fair|U|FIN +#105|Astrologian's Planisphere|R|FIN +#106|Syncopate|C|FIN +#107|Evil Reawakened|U|FIN +#108|Shinra Reinforcements|C|FIN +#109|Call the Mountain Chocobo|C|FIN +#110|Chocobo Kick|C|FIN +#111|Summon Fat Chocobo|C|FIN +#112|Gladiolus Amicitia|U|FIN +#113|Locke Cole|U|FIN +#114|The Regalia|R|FIN +#115|Wall of Omens|U|FCA +#116|Summon Bahamut|M|FIN +#117|Magitek Armor|U|FIN +#118|Restoration Magic|U|FIN +#119|Summon Shiva|U|FIN +#120|Travel the Overworld|U|FIN +#121|Blazing Bomb|C|FIN +#122|Fire Magic|U|FIN +#123|Garland, Knight of Cornelia|U|FIN +#124|Rinoa Heartilly|U|FIN +#125|Ambrosia Whiteheart|U|FIN +#126|The Crystal's Chosen|U|FIN +#127|Gaelicat|C|FIN +#128|Slash of Light|C|FIN +#129|Quistis Trepe|U|FIN +#130|Al Bhed Salvagers|U|FIN +#131|The Final Days|U|FIN +#132|Hecteyes|C|FIN +#133|Jecht, Reluctant Guardian|R|FIN +#134|Malboro|C|FIN +#135|Firion, Wild Rose Warrior|R|FIN +#136|Prompto Argentum|U|FIN +#137|Suplex|C|FIN +#138|Lightning, Army of One|M|FIN +#139|Rufus Shinra|U|FIN +#140|Danitha Capashen, Paragon|U|FCA +#141|Deadly Dispute|U|FCA +#142|Kraum, Ludevic's Opus|R|FCA +#143|Vial Smasher the Fierce|M|FCA +#144|Aerith Gainsborough|R|FIN +#145|Paladin's Arms|C|FIN +#146|Summon Primal Garuda|U|FIN +#147|You're Not Alone|C|FIN +#148|Magic Damper|C|FIN +#149|Relm's Sketching|U|FIN +#150|Scorpion Sentinel|C|FIN +#151|Y'shtola Rhul|M|FIN +#152|Black Mage's Rod|C|FIN +#153|Dark Knight's Greatsword|U|FIN +#154|Balamb T-Rexaur|C|FIN +#155|Bartz and Boko|R|FIN +#156|Giott, King of the Dwarves|U|FIN +#157|Judge Magister Gabranth|U|FIN +#158|Zanarkand, Ancient Metropolis|R|FIN +#159|Ultima|R|FIN +#160|Weapons Vendor|C|FIN +#161|Retrieve the Esper|C|FIN +#162|Stuck in Summoner's Sanctum|C|FIN +#163|Demon Wall|U|FIN +#164|Tonberry|U|FIN +#165|Undercity Dire Rat|C|FIN +#166|Clive, Ifrit's Dominant|M|FIN +#167|Zell Dincht|R|FIN +#168|Bard's Bow|C|FIN +#169|Goobbue Gardener|C|FIN +#170|Gran Pulse Ochu|C|FIN +#171|The Wandering Minstrel|R|FIN +#172|PuPu UFO|U|FIN +#173|Baron, Airship Kingdom|C|FIN +#174|Capital City|U|FIN +#175|Crossroads Village|C|FIN +#176|Gohn, Town of Ruin|C|FIN +#177|Guadosalam, Farplane Gateway|C|FIN +#178|Treno, Dark City|C|FIN +#179|Bolas's Citadel|R|FCA +#180|Fynn, the Fangbearer|U|FCA +#181|Ahriman|C|FIN +#182|Gaius van Baelsar|U|FIN +#183|Namazu Trader|C|FIN +#184|Phantom Train|U|FIN +#185|Warrior's Sword|C|FIN +#186|Diamond Weapon|U|FIN +#187|Ride the Shoopuf|U|FIN +#188|Cid, Timeless Artificer|U|FIN +#189|Garnet, Princess of Alexandria|U|FIN +#190|Ultimecia, Time Sorceress|U|FIN +#191|Adventurer's Inn|C|FIN +#192|Eden, Seat of the Sanctum|U|FIN +#193|Starting Town|R|FIN +#194|Godo, Bandit Warlord|R|FCA +#195|Light Up the Stage|U|FCA +#196|Syr Konrad, the Grim|U|FCA +#197|Ashe, Princess of Dalmasca|U|FIN +#198|Cargo Ship|U|FIN +#199|The Darkness Crystal|R|FIN +#200|Fight On!|C|FIN +#201|Coral Sword|U|FIN +#202|Freya Crescent|U|FIN +#203|Prishe's Wanderings|C|FIN +#204|Choco, Seeker of Paradise|R|FIN +#205|Tellah, Great Sage|R|FIN +#206|Terra, Magical Adept|M|FIN +#207|Lion Heart|U|FIN +#208|Monk's Fist|C|FIN +#209|Vector, Imperial Capital|C|FIN +#210|Thrasios, Triton Hero|M|FCA +#211|Aerith Rescue Mission|C|FIN +#212|Dwarven Castle Guard|C|FIN +#213|Fate of the Sun-Cryst|C|FIN +#214|Reno and Rude|U|FIN +#215|Zodiark, Umbral God|R|FIN +#216|Blitzball Shot|C|FIN +#217|Clash of the Eikons|U|FIN +#218|Commune with Beavers|C|FIN +#219|Gysahl Greens|C|FIN +#220|Sidequest Raise a Chocobo|U|FIN +#221|Midgar, City of Mako|R|FIN +#222|Sharlayan, Nation of Scholars|C|FIN +#223|Windurst, Federation Center|C|FIN +#224|Farseek|U|FCA +#225|Traxos, Scourge of Kroog|R|FCA +#226|Kinnan, Bonder Prodigy|M|FCA +#227|Ultima, Origin of Oblivion|R|FIN +#228|Coeurl|C|FIN +#229|G'raha Tia|U|FIN +#230|Summon Choco Mog|C|FIN +#231|Edgar, King of Figaro|R|FIN +#232|Ice Flan|C|FIN +#233|Poison the Waters|U|FIN +#234|Laughing Mad|C|FIN +#235|Reach the Horizon|U|FIN +#236|Adventurer's Airship|C|FIN +#237|Ring of the Lucii|U|FIN +#238|Gongaga, Reactor Town|C|FIN +#239|Insomnia, Crown City|C|FIN +#240|Rydia, Summoner of Mist|U|FIN +#241|Brainstorm|U|FCA +#242|Mangara, the Diplomat|R|FCA +#243|Varragoth, Bloodsky Sire|R|FCA +#244|Yuriko, the Tiger's Shadow|R|FCA +#245|Sage's Nouliths|C|FIN +#246|Thief's Knife|U|FIN +#247|Valkyrie Aerial Unit|U|FIN +#248|Summon Anima|U|FIN +#249|Item Shopkeep|C|FIN +#250|Light of Judgment|C|FIN +#251|Opera Love Song|U|FIN +#252|Queen Brahne|U|FIN +#253|Unexpected Request|U|FIN +#254|Airship Crash|C|FIN +#255|Gigantoad|C|FIN +#256|Balthier and Fran|R|FIN +#257|Instant Ramen|C|FIN +#258|The Gold Saucer|U|FIN +#259|Ishgard, the Holy See|R|FIN +#260|Lindblum, Industrial Regency|R|FIN +#261|Rabanastre, Royal City|C|FIN +#262|Tifa's Limit Break|U|FIN +#263|Rydia's Return|U|FIN +#264|Ancient Copper Dragon|M|FCA +#265|Mizzix's Mastery|R|FCA +#266|Najeela, the Blade-Blossom|M|FCA +#267|Crystal Fragments|U|FIN +#268|Stiltzkin, Moogle Merchant|R|FIN +#269|Qiqirn Merchant|C|FIN +#270|Rook Turret|C|FIN +#271|Shambling Cie'th|U|FIN +#272|Raubahn, Bull of Ala Mhigo|R|FIN +#273|Summon Brynhildr|R|FIN +#274|Summon Esper Ramuh|U|FIN +#275|Quina, Qu Gourmet|U|FIN +#276|Relentless X-ATM092|U|FIN +#277|Cloudbound Moogle|C|FIN +#278|Minwu, White Mage|R|FIN +#279|Phoenix Down|U|FIN +#280|Snow Villiers|U|FIN +#281|Gogo, Master of Mimicry|M|FIN +#282|Fang, Fearless l'Cie|U|FIN +#283|Qutrub Forayer|C|FIN +#284|Barret Wallace|U|FIN +#285|Mysidian Elder|C|FIN +#286|Sabotender|C|FIN +#287|Sandworm|U|FIN +#288|Summon GF Cerberus|R|FIN +#289|Chocobo Racetrack|U|FIN +#290|Black Waltz No. 3|U|FIN +#291|Vincent's Limit Break|C|FIN +#292|Auron's Inspiration|U|FIN +#293|Matoya, Archon Elder|R|FIN +#294|The Prima Vista|U|FIN +#295|Kain, Traitorous Dragoon|R|FIN +#296|Cactuar|U|FIN +#297|Summoner's Grimoire|R|FIN +#298|Hope Estheim|R|FIN +#299|World Map|C|FIN +#300|The Wind Crystal|R|FIN +#301|Hill Gigas|C|FIN +#302|Red Mage's Rapier|C|FIN +#303|Triple Triad|R|FIN +#304|Tidus, Blitzball Star|U|FIN +#305|Summon GF Ifrit|C|FIN +#306|Blitzball|C|FIN +#307|Purphoros, God of the Forge|M|FCA +#308|Sidequest Catch a Fish|U|FIN +#309|Haste Magic|C|FIN +#310|Self-Destruct|U|FIN +#311|Golbez, Crystal Collector|R|FIN +#312|Nature's Claim|U|FCA +#313|Teferi, Mage of Zhalfir|R|FCA +#314|Ether|U|FIN +#315|Louisoix's Sacrifice|R|FIN +#316|The Water Crystal|R|FIN +#317|The Fire Crystal|R|FIN +#318|Random Encounter|U|FIN +#319|Sidequest Play Blitzball|U|FIN +#320|Vaan, Street Thief|R|FIN +#321|The Earth Crystal|R|FIN +#322|Galuf's Final Act|U|FIN +#323|Jumbo Cactuar|R|FIN +#324|Loporrit Scout|C|FIN +#325|Tifa Lockhart|R|FIN +#326|Noctis, Prince of Lucis|R|FIN +#327|Serah Farron|R|FIN +#328|Aettir and Priwen|M|FIN +#329|Elixir|U|FIN +#330|Excalibur II|R|FIN +#331|Genji Glove|R|FIN +#332|Iron Giant|C|FIN +#333|Lunatic Pandora|C|FIN +#334|Magic Pot|C|FIN +#335|The Masamune|R|FIN +#336|Clive's Hideaway|R|FIN +#337|Jidoor, Aristocratic Capital|R|FIN +#338|Chromatic Lantern|R|FCA +#339|Dovin's Veto|U|FCA +#340|Laboratory Maniac|U|FCA +#341|Stroke of Midnight|U|FCA +#342|From Father to Son|R|FIN +#343|Stolen Uniform|U|FIN +#344|A Realm Reborn|R|FIN +#345|Azusa, Lost but Seeking|R|FCA +#346|Carpet of Flowers|R|FCA +#347|Command Beacon|R|FCA +#348|Dark Ritual|R|FCA +#349|Diabolic Intent|R|FCA +#350|Ishai, Ojutai Dragonspeaker|R|FCA +#351|Isshin, Two Heavens as One|R|FCA +#352|Jodah, the Unifier|R|FCA +#353|K'rrik, Son of Yawgmoth|R|FCA +#354|Nyxbloom Ancient|M|FCA +#355|Rhystic Study|M|FCA +#356|Strixhaven Stadium|U|FCA +#357|Inalla, Archmage Ritualist|R|FCA +#358|Plains|C|FIN +#359|Island|C|FIN +#360|Swamp|C|FIN +#361|Mountain|C|FIN +#362|Forest|C|FIN +#363|Wastes|C|FIN diff --git a/forge-gui/res/draft/rankings/pio.rnk b/forge-gui/res/draft/rankings/pio.rnk index 11acea639d1..0765c148197 100644 --- a/forge-gui/res/draft/rankings/pio.rnk +++ b/forge-gui/res/draft/rankings/pio.rnk @@ -5,34 +5,34 @@ #4|Nylea, God of the Hunt|M|PIO #5|Dragonlord Silumgar|M|PIO #6|Pia and Kiran Nalaar|R|PIO -#7|Xenagos, God of Revels|M|PIO -#8|Elspeth, Sun's Champion|M|PIO -#9|Archangel of Thune|M|PIO -#10|Dragonlord Atarka|M|PIO -#11|Gideon, Ally of Zendikar|M|PIO -#12|Abhorrent Overlord|U|PIO -#13|Iroas, God of Victory|M|PIO -#14|Dragonlord Ojutai|M|PIO -#15|Nissa, Vastwood Seer|M|PIO -#16|Chandra, Flamecaller|M|PIO -#17|Aetherling|R|PIO -#18|Goblin Rabblemaster|R|PIO -#19|Stormbreath Dragon|M|PIO -#20|Aurelia's Fury|R|PIO -#21|Purphoros, God of the Forge|M|PIO -#22|Athreos, God of Passage|M|PIO -#23|Erebos, God of the Dead|M|PIO -#24|Fanatic of Mogis|U|PIO -#25|Ephara, God of the Polis|M|PIO -#26|Keranos, God of Storms|M|PIO -#27|Mogis, God of Slaughter|M|PIO -#28|Rakdos's Return|R|PIO -#29|Gate Colossus|U|PIO -#30|Bloodtithe Harvester|U|PIO -#31|Dreadbore|C|PIO -#32|Ob Nixilis's Cruelty|C|PIO -#33|Dictate of Heliod|R|PIO -#34|Karametra, God of Harvests|M|PIO +#7|Elspeth, Sun's Champion|M|PIO +#8|Archangel of Thune|M|PIO +#9|Dragonlord Atarka|M|PIO +#10|Gideon, Ally of Zendikar|M|PIO +#11|Abhorrent Overlord|U|PIO +#12|Iroas, God of Victory|M|PIO +#13|Dragonlord Ojutai|M|PIO +#14|Nissa, Vastwood Seer|M|PIO +#15|Chandra, Flamecaller|M|PIO +#16|Aetherling|R|PIO +#17|Goblin Rabblemaster|R|PIO +#18|Stormbreath Dragon|M|PIO +#19|Aurelia's Fury|R|PIO +#20|Purphoros, God of the Forge|M|PIO +#21|Athreos, God of Passage|M|PIO +#22|Erebos, God of the Dead|M|PIO +#23|Fanatic of Mogis|U|PIO +#24|Ephara, God of the Polis|M|PIO +#25|Keranos, God of Storms|M|PIO +#26|Mogis, God of Slaughter|M|PIO +#27|Rakdos's Return|R|PIO +#28|Gate Colossus|U|PIO +#29|Bloodtithe Harvester|U|PIO +#30|Dreadbore|C|PIO +#31|Ob Nixilis's Cruelty|C|PIO +#32|Dictate of Heliod|R|PIO +#33|Karametra, God of Harvests|M|PIO +#34|Xenagos, God of Revels|M|PIO #35|Radiant Flames|R|PIO #36|Chained to the Rocks|R|PIO #37|Jace, Vryn's Prodigy|M|PIO diff --git a/forge-gui/res/draft/rankings/tdm.rnk b/forge-gui/res/draft/rankings/tdm.rnk index 3dbe87b55d6..0a11841d1b0 100644 --- a/forge-gui/res/draft/rankings/tdm.rnk +++ b/forge-gui/res/draft/rankings/tdm.rnk @@ -1,283 +1,283 @@ //Rank|Name|Rarity|Set -#1|Eerie Ultimatum|M|SPG -#2|Ruinous Ultimatum|M|SPG -#3|Elspeth, Storm Slayer|M|TDM +#1|Ugin, Eye of the Storms|M|TDM +#2|Elspeth, Storm Slayer|M|TDM +#3|Marang River Regent|R|TDM #4|Dragonback Assault|M|TDM #5|Jeskai Revelation|M|TDM #6|Ureni, the Song Unending|M|TDM -#7|Inspired Ultimatum|M|SPG -#8|Genesis Ultimatum|M|SPG -#9|Ugin, Eye of the Storms|M|TDM -#10|Marang River Regent|R|TDM -#11|Death Begets Life|M|TDM -#12|Roar of Endless Song|R|TDM -#13|Sinkhole Surveyor|R|TDM -#14|Stormscale Scion|M|TDM -#15|Barrensteppe Siege|R|TDM -#16|Neriv, Heart of the Storm|M|TDM -#17|Revival of the Ancestors|R|TDM -#18|Shiko, Paragon of the Way|M|TDM -#19|Mardu Siegebreaker|R|TDM -#20|Anafenza, Unyielding Lineage|R|TDM -#21|Clarion Conqueror|R|TDM -#22|Avenger of the Fallen|R|TDM -#23|Qarsi Revenant|R|TDM -#24|Scavenger Regent|R|TDM -#25|Bloomvine Regent|R|TDM -#26|Warden of the Grove|R|TDM -#27|All-Out Assault|M|TDM -#28|Betor, Kin to All|M|TDM -#29|Perennation|M|TDM -#30|Twinmaw Stormbrood|U|TDM -#31|Zurgo, Thunder's Decree|R|TDM -#32|Wayspeaker Bodyguard|U|TDM -#33|Ambling Stormshell|R|TDM -#34|Magmatic Hellkite|R|TDM -#35|Kishla Skimmer|U|TDM -#36|Sonic Shrieker|U|TDM -#37|Yathan Roadwatcher|R|TDM -#38|Sage of the Fang|U|TDM -#39|Lotuslight Dancers|R|TDM -#40|Sage of the Skies|R|TDM -#41|Teeming Dragonstorm|U|TDM -#42|Frostcliff Siege|R|TDM -#43|Hollowmurk Siege|R|TDM -#44|Rediscover the Way|R|TDM -#45|Severance Priest|R|TDM -#46|Skirmish Rhino|U|TDM -#47|Windcrag Siege|R|TDM -#48|Gurmag Rakshasa|U|TDM -#49|Strategic Betrayal|U|TDM -#50|Unsparing Boltcaster|U|TDM -#51|Zurgo's Vanguard|U|TDM -#52|Knockout Maneuver|U|TDM -#53|Defibrillating Current|U|TDM -#54|Herd Heirloom|R|TDM -#55|Lasyd Prowler|R|TDM -#56|Surrak, Elusive Hunter|R|TDM -#57|Bone-Cairn Butcher|U|TDM -#58|Disruptive Stormbrood|U|TDM -#59|Inevitable Defeat|R|TDM -#60|Hundred-Battle Veteran|U|TDM -#61|Salt Road Skirmish|U|TDM -#62|Stadium Headliner|R|TDM -#63|Traveling Botanist|U|TDM -#64|Dragonclaw Strike|U|TDM -#65|Loxodon Battle Priest|U|TDM -#66|Smile at Death|M|TDM -#67|Roiling Dragonstorm|U|TDM -#68|Taigam, Master Opportunist|M|TDM -#69|Cori-Steel Cutter|R|TDM -#70|Sunset Strikemaster|U|TDM -#71|Tersa Lightshatter|R|TDM +#7|Sage of the Skies|R|TDM +#8|Roar of Endless Song|R|TDM +#9|Shiko, Paragon of the Way|M|TDM +#10|Betor, Kin to All|M|TDM +#11|Revival of the Ancestors|R|TDM +#12|Inspired Ultimatum|M|SPG +#13|Qarsi Revenant|R|TDM +#14|Warden of the Grove|R|TDM +#15|Death Begets Life|M|TDM +#16|Fangkeeper's Familiar|R|TDM +#17|Sonic Shrieker|U|TDM +#18|Teval, Arbiter of Virtue|M|TDM +#19|Voice of Victory|R|TDM +#20|Winternight Stories|R|TDM +#21|Scavenger Regent|R|TDM +#22|Cori-Steel Cutter|R|TDM +#23|Surrak, Elusive Hunter|R|TDM +#24|Awaken the Honored Dead|R|TDM +#25|Eshki Dragonclaw|R|TDM +#26|Inevitable Defeat|R|TDM +#27|Karakyk Guardian|U|TDM +#28|Ambling Stormshell|R|TDM +#29|Dragonologist|R|TDM +#30|Sinkhole Surveyor|R|TDM +#31|All-Out Assault|M|TDM +#32|Sibsig Appraiser|C|TDM +#33|Roiling Dragonstorm|U|TDM +#34|Twinmaw Stormbrood|U|TDM +#35|Mardu Monument|U|TDM +#36|Magmatic Hellkite|R|TDM +#37|Tersa Lightshatter|R|TDM +#38|Bloomvine Regent|R|TDM +#39|Glacial Dragonhunt|U|TDM +#40|Rediscover the Way|R|TDM +#41|Temur Battlecrier|R|TDM +#42|Cori Mountain Monastery|R|TDM +#43|Knockout Maneuver|U|TDM +#44|Traveling Botanist|U|TDM +#45|Mardu Devotee|C|TDM +#46|Rally the Monastery|U|TDM +#47|Sunset Strikemaster|U|TDM +#48|Disruptive Stormbrood|U|TDM +#49|Jeskai Shrinekeeper|U|TDM +#50|Rakshasa's Bargain|U|TDM +#51|Windcrag Siege|R|TDM +#52|Jeskai Monument|U|TDM +#53|Eerie Ultimatum|M|SPG +#54|Ruinous Ultimatum|M|SPG +#55|Descendant of Storms|U|TDM +#56|Dispelling Exhale|C|TDM +#57|Molten Exhale|C|TDM +#58|Dragonbroods' Relic|U|TDM +#59|Lasyd Prowler|R|TDM +#60|Kishla Skimmer|U|TDM +#61|Riverwheel Sweep|U|TDM +#62|Wingblade Disciple|U|TDM +#63|Shocking Sharpshooter|U|TDM +#64|Stadium Headliner|R|TDM +#65|Lotuslight Dancers|R|TDM +#66|Clarion Conqueror|R|TDM +#67|Salt Road Packbeast|C|TDM +#68|Fresh Start|U|TDM +#69|Kishla Trawlers|U|TDM +#70|Spectral Denial|U|TDM +#71|Channeled Dragonfire|U|TDM #72|Craterhoof Behemoth|M|TDM -#73|Cori Mountain Stalwart|U|TDM -#74|Fangkeeper's Familiar|R|TDM -#75|Felothar, Dawn of the Abzan|R|TDM -#76|Flamehold Grappler|R|TDM -#77|Jeskai Shrinekeeper|U|TDM -#78|Narset, Jeskai Waymaster|R|TDM -#79|Stalwart Successor|U|TDM -#80|Thunder of Unity|R|TDM -#81|Dragonfire Blade|R|TDM -#82|Stormbeacon Blade|U|TDM -#83|Focus the Mind|C|TDM -#84|Wingblade Disciple|U|TDM -#85|Alchemist's Assistant|U|TDM -#86|Sandskitter Outrider|C|TDM -#87|Overwhelming Surge|U|TDM -#88|Formation Breaker|U|TDM -#89|Trade Route Envoy|C|TDM -#90|Mammoth Bellow|U|TDM -#91|Mardu Devotee|C|TDM -#92|Sunpearl Kirin|U|TDM -#93|Voice of Victory|R|TDM -#94|Venerated Stormsinger|U|TDM -#95|Sarkhan, Dragon Ascendant|R|TDM -#96|Attuned Hunter|U|TDM -#97|Eshki Dragonclaw|R|TDM -#98|Frontline Rush|U|TDM -#99|Hardened Tactician|U|TDM -#100|Kheru Goldkeeper|U|TDM -#101|Marshal of the Lost|U|TDM -#102|Purging Stormbrood|U|TDM -#103|Temur Battlecrier|R|TDM -#104|Furious Forebear|U|TDM -#105|Constrictor Sage|U|TDM -#106|Adorned Crocodile|C|TDM -#107|Twin Bolt|C|TDM -#108|Inspirited Vanguard|U|TDM -#109|Sagu Pummeler|C|TDM -#110|Starry-Eyed Skyrider|U|TDM -#111|Static Snare|U|TDM -#112|Bewildering Blizzard|U|TDM -#113|Dragonologist|R|TDM -#114|Fresh Start|U|TDM -#115|Caustic Exhale|C|TDM -#116|Sidisi, Regent of the Mire|R|TDM -#117|Sagu Wildling|C|TDM -#118|Armament Dragon|U|TDM -#119|Awaken the Honored Dead|R|TDM -#120|Glacial Dragonhunt|U|TDM -#121|Karakyk Guardian|U|TDM -#122|Lie in Wait|U|TDM -#123|Runescale Stormbrood|U|TDM -#124|Teval, Arbiter of Virtue|M|TDM -#125|Poised Practitioner|C|TDM -#126|Iceridge Serpent|C|TDM -#127|Riverwalk Technique|C|TDM -#128|Aggressive Negotiations|C|TDM -#129|Nightblade Brigade|C|TDM -#130|Unburied Earthcarver|C|TDM -#131|Iridescent Tiger|U|TDM -#132|Shocking Sharpshooter|U|TDM -#133|Champion of Dusan|C|TDM -#134|Rainveil Rejuvenator|U|TDM -#135|Dalkovan Packbeasts|U|TDM -#136|Descendant of Storms|U|TDM -#137|Stormplain Detainment|C|TDM -#138|Kishla Trawlers|U|TDM -#139|Naga Fleshcrafter|R|TDM -#140|Molten Exhale|C|TDM -#141|War Effort|U|TDM -#142|Snakeskin Veil|C|TDM -#143|Jeskai Brushmaster|U|TDM -#144|Kin-Tree Severance|U|TDM -#145|Monastery Messenger|C|TDM -#146|New Way Forward|R|TDM -#147|Songcrafter Mage|R|TDM -#148|Great Arashin City|R|TDM -#149|Dalkovan Encampment|R|TDM -#150|Arashin Sunshield|C|TDM -#151|Kin-Tree Nurturer|C|TDM -#152|Rescue Leopard|C|TDM -#153|Ainok Wayfarer|C|TDM -#154|Dragon Sniper|U|TDM -#155|Duty Beyond Death|U|TDM -#156|Fortress Kin-Guard|C|TDM -#157|Riling Dawnbreaker|C|TDM -#158|Salt Road Packbeast|C|TDM -#159|Dirgur Island Dragon|C|TDM -#160|Ringing Strike Mastery|C|TDM -#161|Abzan Devotee|C|TDM -#162|Corroding Dragonstorm|U|TDM -#163|Dragon's Prey|C|TDM -#164|Channeled Dragonfire|U|TDM -#165|Dragonbroods' Relic|U|TDM -#166|Piercing Exhale|C|TDM -#167|Synchronized Charge|U|TDM -#168|Auroral Procession|U|TDM -#169|Glacierwood Siege|R|TDM -#170|Kotis, the Fangkeeper|R|TDM -#171|Abzan Monument|U|TDM -#172|Jeskai Monument|U|TDM -#173|Mardu Monument|U|TDM -#174|Sultai Monument|U|TDM -#175|Temur Monument|U|TDM -#176|Highspire Bell-Ringer|C|TDM -#177|Sibsig Appraiser|C|TDM -#178|Veteran Ice Climber|U|TDM -#179|Delta Bloodflies|C|TDM -#180|Fleeting Effigy|U|TDM -#181|Arid Mesa|M|SPG -#182|Marsh Flats|M|SPG -#183|Misty Rainforest|M|SPG -#184|Scalding Tarn|M|SPG -#185|Verdant Catacombs|M|SPG -#186|Bearer of Glory|C|TDM -#187|Coordinated Maneuver|C|TDM -#188|Rally the Monastery|U|TDM -#189|Ureni's Rebuff|U|TDM -#190|Alesha's Legacy|C|TDM -#191|Unrooted Ancestor|U|TDM -#192|Yathan Tombguard|U|TDM -#193|Equilibrium Adept|U|TDM -#194|Encroaching Dragonstorm|U|TDM -#195|Rite of Renewal|U|TDM -#196|Sarkhan's Resolve|C|TDM -#197|Effortless Master|U|TDM -#198|Host of the Hereafter|U|TDM -#199|Rakshasa's Bargain|U|TDM -#200|Riverwheel Sweep|U|TDM -#201|Whirlwing Stormbrood|U|TDM -#202|Cori Mountain Monastery|R|TDM -#203|Frontier Bivouac|U|TDM -#204|Kishla Village|R|TDM -#205|Mystic Monastery|U|TDM -#206|Nomad Outpost|U|TDM -#207|Opulent Palace|U|TDM -#208|Sandsteppe Citadel|U|TDM -#209|Wild Ride|C|TDM -#210|Jungle Hollow|C|TDM -#211|Dragonback Lancer|C|TDM -#212|Rebellious Strike|C|TDM -#213|Aegis Sculptor|U|TDM -#214|Agent of Kotis|C|TDM -#215|Snowmelt Stag|C|TDM -#216|Unending Whisper|C|TDM -#217|Winternight Stories|R|TDM -#218|Feral Deathgorger|C|TDM -#219|Shock Brigade|C|TDM -#220|Stormshriek Feral|C|TDM -#221|Sultai Devotee|C|TDM -#222|Undergrowth Leopard|C|TDM -#223|Gurmag Nightwatch|C|TDM -#224|Reigning Victor|C|TDM -#225|Temur Tawnyback|C|TDM -#226|Watcher of the Wayside|C|TDM -#227|Evolving Wilds|C|TDM -#228|Mistrise Village|R|TDM -#229|Bloodfell Caves|C|TDM -#230|Blossoming Sands|C|TDM -#231|Dismal Backwater|C|TDM -#232|Rugged Highlands|C|TDM -#233|Scoured Barrens|C|TDM -#234|Swiftwater Cliffs|C|TDM -#235|Thornwood Falls|C|TDM -#236|Tranquil Cove|C|TDM -#237|Wind-Scarred Crag|C|TDM -#238|Lightfoot Technique|C|TDM -#239|Osseous Exhale|C|TDM -#240|Tempest Hawk|C|TDM -#241|Humbling Elder|C|TDM -#242|Spectral Denial|U|TDM -#243|Temur Devotee|C|TDM -#244|Cruel Truths|C|TDM -#245|Desperate Measures|U|TDM -#246|Krumar Initiate|U|TDM -#247|Wail of War|U|TDM -#248|Worthy Cost|C|TDM -#249|Devoted Duelist|C|TDM -#250|Fire-Rim Form|C|TDM -#251|Jeskai Devotee|C|TDM -#252|Meticulous Artisan|C|TDM -#253|Narset's Rebuke|C|TDM -#254|Seize Opportunity|C|TDM -#255|Summit Intimidator|C|TDM -#256|Underfoot Underdogs|C|TDM -#257|Dusyut Earthcarver|C|TDM -#258|Krotiq Nestguard|C|TDM -#259|Roamer's Routine|C|TDM -#260|Boulderborn Dragon|C|TDM -#261|Dragonstorm Globe|C|TDM -#262|Embermouth Sentinel|C|TDM -#263|Reputable Merchant|C|TDM -#264|Dispelling Exhale|C|TDM -#265|Wingspan Stride|C|TDM -#266|Rot-Curse Rakshasa|M|TDM -#267|Reverberating Summons|U|TDM -#268|Heritage Reclamation|C|TDM -#269|Nature's Rhythm|R|TDM -#270|Call the Spirit Dragons|M|TDM -#271|Jade-Cast Sentinel|C|TDM -#272|Emergent Ultimatum|M|SPG -#273|United Battlefront|R|TDM -#274|Dragonstorm Forecaster|U|TDM -#275|Essence Anchor|U|TDM -#276|Maelstrom of the Spirit Dragon|R|TDM -#277|Stillness in Motion|R|TDM -#278|The Sibsig Ceremony|R|TDM -#279|Breaching Dragonstorm|U|TDM +#73|Herd Heirloom|R|TDM +#74|Piercing Exhale|C|TDM +#75|Frontline Rush|U|TDM +#76|Temur Tawnyback|C|TDM +#77|Great Arashin City|R|TDM +#78|Ainok Wayfarer|C|TDM +#79|Dragon Sniper|U|TDM +#80|Genesis Ultimatum|M|SPG +#81|Dalkovan Packbeasts|U|TDM +#82|Fortress Kin-Guard|C|TDM +#83|Teeming Dragonstorm|U|TDM +#84|Naga Fleshcrafter|R|TDM +#85|Unending Whisper|C|TDM +#86|Ureni's Rebuff|U|TDM +#87|Caustic Exhale|C|TDM +#88|Equilibrium Adept|U|TDM +#89|Sarkhan, Dragon Ascendant|R|TDM +#90|Stormscale Scion|M|TDM +#91|Lie in Wait|U|TDM +#92|Zurgo, Thunder's Decree|R|TDM +#93|Sultai Monument|U|TDM +#94|Riverwalk Technique|C|TDM +#95|Static Snare|U|TDM +#96|Sunpearl Kirin|U|TDM +#97|Bewildering Blizzard|U|TDM +#98|Taigam, Master Opportunist|M|TDM +#99|Shock Brigade|C|TDM +#100|Sagu Wildling|C|TDM +#101|Snakeskin Veil|C|TDM +#102|Cori Mountain Stalwart|U|TDM +#103|Purging Stormbrood|U|TDM +#104|Yathan Roadwatcher|R|TDM +#105|Temur Monument|U|TDM +#106|Maelstrom of the Spirit Dragon|R|TDM +#107|Iceridge Serpent|C|TDM +#108|Iridescent Tiger|U|TDM +#109|Zurgo's Vanguard|U|TDM +#110|Dragonclaw Strike|U|TDM +#111|Anafenza, Unyielding Lineage|R|TDM +#112|Dirgur Island Dragon|C|TDM +#113|Dragonstorm Forecaster|U|TDM +#114|Narset's Rebuke|C|TDM +#115|War Effort|U|TDM +#116|Gurmag Nightwatch|C|TDM +#117|Kin-Tree Severance|U|TDM +#118|Neriv, Heart of the Storm|M|TDM +#119|Runescale Stormbrood|U|TDM +#120|Songcrafter Mage|R|TDM +#121|Kishla Village|R|TDM +#122|Mystic Monastery|U|TDM +#123|Focus the Mind|C|TDM +#124|Rugged Highlands|C|TDM +#125|Swiftwater Cliffs|C|TDM +#126|Thornwood Falls|C|TDM +#127|Duty Beyond Death|U|TDM +#128|Osseous Exhale|C|TDM +#129|Stormplain Detainment|C|TDM +#130|Avenger of the Fallen|R|TDM +#131|Dragon's Prey|C|TDM +#132|Venerated Stormsinger|U|TDM +#133|Wail of War|U|TDM +#134|Dusyut Earthcarver|C|TDM +#135|Sarkhan's Resolve|C|TDM +#136|Sultai Devotee|C|TDM +#137|Synchronized Charge|U|TDM +#138|Narset, Jeskai Waymaster|R|TDM +#139|Reigning Victor|C|TDM +#140|Severance Priest|R|TDM +#141|Dragonstorm Globe|C|TDM +#142|Evolving Wilds|C|TDM +#143|Frontier Bivouac|U|TDM +#144|Furious Forebear|U|TDM +#145|Gurmag Rakshasa|U|TDM +#146|Fleeting Effigy|U|TDM +#147|Champion of Dusan|C|TDM +#148|Mammoth Bellow|U|TDM +#149|Mardu Siegebreaker|R|TDM +#150|Dismal Backwater|C|TDM +#151|Tranquil Cove|C|TDM +#152|Wind-Scarred Crag|C|TDM +#153|Coordinated Maneuver|C|TDM +#154|Rebellious Strike|C|TDM +#155|Humbling Elder|C|TDM +#156|Temur Devotee|C|TDM +#157|Jeskai Devotee|C|TDM +#158|Meticulous Artisan|C|TDM +#159|Stormshriek Feral|C|TDM +#160|Armament Dragon|U|TDM +#161|Flamehold Grappler|R|TDM +#162|New Way Forward|R|TDM +#163|Perennation|M|TDM +#164|Skirmish Rhino|U|TDM +#165|Whirlwing Stormbrood|U|TDM +#166|Dalkovan Encampment|R|TDM +#167|Nomad Outpost|U|TDM +#168|Opulent Palace|U|TDM +#169|Aggressive Negotiations|C|TDM +#170|Salt Road Skirmish|U|TDM +#171|Strategic Betrayal|U|TDM +#172|Inspirited Vanguard|U|TDM +#173|Sagu Pummeler|C|TDM +#174|Jungle Hollow|C|TDM +#175|Scalding Tarn|M|SPG +#176|Bearer of Glory|C|TDM +#177|Encroaching Dragonstorm|U|TDM +#178|Auroral Procession|U|TDM +#179|Frostcliff Siege|R|TDM +#180|Hollowmurk Siege|R|TDM +#181|Kheru Goldkeeper|U|TDM +#182|Watcher of the Wayside|C|TDM +#183|Constrictor Sage|U|TDM +#184|Veteran Ice Climber|U|TDM +#185|Kin-Tree Nurturer|C|TDM +#186|Rescue Leopard|C|TDM +#187|Sage of the Fang|U|TDM +#188|Bloodfell Caves|C|TDM +#189|Blossoming Sands|C|TDM +#190|Scoured Barrens|C|TDM +#191|Arid Mesa|M|SPG +#192|Marsh Flats|M|SPG +#193|Misty Rainforest|M|SPG +#194|Verdant Catacombs|M|SPG +#195|Riling Dawnbreaker|C|TDM +#196|Aegis Sculptor|U|TDM +#197|Snowmelt Stag|C|TDM +#198|Feral Deathgorger|C|TDM +#199|Undergrowth Leopard|C|TDM +#200|Abzan Monument|U|TDM +#201|Dragonfire Blade|R|TDM +#202|Sandsteppe Citadel|U|TDM +#203|Wayspeaker Bodyguard|U|TDM +#204|Overwhelming Surge|U|TDM +#205|Unsparing Boltcaster|U|TDM +#206|Formation Breaker|U|TDM +#207|Defibrillating Current|U|TDM +#208|Essence Anchor|U|TDM +#209|Fire-Rim Form|C|TDM +#210|Underfoot Underdogs|C|TDM +#211|Attuned Hunter|U|TDM +#212|Nature's Rhythm|R|TDM +#213|Host of the Hereafter|U|TDM +#214|Marshal of the Lost|U|TDM +#215|Monastery Messenger|C|TDM +#216|Embermouth Sentinel|C|TDM +#217|Mistrise Village|R|TDM +#218|Alchemist's Assistant|U|TDM +#219|Twin Bolt|C|TDM +#220|Lightfoot Technique|C|TDM +#221|Thunder of Unity|R|TDM +#222|Nightblade Brigade|C|TDM +#223|Trade Route Envoy|C|TDM +#224|Loxodon Battle Priest|U|TDM +#225|Smile at Death|M|TDM +#226|Ringing Strike Mastery|C|TDM +#227|Abzan Devotee|C|TDM +#228|Desperate Measures|U|TDM +#229|Devoted Duelist|C|TDM +#230|Rite of Renewal|U|TDM +#231|Bone-Cairn Butcher|U|TDM +#232|Effortless Master|U|TDM +#233|Jade-Cast Sentinel|C|TDM +#234|Sandskitter Outrider|C|TDM +#235|Wild Ride|C|TDM +#236|Reputable Merchant|C|TDM +#237|Starry-Eyed Skyrider|U|TDM +#238|Tempest Hawk|C|TDM +#239|Krumar Initiate|U|TDM +#240|Rot-Curse Rakshasa|M|TDM +#241|Sidisi, Regent of the Mire|R|TDM +#242|Breaching Dragonstorm|U|TDM +#243|Seize Opportunity|C|TDM +#244|Barrensteppe Siege|R|TDM +#245|Felothar, Dawn of the Abzan|R|TDM +#246|Hardened Tactician|U|TDM +#247|Jeskai Brushmaster|U|TDM +#248|Kotis, the Fangkeeper|R|TDM +#249|Stalwart Successor|U|TDM +#250|Boulderborn Dragon|C|TDM +#251|Arashin Sunshield|C|TDM +#252|Poised Practitioner|C|TDM +#253|Highspire Bell-Ringer|C|TDM +#254|Adorned Crocodile|C|TDM +#255|Rainveil Rejuvenator|U|TDM +#256|Dragonback Lancer|C|TDM +#257|Agent of Kotis|C|TDM +#258|Summit Intimidator|C|TDM +#259|Krotiq Nestguard|C|TDM +#260|Roamer's Routine|C|TDM +#261|Cruel Truths|C|TDM +#262|Worthy Cost|C|TDM +#263|Unburied Earthcarver|C|TDM +#264|United Battlefront|R|TDM +#265|Corroding Dragonstorm|U|TDM +#266|Yathan Tombguard|U|TDM +#267|Heritage Reclamation|C|TDM +#268|Emergent Ultimatum|M|SPG +#269|Stillness in Motion|R|TDM +#270|Wingspan Stride|C|TDM +#271|Alesha's Legacy|C|TDM +#272|Unrooted Ancestor|U|TDM +#273|Reverberating Summons|U|TDM +#274|Call the Spirit Dragons|M|TDM +#275|Glacierwood Siege|R|TDM +#276|Stormbeacon Blade|U|TDM +#277|Delta Bloodflies|C|TDM +#278|Hundred-Battle Veteran|U|TDM +#279|The Sibsig Ceremony|R|TDM #280|Dracogenesis|M|TDM #281|Mox Jasper|M|TDM #282|Plains|C|TDM From 65959f9089e4ae05f318ff64dcffef11ca3ccc3b Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Mon, 21 Jul 2025 22:27:23 -0500 Subject: [PATCH 082/183] Draft definitions for EOE --- forge-gui/res/draft/rankings/eoe.rnk | 322 ++++++++++++++++++ .../Edge of Eternities Stellar Sights.txt | 2 +- forge-gui/res/editions/Edge of Eternities.txt | 60 ++++ 3 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/draft/rankings/eoe.rnk diff --git a/forge-gui/res/draft/rankings/eoe.rnk b/forge-gui/res/draft/rankings/eoe.rnk new file mode 100644 index 00000000000..92d90c6708c --- /dev/null +++ b/forge-gui/res/draft/rankings/eoe.rnk @@ -0,0 +1,322 @@ +//Rank|Name|Rarity|Set +#1|Singularity Rupture|R|EOE +#2|Zero Point Ballad|R|EOE +#3|Celestial Colonnade|R|EOE +#4|Astelli Reclaimer|R|EOE +#5|Beyond the Quiet|R|EOE +#6|Cosmogrand Zenith|M|EOE +#7|Exalted Sunborn|M|EOE +#8|Quantum Riddler|M|EOE +#9|Ouroboroid|M|EOE +#10|Creeping Tar Pit|R|EOE +#11|Lavaclaw Reaches|R|EOE +#12|Lumbering Falls|R|EOE +#13|Raging Ravine|R|EOE +#14|Elegy Acolyte|R|EOE +#15|Mightform Harmonizer|R|EOE +#16|Alpharael, Stonechosen|M|EOE +#17|Biotech Specialist|R|EOE +#18|Genemorph Imago|R|EOE +#19|The Endstone|M|EOE +#20|Lumen-Class Frigate|R|EOE +#21|Xu-Ifit, Osteoharmonist|R|EOE +#22|Syr Vondam, Sunstar Exemplar|R|EOE +#23|Starwinder|R|EOE +#24|Stirring Wildwood|R|EOE +#25|Sunstar Chaplain|R|EOE +#26|Warmaker Gunship|R|EOE +#27|Frenzied Baloth|R|EOE +#28|Mutinous Massacre|R|EOE +#29|Extinguisher Battleship|R|EOE +#30|Anticausal Vestige|R|EOE +#31|Tezzeret, Cruel Captain|M|EOE +#32|All-Fates Stalker|U|EOE +#33|Haliya, Guided by Light|R|EOE +#34|The Seriema|R|EOE +#35|Starfield Shepherd|U|EOE +#36|Starfield Vocalist|R|EOE +#37|Synthesizer Labship|R|EOE +#38|Archenemy's Charm|R|EOE +#39|Nova Hellkite|R|EOE +#40|Pain for All|R|EOE +#41|Possibility Technician|R|EOE +#42|Rust Harvester|R|EOE +#43|Bioengineered Future|R|EOE +#44|Dyadrine, Synthesis Amalgam|R|EOE +#45|Infinite Guideline Station|R|EOE +#46|Sami, Wildcat Captain|M|EOE +#47|Syr Vondam, the Lucent|U|EOE +#48|Dawnsire, Sunstar Dreadnought|M|EOE +#49|The Dominion Bracelet|M|EOE +#50|Thrumming Hivepool|R|EOE +#51|Hardlight Containment|R|EOE +#52|Devastating Onslaught|M|EOE +#53|Pinnacle Emissary|R|EOE +#54|Station Monitor|U|EOE +#55|Memorial Vault|R|EOE +#56|Tannuk, Steadfast Second|M|EOE +#57|Green Sun's Zenith|M|EOE +#58|Nexus of Fate|M|EOE +#59|Ancient Tomb|M|EOE +#60|Blinkmoth Nexus|R|EOE +#61|Hissing Quagmire|R|EOE +#62|Shambling Vent|R|EOE +#63|Pulsar Squadron Ace|U|EOE +#64|Rescue Skiff|U|EOE +#65|Sunstar Expansionist|U|EOE +#66|Monoist Circuit-Feeder|U|EOE +#67|Famished Worldsire|M|EOE +#68|Biomechan Engineer|U|EOE +#69|Interceptor Mechan|U|EOE +#70|Steelswarm Operator|U|EOE +#71|Edge Rover|U|EOE +#72|Banishing Light|C|EOE +#73|Emergency Eject|U|EOE +#74|Scout for Survivors|U|EOE +#75|Emissary Escort|R|EOE +#76|Mm'menon, the Right Hand|R|EOE +#77|Specimen Freighter|U|EOE +#78|Weftwalking|M|EOE +#79|Tragic Trajectory|U|EOE +#80|Memorial Team Leader|U|EOE +#81|Terrapact Intimidator|U|EOE +#82|Alpharael, Dreaming Acolyte|U|EOE +#83|Seedship Broodtender|U|EOE +#84|Tannuk, Memorial Ensign|U|EOE +#85|Survey Mechan|U|EOE +#86|Lightstall Inquisitor|R|EOE +#87|Cerebral Download|U|EOE +#88|Desculpting Blast|U|EOE +#89|Invasive Maneuvers|U|EOE +#90|Sledge-Class Seedship|R|EOE +#91|Haliya, Ascendant Cadet|U|EOE +#92|Secluded Starforge|R|EOE +#93|Meltstrider's Resolve|U|EOE +#94|Mm'menon, Uthros Exile|U|EOE +#95|Needle Spires|R|EOE +#96|Wandering Fumarole|R|EOE +#97|Timeline Culler|U|EOE +#98|Umbral Collar Zealot|U|EOE +#99|Voidforged Titan|U|EOE +#100|Plasma Bolt|C|EOE +#101|Weftstalker Ardent|U|EOE +#102|Sami, Ship's Engineer|U|EOE +#103|Bygone Colossus|U|EOE +#104|Honor|U|EOE +#105|Rayblade Trooper|U|EOE +#106|Mechan Assembler|U|EOE +#107|Tractor Beam|U|EOE +#108|Dubious Delicacy|U|EOE +#109|Lightless Evangel|U|EOE +#110|Atmospheric Greenhouse|U|EOE +#111|Close Encounter|U|EOE +#112|Icetill Explorer|R|EOE +#113|Meltstrider Eulogist|U|EOE +#114|Glacier Godmaw|U|EOE +#115|Seam Rip|U|EOE +#116|Sunstar Lightsmith|U|EOE +#117|Codecracker Hound|U|EOE +#118|Cryoshatter|C|EOE +#119|Gigastorm Titan|U|EOE +#120|Depressurize|C|EOE +#121|Vote Out|U|EOE +#122|Bombard|C|EOE +#123|Molecular Modifier|U|EOE +#124|Vaultguard Trooper|U|EOE +#125|Diplomatic Relations|C|EOE +#126|Reroute Systems|U|EOE +#127|Consult the Star Charts|R|EOE +#128|Chorale of the Void|R|EOE +#129|Fell Gravship|U|EOE +#130|Gravkill|C|EOE +#131|Virus Beetle|C|EOE +#132|Kavaron Harrier|U|EOE +#133|Broodguard Elite|U|EOE +#134|Harmonious Grovestrider|U|EOE +#135|Terrasymbiosis|R|EOE +#136|Ragost, Deft Gastronaut|R|EOE +#137|All-Fates Scroll|U|EOE +#138|Breeding Pool|R|EOE +#139|Godless Shrine|R|EOE +#140|Sacred Foundry|R|EOE +#141|Stomping Ground|R|EOE +#142|Watery Grave|R|EOE +#143|Luxknight Breacher|C|EOE +#144|Wedgelight Rammer|U|EOE +#145|Entropic Battlecruiser|R|EOE +#146|Full Bore|U|EOE +#147|Loading Zone|R|EOE +#148|Dauntless Scrapbot|U|EOE +#149|Faller's Faithful|U|EOE +#150|Dawnstrike Vanguard|U|EOE +#151|Swarm Culler|C|EOE +#152|Orbital Plunge|C|EOE +#153|Gene Pollinator|C|EOE +#154|Intrepid Tenderfoot|C|EOE +#155|Seedship Agrarian|U|EOE +#156|Bonders' Enclave|R|EOE +#157|Inkmoth Nexus|M|EOE +#158|Inventors' Fair|M|EOE +#159|Mutavault|M|EOE +#160|Reflecting Pool|M|EOE +#161|Sunken Citadel|R|EOE +#162|Illvoi Galeblade|C|EOE +#163|Mouth of the Storm|U|EOE +#164|Starbreach Whale|C|EOE +#165|Cut Propulsion|U|EOE +#166|Kav Landseeker|C|EOE +#167|Roving Actuator|U|EOE +#168|Ruinous Rampage|U|EOE +#169|Weapons Manufacturing|R|EOE +#170|Eusocial Engineering|U|EOE +#171|Seedship Impact|U|EOE +#172|Nutrient Block|C|EOE +#173|Virulent Silencer|U|EOE +#174|Dual-Sun Technique|U|EOE +#175|Honored Knight-Captain|U|EOE +#176|Uthros Scanship|U|EOE +#177|Hylderblade|U|EOE +#178|Drix Fatemaker|C|EOE +#179|Larval Scoutlander|U|EOE +#180|Atomic Microsizer|U|EOE +#181|Pinnacle Kill-Ship|C|EOE +#182|Exosuit Savior|C|EOE +#183|Illvoi Infiltrator|U|EOE +#184|Scour for Scrap|U|EOE +#185|Scrounge for Eternity|U|EOE +#186|Susurian Voidborn|U|EOE +#187|Territorial Bruntar|U|EOE +#188|Lashwhip Predator|U|EOE +#189|Starfighter Pilot|C|EOE +#190|Mechanozoa|C|EOE +#191|Unravel|U|EOE +#192|Decode Transmissions|C|EOE +#193|Hullcarver|C|EOE +#194|Galvanizing Sawship|U|EOE +#195|Red Tiger Mechan|C|EOE +#196|Remnant Elemental|U|EOE +#197|Systems Override|U|EOE +#198|Fungal Colossus|C|EOE +#199|Galactic Wayfarer|C|EOE +#200|Sami's Curiosity|C|EOE +#201|Tapestry Warden|U|EOE +#202|Wurmwall Sweeper|C|EOE +#203|Command Bridge|C|EOE +#204|Focus Fire|C|EOE +#205|Radiant Strike|C|EOE +#206|Cryogen Relic|C|EOE +#207|Mechan Navigator|U|EOE +#208|Uthros Psionicist|U|EOE +#209|Hymn of the Faller|U|EOE +#210|Melded Moxite|C|EOE +#211|Auxiliary Boosters|C|EOE +#212|Dockworker Drone|C|EOE +#213|Dual-Sun Adepts|U|EOE +#214|Knight Luminary|C|EOE +#215|Weftblade Enhancer|C|EOE +#216|Illvoi Operative|C|EOE +#217|Lost in Space|C|EOE +#218|Selfcraft Mechan|C|EOE +#219|Beamsaw Prospector|C|EOE +#220|Blade of the Swarm|U|EOE +#221|Gravblade Heavy|C|EOE +#222|Gravpack Monoist|C|EOE +#223|Perigee Beckoner|C|EOE +#224|Susurian Dirgecraft|U|EOE +#225|Kavaron Turbodrone|C|EOE +#226|Oreplate Pangolin|C|EOE +#227|Zookeeper Mechan|C|EOE +#228|Biosynthic Burst|C|EOE +#229|Blooming Stinger|C|EOE +#230|Eumidian Terrabotanist|U|EOE +#231|Icecave Crasher|C|EOE +#232|Pull Through the Weft|U|EOE +#233|Thawbringer|C|EOE +#234|Meteor Crater|R|EOE +#235|Mystifying Maze|R|EOE +#236|Starport Security|C|EOE +#237|Embrace Oblivion|C|EOE +#238|Insatiable Skittermaw|C|EOE +#239|Debris Field Crusher|U|EOE +#240|Hemosymbic Mite|U|EOE +#241|Chrome Companion|C|EOE +#242|Uthros, Titanic Godcore|M|EOE +#243|Lithobraking|U|EOE +#244|Brightspear Zealot|C|EOE +#245|Flight-Deck Coordinator|C|EOE +#246|Squire's Lightblade|C|EOE +#247|Zealous Display|C|EOE +#248|Cloudsculpt Technician|C|EOE +#249|Divert Disaster|C|EOE +#250|Illvoi Light Jammer|C|EOE +#251|Mechan Shieldmate|C|EOE +#252|Mental Modulation|C|EOE +#253|Nanoform Sentinel|C|EOE +#254|Comet Crawler|C|EOE +#255|Dark Endurance|C|EOE +#256|Monoist Sentry|U|EOE +#257|Frontline War-Rager|C|EOE +#258|Kavaron Skywarden|C|EOE +#259|Nebula Dragon|C|EOE +#260|Rig for War|C|EOE +#261|Slagdrill Scrapper|C|EOE +#262|Germinating Wurm|C|EOE +#263|Meltstrider's Gear|C|EOE +#264|Skystinger|C|EOE +#265|Thaumaton Torpedo|C|EOE +#266|Grove of the Burnwillows|M|EOE +#267|Shattered Wings|C|EOE +#268|Sinister Cryologist|C|EOE +#269|Drill Too Deep|C|EOE +#270|Annul|U|EOE +#271|Sothera, the Supervoid|M|EOE +#272|Sunset Saboteur|R|EOE +#273|Temporal Intervention|C|EOE +#274|Cosmogoyf|R|EOE +#275|Adagia, Windswept Bastion|M|EOE +#276|Evendo, Waking Haven|M|EOE +#277|Kavaron, Memorial World|M|EOE +#278|Susur Secundi, Void Altar|M|EOE +#279|Pinnacle Starcage|R|EOE +#280|Requiem Monolith|R|EOE +#281|Space-Time Anomaly|R|EOE +#282|Terminal Velocity|R|EOE +#283|Sliver Overlord|M|EOE +#284|Contested War Zone|R|EOE +#285|Mana Confluence|M|EOE +#286|Cathedral of War|R|EOE +#287|Deserted Temple|M|EOE +#288|Mirrorpool|M|EOE +#289|Lotus Field|M|EOE +#290|Plaza of Heroes|M|EOE +#291|Swarmyard|R|EOE +#292|The Eternity Elevator|R|EOE +#293|Moonlit Meditation|R|EOE +#294|Burgeoning|M|EOE +#295|Magus of the Moon|M|EOE +#296|Darkness|M|EOE +#297|Paradox Haze|M|EOE +#298|Robe of Stars|M|EOE +#299|Deafening Silence|M|EOE +#300|Warping Wail|M|EOE +#301|Cascading Cataracts|R|EOE +#302|Crystal Quarry|R|EOE +#303|Dust Bowl|M|EOE +#304|Echoing Deeps|R|EOE +#305|Eldrazi Temple|R|EOE +#306|Endless Sands|R|EOE +#307|Gemstone Caverns|M|EOE +#308|High Market|R|EOE +#309|Nesting Grounds|R|EOE +#310|Petrified Field|M|EOE +#311|Power Depot|R|EOE +#312|Scavenger Grounds|R|EOE +#313|Terrain Generator|R|EOE +#314|Thespian's Stage|R|EOE +#315|Strip Mine|M|EOE +#316|Blast Zone|R|EOE +#317|Plains|C|EOE +#318|Island|C|EOE +#319|Swamp|C|EOE +#320|Mountain|C|EOE +#321|Forest|C|EOE diff --git a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt index bbb393c1eaa..28c69011dd5 100644 --- a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt +++ b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt @@ -1,7 +1,7 @@ [metadata] Code=EOS Date=2025-08-01 -Name=Edge of Eternities: Stellar Sights +Name=Edge of Eternities: Steller Sights Type=Collector_Edition ScryfallCode=EOS diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index 912617ecd07..7e2d82c4599 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -4,6 +4,54 @@ Date=2025-08-01 Name=Edge of Eternities Type=Expansion ScryfallCode=EOE +TokensCode=TEOE +https://mtgscribe.com/2025/07/16/edge-of-eternities-play-booster-fact-sheet/ +BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil +BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil +Booster=6 Common,1 Common-Guest,3 Uncommon, 1 RareMythic, 1 WildcardA, 1 WildcardB+, 1 BasicLand +Prerelease=6 Boosters, 1 RareMythic+ +BoosterBox=30 + +[Common] +Base=Common:fromSheet("cards"):!BasicLand + +[Common-Guest] +Base=Common:fromSheet("cards"):!BasicLand +Replace=.018F fromSheet("special guests") + +[Uncommon] +Base=Uncommon:fromSheet("cards") + +[RareMythic] +Base=Rare:fromSheet("cards") +Replace=.142F Mythic:fromSheet("cards") +Replace=.036F Rare:fromSheet("borderless") +Replace=.018F Mythic:fromSheet("borderless") + +[WildcardA] +Base=Uncommon:fromSheet("cards") +Replace=0.125F Common:fromSheet("cards"):!BasicLand +Replace=0.106F Rare:fromSheet("cards") +Replace=0.003F Mythic:fromSheet("cards") +Replace=0.1F Rare:fromSheet("EOS cards") +Replace=0.025F Mythic:fromSheet("EOS cards") +Replace=0.01F Rare:fromSheet("borderless") +Replace=0.005F Mythic:fromSheet("borderless") + +[WildcardB] +Base=Common:fromSheet("cards"):!BasicLand +Replace=0.32F Uncommon:fromSheet("cards") +Replace=0.064F Rare:fromSheet("cards") +Replace=0.011F Mythic:fromSheet("cards") +Replace=0.01F Rare:fromSheet("EOS cards") +Replace=0.0075F Mythic:fromSheet("EOS cards") +Replace=0.0075F fromSheet("borderless"):!BasicLand + +[BasicLand] +Base=BasicLand:fromSheet("cards") +Replace=0.16F BasicLand:fromSheet("cards")+ +Replace=0.16F BasicLand:fromSheet("borderless") +Replace=0.04F BasicLand:fromSheet("borderless")+ [cards] 1 R Anticausal Vestige @Chase Stone @@ -414,6 +462,18 @@ ScryfallCode=EOE 398 R Singularity Rupture @Néstor Ossandón Leal 399 R Emissary Escort @Lius Lasahido +[special guests] +1 Warping Wall|SPG +1 Nexus of Fate|SPG +1 Paradox of Haze|SPG +1 Magus of the Moon|SPG +1 Sliver Overlord|SPG +1 Darkness|SPG +1 Green Sun's Zenith|SPG +1 Deafening Silence|SPG +1 Robe of Stars|SPG +1 Burgeoning|SPG + [tokens] 1 c_1_1_sliver @Igor Grechanyi 2 w_1_1_human_soldier @Allen Morris From 44046b475b21563cf7ced518befa715063ab03be Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Tue, 22 Jul 2025 10:36:04 -0500 Subject: [PATCH 083/183] Add EOE to blocks --- forge-gui/res/blockdata/blocks.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index abf2913b440..a84d2432af7 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -143,3 +143,4 @@ Aetherdrift, 3/6/DFT, DFT Tarkir Dragonstorm, 3/6/TDM, TDM Final Fantasy, 3/6/FIN, FIN Alchemy: Innistrad, 3/6/ISD, YMID +Edge of Eternity, 3/6/EOE, EOE From 9ff528029ab8700d371a9ff637ccdcfdd22542bf Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Tue, 22 Jul 2025 11:27:08 -0500 Subject: [PATCH 084/183] Fix draft ranking set codes --- forge-gui/res/draft/rankings/eoe.rnk | 110 +++++++++++++-------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/forge-gui/res/draft/rankings/eoe.rnk b/forge-gui/res/draft/rankings/eoe.rnk index 92d90c6708c..c3f52a75fca 100644 --- a/forge-gui/res/draft/rankings/eoe.rnk +++ b/forge-gui/res/draft/rankings/eoe.rnk @@ -1,17 +1,17 @@ //Rank|Name|Rarity|Set #1|Singularity Rupture|R|EOE #2|Zero Point Ballad|R|EOE -#3|Celestial Colonnade|R|EOE +#3|Celestial Colonnade|R|EOS #4|Astelli Reclaimer|R|EOE #5|Beyond the Quiet|R|EOE #6|Cosmogrand Zenith|M|EOE #7|Exalted Sunborn|M|EOE #8|Quantum Riddler|M|EOE #9|Ouroboroid|M|EOE -#10|Creeping Tar Pit|R|EOE -#11|Lavaclaw Reaches|R|EOE -#12|Lumbering Falls|R|EOE -#13|Raging Ravine|R|EOE +#10|Creeping Tar Pit|R|EOS +#11|Lavaclaw Reaches|R|EOS +#12|Lumbering Falls|R|EOS +#13|Raging Ravine|R|EOS #14|Elegy Acolyte|R|EOE #15|Mightform Harmonizer|R|EOE #16|Alpharael, Stonechosen|M|EOE @@ -22,7 +22,7 @@ #21|Xu-Ifit, Osteoharmonist|R|EOE #22|Syr Vondam, Sunstar Exemplar|R|EOE #23|Starwinder|R|EOE -#24|Stirring Wildwood|R|EOE +#24|Stirring Wildwood|R|EOS #25|Sunstar Chaplain|R|EOE #26|Warmaker Gunship|R|EOE #27|Frenzied Baloth|R|EOE @@ -55,12 +55,12 @@ #54|Station Monitor|U|EOE #55|Memorial Vault|R|EOE #56|Tannuk, Steadfast Second|M|EOE -#57|Green Sun's Zenith|M|EOE -#58|Nexus of Fate|M|EOE -#59|Ancient Tomb|M|EOE -#60|Blinkmoth Nexus|R|EOE -#61|Hissing Quagmire|R|EOE -#62|Shambling Vent|R|EOE +#57|Green Sun's Zenith|M|SPG +#58|Nexus of Fate|M|SPG +#59|Ancient Tomb|M|EOS +#60|Blinkmoth Nexus|R|EOS +#61|Hissing Quagmire|R|EOS +#62|Shambling Vent|R|EOS #63|Pulsar Squadron Ace|U|EOE #64|Rescue Skiff|U|EOE #65|Sunstar Expansionist|U|EOE @@ -93,8 +93,8 @@ #92|Secluded Starforge|R|EOE #93|Meltstrider's Resolve|U|EOE #94|Mm'menon, Uthros Exile|U|EOE -#95|Needle Spires|R|EOE -#96|Wandering Fumarole|R|EOE +#95|Needle Spires|R|EOS +#96|Wandering Fumarole|R|EOS #97|Timeline Culler|U|EOE #98|Umbral Collar Zealot|U|EOE #99|Voidforged Titan|U|EOE @@ -154,12 +154,12 @@ #153|Gene Pollinator|C|EOE #154|Intrepid Tenderfoot|C|EOE #155|Seedship Agrarian|U|EOE -#156|Bonders' Enclave|R|EOE -#157|Inkmoth Nexus|M|EOE -#158|Inventors' Fair|M|EOE -#159|Mutavault|M|EOE -#160|Reflecting Pool|M|EOE -#161|Sunken Citadel|R|EOE +#156|Bonders' Enclave|R|EOS +#157|Inkmoth Nexus|M|EOS +#158|Inventors' Fair|M|EOS +#159|Mutavault|M|EOS +#160|Reflecting Pool|M|EOS +#161|Sunken Citadel|R|EOS #162|Illvoi Galeblade|C|EOE #163|Mouth of the Storm|U|EOE #164|Starbreach Whale|C|EOE @@ -232,8 +232,8 @@ #231|Icecave Crasher|C|EOE #232|Pull Through the Weft|U|EOE #233|Thawbringer|C|EOE -#234|Meteor Crater|R|EOE -#235|Mystifying Maze|R|EOE +#234|Meteor Crater|R|EOS +#235|Mystifying Maze|R|EOS #236|Starport Security|C|EOE #237|Embrace Oblivion|C|EOE #238|Insatiable Skittermaw|C|EOE @@ -264,7 +264,7 @@ #263|Meltstrider's Gear|C|EOE #264|Skystinger|C|EOE #265|Thaumaton Torpedo|C|EOE -#266|Grove of the Burnwillows|M|EOE +#266|Grove of the Burnwillows|M|EOS #267|Shattered Wings|C|EOE #268|Sinister Cryologist|C|EOE #269|Drill Too Deep|C|EOE @@ -281,40 +281,40 @@ #280|Requiem Monolith|R|EOE #281|Space-Time Anomaly|R|EOE #282|Terminal Velocity|R|EOE -#283|Sliver Overlord|M|EOE -#284|Contested War Zone|R|EOE -#285|Mana Confluence|M|EOE -#286|Cathedral of War|R|EOE -#287|Deserted Temple|M|EOE -#288|Mirrorpool|M|EOE -#289|Lotus Field|M|EOE -#290|Plaza of Heroes|M|EOE -#291|Swarmyard|R|EOE +#283|Sliver Overlord|M|SPG +#284|Contested War Zone|R|EOS +#285|Mana Confluence|M|EOS +#286|Cathedral of War|R|EOS +#287|Deserted Temple|M|EOS +#288|Mirrorpool|M|EOS +#289|Lotus Field|M|EOS +#290|Plaza of Heroes|M|EOS +#291|Swarmyard|R|EOS #292|The Eternity Elevator|R|EOE #293|Moonlit Meditation|R|EOE -#294|Burgeoning|M|EOE -#295|Magus of the Moon|M|EOE -#296|Darkness|M|EOE -#297|Paradox Haze|M|EOE -#298|Robe of Stars|M|EOE -#299|Deafening Silence|M|EOE -#300|Warping Wail|M|EOE -#301|Cascading Cataracts|R|EOE -#302|Crystal Quarry|R|EOE -#303|Dust Bowl|M|EOE -#304|Echoing Deeps|R|EOE -#305|Eldrazi Temple|R|EOE -#306|Endless Sands|R|EOE -#307|Gemstone Caverns|M|EOE -#308|High Market|R|EOE -#309|Nesting Grounds|R|EOE -#310|Petrified Field|M|EOE -#311|Power Depot|R|EOE -#312|Scavenger Grounds|R|EOE -#313|Terrain Generator|R|EOE -#314|Thespian's Stage|R|EOE -#315|Strip Mine|M|EOE -#316|Blast Zone|R|EOE +#294|Burgeoning|M|SPG +#295|Magus of the Moon|M|SPG +#296|Darkness|M|SPG +#297|Paradox Haze|M|SPG +#298|Robe of Stars|M|SPG +#299|Deafening Silence|M|SPG +#300|Warping Wail|M|SPG +#301|Cascading Cataracts|R|EOS +#302|Crystal Quarry|R|EOS +#303|Dust Bowl|M|EOS +#304|Echoing Deeps|R|EOS +#305|Eldrazi Temple|R|EOS +#306|Endless Sands|R|EOS +#307|Gemstone Caverns|M|EOS +#308|High Market|R|EOS +#309|Nesting Grounds|R|EOS +#310|Petrified Field|M|EOS +#311|Power Depot|R|EOS +#312|Scavenger Grounds|R|EOS +#313|Terrain Generator|R|EOS +#314|Thespian's Stage|R|EOS +#315|Strip Mine|M|EOS +#316|Blast Zone|R|EOS #317|Plains|C|EOE #318|Island|C|EOE #319|Swamp|C|EOE From b5f696756ec8eea7e55f74eefb262dd492ce276a Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Tue, 22 Jul 2025 11:29:49 -0500 Subject: [PATCH 085/183] Fix EOS set name --- forge-gui/res/editions/Edge of Eternities Stellar Sights.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt index 28c69011dd5..bbb393c1eaa 100644 --- a/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt +++ b/forge-gui/res/editions/Edge of Eternities Stellar Sights.txt @@ -1,7 +1,7 @@ [metadata] Code=EOS Date=2025-08-01 -Name=Edge of Eternities: Steller Sights +Name=Edge of Eternities: Stellar Sights Type=Collector_Edition ScryfallCode=EOS From dccbd9912db62d4bddffe7ae49582f1953f54090 Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Tue, 22 Jul 2025 12:10:09 -0500 Subject: [PATCH 086/183] Small mistakes correction --- forge-gui/res/blockdata/blocks.txt | 2 +- forge-gui/res/editions/Edge of Eternities.txt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index a84d2432af7..1d7ec93740f 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -143,4 +143,4 @@ Aetherdrift, 3/6/DFT, DFT Tarkir Dragonstorm, 3/6/TDM, TDM Final Fantasy, 3/6/FIN, FIN Alchemy: Innistrad, 3/6/ISD, YMID -Edge of Eternity, 3/6/EOE, EOE +Edge of Eternities, 3/6/EOE, EOE diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index 7e2d82c4599..d831772a11b 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -4,8 +4,7 @@ Date=2025-08-01 Name=Edge of Eternities Type=Expansion ScryfallCode=EOE -TokensCode=TEOE -https://mtgscribe.com/2025/07/16/edge-of-eternities-play-booster-fact-sheet/ +#https://mtgscribe.com/2025/07/16/edge-of-eternities-play-booster-fact-sheet/ BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil Booster=6 Common,1 Common-Guest,3 Uncommon, 1 RareMythic, 1 WildcardA, 1 WildcardB+, 1 BasicLand From 800b88911a2157bf39c599a8866ba0a0f9471ee1 Mon Sep 17 00:00:00 2001 From: Matthew Krafczyk Date: Tue, 22 Jul 2025 12:50:57 -0500 Subject: [PATCH 087/183] Fix draft slot definitions --- forge-gui/res/editions/Edge of Eternities.txt | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index d831772a11b..c7bc748a7c0 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -5,52 +5,51 @@ Name=Edge of Eternities Type=Expansion ScryfallCode=EOE #https://mtgscribe.com/2025/07/16/edge-of-eternities-play-booster-fact-sheet/ -BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil -BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,AnyLand,Wildcard,WildcardFoil -Booster=6 Common,1 Common-Guest,3 Uncommon, 1 RareMythic, 1 WildcardA, 1 WildcardB+, 1 BasicLand +BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,BasicLand,Wildcard,WildcardFoil +Booster=6 Common,1 Common-Guest,3 Uncommon, 1 RareMythic, 1 Wildcard, 1 WildcardFoil+, 1 BasicLand Prerelease=6 Boosters, 1 RareMythic+ BoosterBox=30 [Common] -Base=Common:fromSheet("cards"):!BasicLand +Base=Common:fromSheet("EOE cards"):!BasicLand [Common-Guest] -Base=Common:fromSheet("cards"):!BasicLand -Replace=.018F fromSheet("special guests") +Base=Common:fromSheet("EOE cards"):!BasicLand +Replace=.018F fromSheet("EOE special guests") [Uncommon] -Base=Uncommon:fromSheet("cards") +Base=Uncommon:fromSheet("EOE cards") [RareMythic] -Base=Rare:fromSheet("cards") -Replace=.142F Mythic:fromSheet("cards") -Replace=.036F Rare:fromSheet("borderless") -Replace=.018F Mythic:fromSheet("borderless") +Base=Rare:fromSheet("EOE cards") +Replace=.142F Mythic:fromSheet("EOE cards") +Replace=.036F Rare:fromSheet("EOE borderless") +Replace=.018F Mythic:fromSheet("EOE borderless") -[WildcardA] -Base=Uncommon:fromSheet("cards") -Replace=0.125F Common:fromSheet("cards"):!BasicLand -Replace=0.106F Rare:fromSheet("cards") -Replace=0.003F Mythic:fromSheet("cards") +[Wildcard] +Base=Uncommon:fromSheet("EOE cards") +Replace=0.125F Common:fromSheet("EOE cards"):!BasicLand +Replace=0.106F Rare:fromSheet("EOE cards") +Replace=0.003F Mythic:fromSheet("EOE cards") Replace=0.1F Rare:fromSheet("EOS cards") Replace=0.025F Mythic:fromSheet("EOS cards") -Replace=0.01F Rare:fromSheet("borderless") -Replace=0.005F Mythic:fromSheet("borderless") +Replace=0.01F Rare:fromSheet("EOE borderless") +Replace=0.005F Mythic:fromSheet("EOE borderless") -[WildcardB] -Base=Common:fromSheet("cards"):!BasicLand -Replace=0.32F Uncommon:fromSheet("cards") -Replace=0.064F Rare:fromSheet("cards") -Replace=0.011F Mythic:fromSheet("cards") +[WildcardFoil] +Base=Common:fromSheet("EOE cards"):!BasicLand +Replace=0.32F Uncommon:fromSheet("EOE cards") +Replace=0.064F Rare:fromSheet("EOE cards") +Replace=0.011F Mythic:fromSheet("EOE cards") Replace=0.01F Rare:fromSheet("EOS cards") Replace=0.0075F Mythic:fromSheet("EOS cards") -Replace=0.0075F fromSheet("borderless"):!BasicLand +Replace=0.0075F fromSheet("EOE borderless"):!BasicLand [BasicLand] -Base=BasicLand:fromSheet("cards") -Replace=0.16F BasicLand:fromSheet("cards")+ -Replace=0.16F BasicLand:fromSheet("borderless") -Replace=0.04F BasicLand:fromSheet("borderless")+ +Base=BasicLand:fromSheet("EOE cards") +Replace=0.16F BasicLand:fromSheet("EOE cards")+ +Replace=0.16F BasicLand:fromSheet("EOE borderless") +Replace=0.04F BasicLand:fromSheet("EOE borderless")+ [cards] 1 R Anticausal Vestige @Chase Stone From 943d6edabd384a2efdb982b52d2e171962d91081 Mon Sep 17 00:00:00 2001 From: Drecon84 Date: Tue, 22 Jul 2025 21:06:58 +0200 Subject: [PATCH 088/183] Re-adding item to New Game+ Adventure When I put in the code to delete quest items on a new game+ I forgot to re-add the colorless rune in case you start without the main quest (you get it as part of the main quest). This fixes that. --- forge-gui/res/adventure/Shandalar/world/quests.json | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/adventure/Shandalar/world/quests.json b/forge-gui/res/adventure/Shandalar/world/quests.json index 80fcc2e225c..cc8eb1902ca 100644 --- a/forge-gui/res/adventure/Shandalar/world/quests.json +++ b/forge-gui/res/adventure/Shandalar/world/quests.json @@ -7038,6 +7038,7 @@ "action": [ { "removeItem": "", + "addItem": "Colorless rune", "setColorIdentity": "", "advanceQuestFlag": "", "advanceMapFlag": "", From 9f7852e76fd678a082d6fe63a06ad1dbda3516ce Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Jul 2025 06:29:58 +0800 Subject: [PATCH 089/183] update SettingsScene landscape checkbox --- .../forge/adventure/scene/SettingsScene.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java index 6c7496be284..1edc6717d5d 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java @@ -260,9 +260,19 @@ public class SettingsScene extends UIScene { if (!GuiBase.isAndroid()) { addCheckBox(Forge.getLocalizer().getMessage("lblBattlefieldTextureFiltering"), ForgePreferences.FPref.UI_LIBGDX_TEXTURE_FILTERING); addCheckBox(Forge.getLocalizer().getMessage("lblAltZoneTabs"), ForgePreferences.FPref.UI_ALT_PLAYERZONETABS); + } else { + addCheckBox(Forge.getLocalizer().getMessage("lblLandscapeMode") + " (" + + Forge.getLocalizer().getMessage("lblRestartRequired") + ")", + ForgePreferences.FPref.UI_LANDSCAPE_MODE, () -> { + boolean landscapeMode = FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_LANDSCAPE_MODE); + //ensure device able to save off ini file so landscape change takes effect + Forge.getDeviceAdapter().setLandscapeMode(landscapeMode); + if (Forge.isLandscapeMode() != landscapeMode) { + restartForge(); + } + }); } - addCheckBox(Forge.getLocalizer().getMessage("lblLandscapeMode"), ForgePreferences.FPref.UI_LANDSCAPE_MODE); addCheckBox(Forge.getLocalizer().getMessage("lblAnimatedCardTapUntap"), ForgePreferences.FPref.UI_ANIMATED_CARD_TAPUNTAP); if (!GuiBase.isAndroid()) { final String[] item = {FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING)}; @@ -320,6 +330,10 @@ public class SettingsScene extends UIScene { } private void addCheckBox(String name, ForgePreferences.FPref pref) { + addCheckBox(name, pref, null); + } + + private void addCheckBox(String name, ForgePreferences.FPref pref, Runnable runnable) { CheckBox box = Controls.newCheckBox(""); box.setChecked(FModel.getPreferences().getPrefBoolean(pref)); box.addListener(new ChangeListener() { @@ -327,6 +341,8 @@ public class SettingsScene extends UIScene { public void changed(ChangeEvent event, Actor actor) { FModel.getPreferences().setPref(pref, ((CheckBox) actor).isChecked()); FModel.getPreferences().save(); + if (runnable != null) + runnable.run(); } }); From 0d2d01060d5d95a0abfb346bdffc5f629717a2a5 Mon Sep 17 00:00:00 2001 From: Eradev Date: Tue, 22 Jul 2025 19:01:51 -0400 Subject: [PATCH 090/183] Add g_1_1_insect_flying token --- forge-gui/res/tokenscripts/g_1_1_insect_flying.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/tokenscripts/g_1_1_insect_flying.txt diff --git a/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt b/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt new file mode 100644 index 00000000000..86cb3c8b510 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt @@ -0,0 +1,7 @@ +Name:Insect Token +ManaCost:no cost +Colors:green +Types:Creature Insect +PT:1/1 +K:Flying +Oracle:Flying From 55c4d4240fd5ec722b7b5d2fda45269e53868594 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:24:31 -0400 Subject: [PATCH 091/183] Update AER --- forge-gui/res/editions/Aether Revolt.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/editions/Aether Revolt.txt b/forge-gui/res/editions/Aether Revolt.txt index e19c09e50f5..6ad777c4c33 100644 --- a/forge-gui/res/editions/Aether Revolt.txt +++ b/forge-gui/res/editions/Aether Revolt.txt @@ -240,3 +240,6 @@ Wurmcoil Engine|MPS_KLD 1 r_2_2_gremlin @Jason Rainville 2 ragavan @Daniel Ljunggren 3 etherium_cell @Craig J Spearing + +[other] +4 emblem_tezzeret_the_schemer @Ryan Alexander Lee \ No newline at end of file From b45153bee81d756d5100c07d495a7b2ae4823721 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:24:47 -0400 Subject: [PATCH 092/183] Update DFT --- forge-gui/res/editions/Aetherdrift.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/editions/Aetherdrift.txt b/forge-gui/res/editions/Aetherdrift.txt index 11faa67350f..c5d90fff761 100644 --- a/forge-gui/res/editions/Aetherdrift.txt +++ b/forge-gui/res/editions/Aetherdrift.txt @@ -646,3 +646,6 @@ Replace=.011F Mythic:fromSheet("DFT cards") 10 c_1_1_a_thopter_flying @Kev Fang 11 c_a_treasure_sac @Racrufi 12 c_3_2_a_vehicle_crew_1 @Devin Elle Kurtz + +[other] +14 emblem_chandra_spark_hunter @Devin Elle Kurtz From 7ebe74e57c2ac48aba5b3c86b9799d98c5f327e7 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:26:48 -0400 Subject: [PATCH 093/183] Update PARB --- forge-gui/res/editions/Alara Reborn Promos.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/editions/Alara Reborn Promos.txt b/forge-gui/res/editions/Alara Reborn Promos.txt index 4a8b16b63ff..b7b2b46c3c1 100644 --- a/forge-gui/res/editions/Alara Reborn Promos.txt +++ b/forge-gui/res/editions/Alara Reborn Promos.txt @@ -6,5 +6,6 @@ Type=Promo ScryfallCode=PARB [cards] +A4 R Retaliator Griffin @Jesper Ejsing 53★ M Dragon Broodmother @Jean-Sébastien Rossbach 70★ R Knight of New Alara @David Palumbo From 8f8abdbab9a2fb629fd49342e112ffd427534638 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:28:38 -0400 Subject: [PATCH 094/183] Update YOTJ --- forge-gui/res/editions/Alchemy Thunder Junction.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/forge-gui/res/editions/Alchemy Thunder Junction.txt b/forge-gui/res/editions/Alchemy Thunder Junction.txt index 8f57f0a0d4d..7e7ebe60c3c 100644 --- a/forge-gui/res/editions/Alchemy Thunder Junction.txt +++ b/forge-gui/res/editions/Alchemy Thunder Junction.txt @@ -37,6 +37,3 @@ ScryfallCode=YOTJ 28 R Vona de Iedo, the Antifex @Fajareka Setiawan 29 U Weave the Nightmare @Wayne Wu 30 U Runecarved Obelisk @Jorge Jacinto - -[tokens] -w_x_x_avatar From 485d2dbaf8988d4ee5f8e0032977204b98e73901 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:30:17 -0400 Subject: [PATCH 095/183] Update ALL --- forge-gui/res/editions/Alliances.txt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/forge-gui/res/editions/Alliances.txt b/forge-gui/res/editions/Alliances.txt index 2d62018bc82..8425b474820 100644 --- a/forge-gui/res/editions/Alliances.txt +++ b/forge-gui/res/editions/Alliances.txt @@ -210,15 +210,3 @@ ScryfallCode=ALL 142 R Sheltered Valley @Rob Alexander 143 R Soldevi Excavations @Liz Danforth 144 R Thawing Glaciers @Jeff A. Menges - -[tokens] -w_0_1_deserter -w_1_1_knight_banding -w_1_1_soldier -u_0_1_starfish -u_x_x_orb_flying -b_2_2_zombie -r_1_1_survivor -g_1_1_hippo -g_1_1_splinter_flying_cum -br_3_1_graveborn_haste From 3d9bb1f43735f8653709d47e32b3266df1441b52 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:33:43 -0400 Subject: [PATCH 096/183] Update PAKH --- forge-gui/res/editions/Amonkhet Promos.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/editions/Amonkhet Promos.txt b/forge-gui/res/editions/Amonkhet Promos.txt index 390fa911366..cc9e6cd3db0 100644 --- a/forge-gui/res/editions/Amonkhet Promos.txt +++ b/forge-gui/res/editions/Amonkhet Promos.txt @@ -7,6 +7,7 @@ ScryfallCode=PAKH [cards] 35 U Trueheart Duelist @Magali Villeneuve +49 R Curator of Mysteries @Christine Choi 78 R Archfiend of Ifnir @Slawomir Maniak 134 R Glorybringer @Grzegorz Rutkowski 234 R Oracle's Vault @Cliff Childs From 462bdf19b979ad694858dc18b073d8f736e74e75 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:34:00 -0400 Subject: [PATCH 097/183] Update MPS_AKH --- forge-gui/res/editions/Amonkhet Invocations.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui/res/editions/Amonkhet Invocations.txt b/forge-gui/res/editions/Amonkhet Invocations.txt index 81609bc9430..f36189c66b6 100644 --- a/forge-gui/res/editions/Amonkhet Invocations.txt +++ b/forge-gui/res/editions/Amonkhet Invocations.txt @@ -65,7 +65,3 @@ ScryfallCode=MP2 52 S Lord of Extinction @Jason A. Engle 53 S The Scarab God @Grzegorz Rutkowski 54 S The Scorpion God @Grzegorz Rutkowski - -[tokens] -w_1_1_warrior_vigilance -ur_1_1_insect_flying_haste From a644a4c7bc1879252654b7fd15f4385656ae8da2 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:36:20 -0400 Subject: [PATCH 098/183] Update ATQ --- forge-gui/res/editions/Antiquities.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/forge-gui/res/editions/Antiquities.txt b/forge-gui/res/editions/Antiquities.txt index c5a06bd5e7f..f2a70c2119e 100644 --- a/forge-gui/res/editions/Antiquities.txt +++ b/forge-gui/res/editions/Antiquities.txt @@ -111,6 +111,3 @@ ScryfallCode=ATQ 85b U Urza's Tower @Mark Poole 85c U Urza's Tower @Mark Poole 85d U Urza's Tower @Mark Poole - -[tokens] -c_1_1_a_tetravite_flying_noenchant From 87226d9bd9c907d9e96666e6a9c3e54d1f9dfd12 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:36:42 -0400 Subject: [PATCH 099/183] Update ATH --- forge-gui/res/editions/Anthologies.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui/res/editions/Anthologies.txt b/forge-gui/res/editions/Anthologies.txt index 78621adbf69..aff26800b2e 100644 --- a/forge-gui/res/editions/Anthologies.txt +++ b/forge-gui/res/editions/Anthologies.txt @@ -93,7 +93,3 @@ ScryfallCode=ATH 83 L Mountain @John Avon 84 L Forest @Tony Roberts 85 L Forest @Quinton Hoover - -[tokens] -w_1_1_pegasus_flying -r_1_1_goblin From f2db114cb6279890bd9675e2848d4d9861ab2250 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:37:47 -0400 Subject: [PATCH 100/183] Update APC --- forge-gui/res/editions/Apocalypse.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/forge-gui/res/editions/Apocalypse.txt b/forge-gui/res/editions/Apocalypse.txt index ffb7e256e6f..95eeb644b29 100644 --- a/forge-gui/res/editions/Apocalypse.txt +++ b/forge-gui/res/editions/Apocalypse.txt @@ -155,11 +155,3 @@ ScryfallCode=APC 141 R Llanowar Wastes @Rob Alexander 142 R Shivan Reef @Rob Alexander 143 R Yavimaya Coast @Anthony S. Waters - -[tokens] -b_3_3_angel_flying -b_2_1_cat -b_3_3_kavu -b_6_6_wurm_trample -g_1_1_saproling -rw_1_1_goblin_soldier From 285417275d69378c41bc730fbb3d92a2398f08d3 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:39:15 -0400 Subject: [PATCH 101/183] Update AVR --- forge-gui/res/editions/Avacyn Restored.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Avacyn Restored.txt b/forge-gui/res/editions/Avacyn Restored.txt index a446587bae8..01b5f68f4d6 100644 --- a/forge-gui/res/editions/Avacyn Restored.txt +++ b/forge-gui/res/editions/Avacyn Restored.txt @@ -2,7 +2,6 @@ Code=AVR Date=2012-05-04 Name=Avacyn Restored -Code2=AVR Type=Expansion BoosterCovers=5 Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand @@ -265,3 +264,6 @@ ScryfallCode=AVR 5 b_5_5_demon_flying @Kev Walker 6 b_2_2_zombie @Lucas Graciano 7 r_1_1_human_haste @Ryan Pancoast + +[other] +8 emblem_tamiyo_the_moon_sage @Eric Deschamps \ No newline at end of file From 12c487f7b8fc088824c1e014d0f86e8c08a692a7 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:40:27 -0400 Subject: [PATCH 102/183] Update PAVR --- forge-gui/res/editions/Avacyn Restored Promos.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/editions/Avacyn Restored Promos.txt b/forge-gui/res/editions/Avacyn Restored Promos.txt index 74f16483e42..a4de7c2f30e 100644 --- a/forge-gui/res/editions/Avacyn Restored Promos.txt +++ b/forge-gui/res/editions/Avacyn Restored Promos.txt @@ -6,6 +6,7 @@ Type=Promo ScryfallCode=PAVR [cards] +A19 R Angel of Glory's Rise @James Ryman 32★ R Restoration Angel @Wesley Burt 36★ R Silverblade Paladin @Todd Lockwood 63 U Latch Seeker @Eytan Zana From ac5128d1336863f7723623977a7612fbbe82c12b Mon Sep 17 00:00:00 2001 From: Eradev Date: Wed, 9 Jul 2025 23:35:39 -0400 Subject: [PATCH 103/183] Update ACR --- forge-gui/res/editions/Assassin's Creed.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/forge-gui/res/editions/Assassin's Creed.txt b/forge-gui/res/editions/Assassin's Creed.txt index 0c147df3f12..24099b0c4cd 100644 --- a/forge-gui/res/editions/Assassin's Creed.txt +++ b/forge-gui/res/editions/Assassin's Creed.txt @@ -313,3 +313,15 @@ ScryfallCode=ACR 305 L Mountain @Jeremy Paillotin 306 R Royal Assassin @Wei Guan 307 U Hidden Blade @Evyn Fong + +[tokens] +2 c_3_2_shapeshifter_changeling @Filipe Pagliuso +3 w_1_1_human_rogue @Elizabeth Peiró +4 b_1_1_assassin_menace @Rimas Valeikis +5 phobos @Daniel Correia +6 c_a_treasure_sac @Xabi Gaztelua + +[other] +1 copy @Miklós Ligeti +7 emblem_the_capitoline_triad @Syd Mills +8 cloaked @Allen Morris \ No newline at end of file From 34d009a458c9578022e7383f7a543b529f78f987 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:47:34 -0400 Subject: [PATCH 104/183] Update ARN --- forge-gui/res/editions/Arabian Nights.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui/res/editions/Arabian Nights.txt b/forge-gui/res/editions/Arabian Nights.txt index 47bff97e1f4..a4758fac2dc 100644 --- a/forge-gui/res/editions/Arabian Nights.txt +++ b/forge-gui/res/editions/Arabian Nights.txt @@ -103,7 +103,3 @@ ScryfallCode=ARN 76 U Library of Alexandria @Mark Poole 77 C Mountain @Douglas Shuler 78 U Oasis @Brian Snõddy - -[tokens] -r_4_4_bird_flying -c_5_5_a_djinn_flying From 949432196555067b1f7224a14cb6ec3c475628cd Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 05:52:00 -0400 Subject: [PATCH 105/183] Update E01 --- .../res/editions/Archenemy Nicol Bolas.txt | 233 ++++++++---------- 1 file changed, 106 insertions(+), 127 deletions(-) diff --git a/forge-gui/res/editions/Archenemy Nicol Bolas.txt b/forge-gui/res/editions/Archenemy Nicol Bolas.txt index b101b891e07..f6e89b515df 100644 --- a/forge-gui/res/editions/Archenemy Nicol Bolas.txt +++ b/forge-gui/res/editions/Archenemy Nicol Bolas.txt @@ -2,137 +2,116 @@ Code=E01 Date=2017-06-16 Name=Archenemy: Nicol Bolas -Code2=E01 Type=Multiplayer ScryfallCode=E01 [cards] -1 R Aegis Angel -2 U Aerial Responder -3 U Anointer of Champions -4 C Doomed Traveler -5 C Excoriate -6 C Expedition Raptor -7 U Fencing Ace -8 R Fiendslayer Paladin -9 U Flickerwisp -10 M Gideon Jura -11 C Gideon's Lawkeeper -12 R Grand Abolisher -13 C Grasp of the Hieromancer -14 R Lightwielder Paladin -15 R Mentor of the Meek -16 C Moment of Heroism -17 R Odric, Master Tactician -18 R Precinct Captain -19 U Relief Captain -20 C Shoulder to Shoulder -21 M Sun Titan -22 C Youthful Knight -23 C Compulsive Research -24 R Icefall Regent -25 C Ior Ruin Expedition -26 R Prognostic Sphinx -27 U Reckless Scholar -28 R Sphinx of Jwar Isle -29 C Vision Skeins -30 C Windrider Eel -31 R Archfiend of Depravity -32 R Deathbringer Regent -33 U Doom Blade -34 R Harvester of Souls -35 C Nightscape Familiar -36 R Overseer of the Damned -37 U Reckless Spite -38 U Vampire Nighthawk -39 R Avatar of Fury -40 C Battle-Rattle Shaman -41 C Blood Ogre -42 M Chandra, Pyromaster -43 C Chandra's Outrage -44 R Chandra's Phoenix -45 U Coordinated Assault -46 R Dualcaster Mage -47 C Fiery Fall -48 U Flametongue Kavu -49 C Gorehorn Minotaurs -50 R Grim Lavamancer -51 U Guttersnipe -52 C Hammerhand -53 M Inferno Titan -54 U Lightning Bolt -55 M Obsidian Fireheart -56 C Searing Spear -57 U Skarrgan Firebird -58 U Stormblood Berserker -59 R Sudden Demise -60 R Torchling -61 U Volcanic Geyser -62 C Cultivate -63 C Explore -64 C Fertilid -65 R Forgotten Ancient -66 R Hunter's Prowess -67 C Khalni Heart Expedition -68 M Nissa, Worldwaker -69 R Oran-Rief Hydra -70 U Press the Advantage -71 M Rampaging Baloths -72 U Retreat to Kazandu -73 R Scute Mob -74 C Sylvan Bounty -75 R Thragtusk -76 U Turntimber Basilisk -77 C Vastwood Zendikon -78 C Vines of the Recluse -79 U Woodborn Behemoth -80 U Baleful Strix -81 R Blood Tyrant -82 R Cruel Ultimatum -83 R Dreadbore -84 U Extract from Darkness -85 M Nicol Bolas, Planeswalker -86 U Slave of Bolas -87 U Soul Ransom -88 C Obelisk of Grixis -89 R Sword of the Animist -90 U Talisman of Dominance -91 U Talisman of Indulgence -92 U Crumbling Necropolis -93 R Dragonskull Summit -94 R Drowned Catacomb -95 C Grixis Panorama -96 C Smoldering Spires -97 L Plains -98 L Island -99 L Swamp -100 L Mountain -101 L Forest -102 L Plains -103 L Island -104 L Swamp -105 L Mountain -106 L Forest -1 C Because I Have Willed It -2 C Behold My Grandeur -3 C Bow to My Command -4 C Choose Your Demise -5 C Delight in the Hunt -6 C Every Dream a Nightmare -7 C For Each of You, a Gift -8 C Know Evil -9 C Make Yourself Useful -10 C The Mighty Will Fall -11 C My Forces are Innumerable -12 C My Laughter Echoes -13 C No One Will Hear Your Cries -14 C Pay Tribute to Me -15 C Power Without Equal -16 C A Reckoning Approaches -17 C There Is No Refuge -18 C This World Belongs to Me -19 C What's Yours Is Now Mine -20 C When Will You Learn? +1 R Aegis Angel @Aleksi Briclot +2 U Aerial Responder @Raoul Vitale +3 U Anointer of Champions @Anna Steinbauer +4 C Doomed Traveler @Lars Grant-West +5 C Excoriate @Johann Bodin +6 C Expedition Raptor @Johann Bodin +7 U Fencing Ace @David Rapoza +8 R Fiendslayer Paladin @Wesley Burt +9 U Flickerwisp @Jeremy Enecio +10 M Gideon Jura @Chris Rahn +11 C Gideon's Lawkeeper @Steve Prescott +12 R Grand Abolisher @Eric Deschamps +13 C Grasp of the Hieromancer @Igor Kieryluk +14 R Lightwielder Paladin @D. Alexander Gregory +15 R Mentor of the Meek @Jana Schirmer & Johannes Voss +16 C Moment of Heroism @Christopher Moeller +17 R Odric, Master Tactician @Michael Komarck +18 R Precinct Captain @Steve Prescott +19 U Relief Captain @Anastasia Ovchinnikova +20 C Shoulder to Shoulder @Chris Rallis +21 M Sun Titan @Todd Lockwood +22 C Youthful Knight @Rebecca Guay +23 C Compulsive Research @Sara Winters +24 R Icefall Regent @David Gaillet +25 C Ior Ruin Expedition @Chris Rahn +26 R Prognostic Sphinx @Steve Prescott +27 U Reckless Scholar @Steve Prescott +28 R Sphinx of Jwar Isle @Justin Sweet +29 C Vision Skeins @Aleksi Briclot +30 C Windrider Eel @Austin Hsu +31 R Archfiend of Depravity @Daarken +32 R Deathbringer Regent @Adam Paquette +33 U Doom Blade @Chippy +34 R Harvester of Souls @Slawomir Maniak +35 C Nightscape Familiar @Jeff Easley +36 R Overseer of the Damned @rk post +37 U Reckless Spite @Karl Kopinski +38 U Vampire Nighthawk @Jason Chan +39 R Avatar of Fury @rk post +40 C Battle-Rattle Shaman @Warren Mahy +41 C Blood Ogre @Christopher Moeller +42 M Chandra, Pyromaster @Chris Rahn +43 C Chandra's Outrage @Christopher Moeller +44 R Chandra's Phoenix @Aleksi Briclot +45 U Coordinated Assault @John Severin Brassell +46 R Dualcaster Mage @Matt Stewart +47 C Fiery Fall @Daarken +48 U Flametongue Kavu @Slawomir Maniak +49 C Gorehorn Minotaurs @Wayne Reynolds +50 R Grim Lavamancer @Michael Sutfin +51 U Guttersnipe @Steve Prescott +52 C Hammerhand @Tomasz Jedruszek +53 M Inferno Titan @Kev Walker +54 U Lightning Bolt @Christopher Moeller +55 M Obsidian Fireheart @Raymond Swanland +56 C Searing Spear @Chris Rahn +57 U Skarrgan Firebird @Kev Walker +58 U Stormblood Berserker @Min Yum +59 R Sudden Demise @Dan Murayama Scott +60 R Torchling @rk post +61 U Volcanic Geyser @Clint Cearley +62 C Cultivate @Anthony Palumbo +63 C Explore @John Avon +64 C Fertilid @Wayne Reynolds +65 R Forgotten Ancient @Mark Tedin +66 R Hunter's Prowess @Greg Staples +67 C Khalni Heart Expedition @Jason Chan +68 M Nissa, Worldwaker @Chris Rahn +69 R Oran-Rief Hydra @Chris Rahn +70 U Press the Advantage @Marco Nelor +71 M Rampaging Baloths @Steve Prescott +72 U Retreat to Kazandu @Kieran Yanner +73 R Scute Mob @Zoltan Boros & Gabor Szikszai +74 C Sylvan Bounty @Chris Rahn +75 R Thragtusk @Nils Hamm +76 U Turntimber Basilisk @Goran Josic +77 C Vastwood Zendikon @Rob Alexander +78 C Vines of the Recluse @Dan Murayama Scott +79 U Woodborn Behemoth @Matt Stewart +80 U Baleful Strix @Nils Hamm +81 R Blood Tyrant @Karl Kopinski +82 R Cruel Ultimatum @Todd Lockwood +83 R Dreadbore @Wayne Reynolds +84 U Extract from Darkness @Dallas Williams +85 M Nicol Bolas, Planeswalker @Chris Rahn +86 U Slave of Bolas @Steve Argyle +87 U Soul Ransom @Steve Argyle +88 C Obelisk of Grixis @Nils Hamm +89 R Sword of the Animist @Daniel Ljunggren +90 U Talisman of Dominance @Mike Dringenberg +91 U Talisman of Indulgence @Mike Dringenberg +92 U Crumbling Necropolis @Dave Kendall +93 R Dragonskull Summit @Jon Foster +94 R Drowned Catacomb @Dave Kendall +95 C Grixis Panorama @Nils Hamm +96 C Smoldering Spires @Rob Alexander +97 L Plains @Christine Choi +98 L Island @Christine Choi +99 L Swamp @Christine Choi +100 L Mountain @Christine Choi +101 L Forest @Christine Choi +102 L Plains @Christine Choi +103 L Island @Christine Choi +104 L Swamp @Christine Choi +105 L Mountain @Christine Choi +106 L Forest @Christine Choi [tokens] 1 w_1_1_soldier @Steve Prescott From 14c6794ee30903f778db35cf8e1b0ceeddbf4e15 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:28:16 -0400 Subject: [PATCH 106/183] Update APC --- forge-gui/res/editions/Apocalypse.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/editions/Apocalypse.txt b/forge-gui/res/editions/Apocalypse.txt index 95eeb644b29..c5d7f236b26 100644 --- a/forge-gui/res/editions/Apocalypse.txt +++ b/forge-gui/res/editions/Apocalypse.txt @@ -30,7 +30,7 @@ ScryfallCode=APC 16 C Shield of Duty and Reason @Anthony S. Waters 17 R Spectral Lynx @Heather Hudson 18 C Standard Bearer @Ron Spencer -19 C Ceta Disciple @Greg Hildebrandt & Tim Hildebrandt +19 C Ceta Disciple @Greg Hildebrandt 20 U Ceta Sanctuary @Franz Vohwinkel 21 R Cetavolver @Gary Ruddell 22 C Coastal Drake @John Gallagher @@ -72,7 +72,7 @@ ScryfallCode=APC 58 U Bloodfire Kavu @Greg Staples 59 R Desolation Giant @Alan Pollack 60 C Dwarven Landslide @Tony Szczudlo -61 U Dwarven Patrol @Greg Hildebrandt & Tim Hildebrandt +61 U Dwarven Patrol @Greg Hildebrandt 62 U Goblin Ringleader @Mark Romanoski 63 U Illuminate @Christopher Moeller 64 C Kavu Glider @Heather Hudson @@ -126,7 +126,7 @@ ScryfallCode=APC 112 R Mystic Snake @Daren Bader 113 R Overgrown Estate @Brian Snõddy 114 R Pernicious Deed @Christopher Moeller -115 R Powerstone Minefield @Greg Hildebrandt & Tim Hildebrandt +115 R Powerstone Minefield @Greg Hildebrandt 116 R Prophetic Bolt @Dave Dorman 117 C Putrid Warrior @Ray Lago 118 C Quicksilver Dagger @Alex Horley-Orlandelli From ed6966b5707607c7642a060075000ee63291d89d Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:00:28 -0400 Subject: [PATCH 107/183] Update BFZ --- forge-gui/res/editions/Battle for Zendikar.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Battle for Zendikar.txt b/forge-gui/res/editions/Battle for Zendikar.txt index 67213308952..e872f6a6c40 100644 --- a/forge-gui/res/editions/Battle for Zendikar.txt +++ b/forge-gui/res/editions/Battle for Zendikar.txt @@ -2,7 +2,6 @@ Name=Battle for Zendikar Date=2015-10-02 Code=BFZ -Code2=BFZ Type=Expansion BoosterCovers=5 Booster=10 Common:fromSheet("BFZ cards"), 3 Uncommon:fromSheet("BFZ cards"), 1 RareMythic:fromSheet("BFZ cards"), 1 BasicLand BFZ @@ -325,3 +324,8 @@ ScryfallCode=BFZ 9 r_3_1_elemental_trample_haste @Victor Adame Minguez 10 g_1_1_plant @Sam Burley 11 rg_5_5_elemental @Brad Rigney + +[other] +12 emblem_gideon_ally_of_zendikar @Eric Deschamps +13 emblem_ob_nixilis_reignited @Chris Rahn +14 emblem_kiora_master_of_the_depths @Jason Chan \ No newline at end of file From 22f4a250e4d7e4a877b819db5b15158ed300dcfe Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:02:12 -0400 Subject: [PATCH 108/183] Update BBD --- forge-gui/res/editions/Battlebond.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-gui/res/editions/Battlebond.txt b/forge-gui/res/editions/Battlebond.txt index 4de2244e720..7cf0b192e5c 100644 --- a/forge-gui/res/editions/Battlebond.txt +++ b/forge-gui/res/editions/Battlebond.txt @@ -344,3 +344,7 @@ ScryfallCode=BBD 4 b_5_5_zombie_giant @Igor Kieryluk 5 g_3_3_beast @Jesper Ejsing 6 c_1_1_a_myr @Ryan Pancoast + +[other] +7 emblem_will_kenrith @Anna Steinbauer +8 emblem_rowan_kenrith @Anna Steinbauer \ No newline at end of file From 4e12f7344499a94627abbf09a335914bcafb987e Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:04:36 -0400 Subject: [PATCH 109/183] Update BOK --- forge-gui/res/editions/Betrayers of Kamigawa.txt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/editions/Betrayers of Kamigawa.txt b/forge-gui/res/editions/Betrayers of Kamigawa.txt index fb1b3d1cc74..fa3d41d7832 100644 --- a/forge-gui/res/editions/Betrayers of Kamigawa.txt +++ b/forge-gui/res/editions/Betrayers of Kamigawa.txt @@ -2,7 +2,6 @@ Code=BOK Date=2005-02-04 Name=Betrayers of Kamigawa -Code2=BOK Type=Expansion BoosterCovers=3 Booster=11 Common, 3 Uncommon, 1 Rare @@ -38,7 +37,7 @@ ScryfallCode=BOK 25 U Tallowisp @Ron Spears 26 C Terashi's Grasp @Mark Tedin 27 U Terashi's Verdict @Ron Spears -28 U Ward of Piety @Tim Hildebrandt +28 U Ward of Piety @Greg Hildebrandt 29 C Waxmane Baku @Greg Hildebrandt 30 R Yomiji, Who Bars the Way @Hideaki Takamura 31 U Callow Jushi @Tsutomu Kawade @@ -93,7 +92,7 @@ ScryfallCode=BOK 80 U Scourge of Numai @Arnie Swekel 81 R Shirei, Shizo's Caretaker @Wayne Reynolds 82 R Sickening Shoal @Dan Murayama Scott -83 C Skullmane Baku @Tim Hildebrandt +83 C Skullmane Baku @Greg Hildebrandt 84 C Skullsnatcher @Matt Cavotta 85 C Stir the Grave @Jim Nelson 86 C Takenuma Bleeder @Kev Walker @@ -169,15 +168,10 @@ ScryfallCode=BOK 156 R Orb of Dreams @Dany Orizio 157 R Ornate Kanzashi @Heather Hudson 158 U Ronin Warclub @Pete Venters -159 U Shuko @Tim Hildebrandt +159 U Shuko @Greg Hildebrandt 160 U Shuriken @Matt Cavotta 161 R Slumbering Tora @Doug Chaffee 162 R That Which Was Taken @Adam Rex 163 R Umezawa's Jitte @Christopher Moeller 164 U Gods' Eye, Gate to the Reikai @John Avon 165 R Tendo Ice Bridge @Rob Alexander - -[tokens] -c_1_1_spirit -w_3_3_spirit_flying -g_1_1_snake From c9fbd579b67a7da828cbf32ae0d07113b5358f23 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:21:16 -0400 Subject: [PATCH 110/183] Update PCEL --- forge-gui/res/editions/Celebration Cards.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/forge-gui/res/editions/Celebration Cards.txt b/forge-gui/res/editions/Celebration Cards.txt index 109f3f7943e..b264c653959 100644 --- a/forge-gui/res/editions/Celebration Cards.txt +++ b/forge-gui/res/editions/Celebration Cards.txt @@ -17,6 +17,3 @@ ScryfallCode=PCEL [eternal] 8 R Zur the Enchanter @Chase Stone - -[tokens] -r_1_1_employee From 0f78751ce3ec7450ad26af6eae4006551afef1a0 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:27:26 -0400 Subject: [PATCH 111/183] Update CHK --- forge-gui/res/editions/Champions of Kamigawa.txt | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/forge-gui/res/editions/Champions of Kamigawa.txt b/forge-gui/res/editions/Champions of Kamigawa.txt index 28d05e3bbf9..3083c75abb3 100644 --- a/forge-gui/res/editions/Champions of Kamigawa.txt +++ b/forge-gui/res/editions/Champions of Kamigawa.txt @@ -2,7 +2,6 @@ Code=CHK Date=2004-10-01 Name=Champions of Kamigawa -Code2=CHK Type=Expansion BoosterCovers=5 Booster=11 Common, 3 Uncommon, 1 Rare @@ -261,7 +260,7 @@ ScryfallCode=CHK 247 U Time of Need @Dany Orizio 248 C Venerable Kumo @Carl Critchlow 249 C Vine Kami @Tsutomu Kawade -250 C Wear Away @Tim Hildebrandt +250 C Wear Away @Greg Hildebrandt 251 R General's Kabuto @Alex Horley-Orlandelli 252 R Hair-Strung Koto @Rebecca Guay 253 U Hankyu @Ben Thompson @@ -317,12 +316,4 @@ ScryfallCode=CHK 303 L Forest @Rob Alexander 304 L Forest @Rob Alexander 305 L Forest @Rob Alexander -306 L Forest @Rob Alexander - -[tokens] -c_1_1_spirit -u_5_5_dragon_spirit_flying -u_1_1_illusion_flying -b_1_1_rat -g_x_x_elemental -g_1_1_snake +306 L Forest @Rob Alexander \ No newline at end of file From f06acf88f9e8425be6e8f199f8aaa23cd0452dcc Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:30:34 -0400 Subject: [PATCH 112/183] Update PCSP --- forge-gui/res/editions/Coldsnap Promos.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Coldsnap Promos.txt b/forge-gui/res/editions/Coldsnap Promos.txt index 41a86264521..2d21ef6b9f6 100644 --- a/forge-gui/res/editions/Coldsnap Promos.txt +++ b/forge-gui/res/editions/Coldsnap Promos.txt @@ -4,9 +4,10 @@ Date=2006-07-21 Name=Coldsnap Promos Type=Promo ScryfallCode=PCSP +TokensCode=PCSP [cards] 101★ R Allosaurus Rider @Daren Bader [tokens] -marit_lage +1 marit_lage @Stephan Martiniere From 827a02563bc0a39fb879dc01ef9d4df8053e319d Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:32:18 -0400 Subject: [PATCH 113/183] Update CHR --- forge-gui/res/editions/Chronicles.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui/res/editions/Chronicles.txt b/forge-gui/res/editions/Chronicles.txt index be9875679b3..ed09049f5ca 100644 --- a/forge-gui/res/editions/Chronicles.txt +++ b/forge-gui/res/editions/Chronicles.txt @@ -137,7 +137,3 @@ ScryfallCode=CHR 116b U Urza's Tower @Mark Poole 116c U Urza's Tower @Mark Poole 116d U Urza's Tower @Mark Poole - -[tokens] -stangg_twin -c_1_1_a_snake_poison From 83bfe2a52490805ba18b733645208dbeab725096 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:38:29 -0400 Subject: [PATCH 114/183] Update 6ED --- ...Sixth Edition Simplified Chinese Alternate Art.txt | 11 +++++++++++ forge-gui/res/editions/Classic Sixth Edition.txt | 9 --------- 2 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 forge-gui/res/editions/Classic Sixth Edition Simplified Chinese Alternate Art.txt diff --git a/forge-gui/res/editions/Classic Sixth Edition Simplified Chinese Alternate Art.txt b/forge-gui/res/editions/Classic Sixth Edition Simplified Chinese Alternate Art.txt new file mode 100644 index 00000000000..01024bd56fe --- /dev/null +++ b/forge-gui/res/editions/Classic Sixth Edition Simplified Chinese Alternate Art.txt @@ -0,0 +1,11 @@ +[metadata] +Code=6ED_AA +Date=1999-04-21 +Name=Classic Sixth Edition Simplified Chinese Alternate Art +Type=Promo +Border=White +ScryfallCode=6ED +CardLang=zhs + +[cards] +123s C Drudge Skeletons @Carl Critchlow diff --git a/forge-gui/res/editions/Classic Sixth Edition.txt b/forge-gui/res/editions/Classic Sixth Edition.txt index 2de393ad7cc..20abccfb720 100644 --- a/forge-gui/res/editions/Classic Sixth Edition.txt +++ b/forge-gui/res/editions/Classic Sixth Edition.txt @@ -362,12 +362,3 @@ ScryfallCode=6ED 348 L Forest @Quinton Hoover 349 L Forest @John Avon 350 L Forest @John Avon - -[tokens] -wasp -c_5_5_a_djinn_flying -w_1_1_citizen -b_0_1_serf -r_1_1_goblin -g_1_1_cat -g_1_1_snake From 36696f9b1bfad977cf3b45e8daf7bef43b74ea9e Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:51:02 -0400 Subject: [PATCH 115/183] Update CST --- forge-gui/res/editions/Coldsnap Theme Decks.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui/res/editions/Coldsnap Theme Decks.txt b/forge-gui/res/editions/Coldsnap Theme Decks.txt index fcb01b3122d..dfdfbb7224a 100644 --- a/forge-gui/res/editions/Coldsnap Theme Decks.txt +++ b/forge-gui/res/editions/Coldsnap Theme Decks.txt @@ -68,7 +68,3 @@ ScryfallCode=CST 381 L Forest @Pat Lewis 382 L Forest @Pat Lewis 383 L Forest @Pat Lewis - -[tokens] -w_0_1_deserter -br_3_1_graveborn_haste From 72641e000b5bd99f30a1e833456c0ba2d962b8d3 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:52:03 -0400 Subject: [PATCH 116/183] Update CSP --- forge-gui/res/editions/Coldsnap.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/forge-gui/res/editions/Coldsnap.txt b/forge-gui/res/editions/Coldsnap.txt index 87bc2399ca2..4afe24a1693 100644 --- a/forge-gui/res/editions/Coldsnap.txt +++ b/forge-gui/res/editions/Coldsnap.txt @@ -166,11 +166,3 @@ ScryfallCode=CSP 153 C Snow-Covered Swamp @Rob Alexander 154 C Snow-Covered Mountain @John Zeleznik 155 C Snow-Covered Forest @Jim Nelson - -[tokens] -marit_lage -w_1_1_bird_flying -w_0_1_deserter -w_1_1_soldier -g_1_1_wolf_sound_the_call -br_3_1_graveborn_haste From 93bca202bf2fa5df6e58935c1a37a6e955c3cd19 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 06:58:03 -0400 Subject: [PATCH 117/183] Update C14 --- forge-gui/res/editions/Commander 2014.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/editions/Commander 2014.txt b/forge-gui/res/editions/Commander 2014.txt index 59a320dcb6f..df3b4a92010 100644 --- a/forge-gui/res/editions/Commander 2014.txt +++ b/forge-gui/res/editions/Commander 2014.txt @@ -2,7 +2,6 @@ Code=C14 Date=2014-11-07 Name=Commander 2014 -Code2=C14 Type=Commander ScryfallCode=C14 From 664ce699935b8d97e83413c3dd3cea87be4d7811 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:02:04 -0400 Subject: [PATCH 118/183] Update C16 --- forge-gui/res/editions/Commander 2016.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander 2016.txt b/forge-gui/res/editions/Commander 2016.txt index 868076dbbac..d508bccaeee 100644 --- a/forge-gui/res/editions/Commander 2016.txt +++ b/forge-gui/res/editions/Commander 2016.txt @@ -2,7 +2,6 @@ Code=C16 Date=2016-11-11 Name=Commander 2016 -Code2=C16 Type=Commander ScryfallCode=C16 @@ -380,3 +379,6 @@ ScryfallCode=C16 18 bg_1_1_worm @Chuck Lukacs 19 c_x_x_a_phyrexian_horror @Scott Chou 20 c_1_1_a_myr @Ryan Pancoast + +[other] +21 emblem_daretti_scrap_savant @Dan Murayama Scott \ No newline at end of file From d72d36a8b9f70882e902a8b7a1efef6bb12d6600 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:04:42 -0400 Subject: [PATCH 119/183] Update C18 --- forge-gui/res/editions/Commander 2018.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander 2018.txt b/forge-gui/res/editions/Commander 2018.txt index 23f0ae68bb2..0f609133b96 100644 --- a/forge-gui/res/editions/Commander 2018.txt +++ b/forge-gui/res/editions/Commander 2018.txt @@ -2,7 +2,6 @@ Code=C18 Date=2018-08-09 Name=Commander 2018 -Code2=C18 Type=Commander ScryfallCode=C18 @@ -341,3 +340,6 @@ ScryfallCode=C18 24 c_1_1_a_servo @Igor Kieryluk 25 c_1_1_a_thopter_flying @Richard Wright 26 c_1_1_a_thopter_flying @Richard Wright + +[other] +1 manifest @Raymond Swanland \ No newline at end of file From 8ea5ac97a24562cc11c06d36d3de898e8f7830e2 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:07:06 -0400 Subject: [PATCH 120/183] Upcate C19 --- forge-gui/res/editions/Commander 2019.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/editions/Commander 2019.txt b/forge-gui/res/editions/Commander 2019.txt index 019690d1720..f1291d0d86f 100644 --- a/forge-gui/res/editions/Commander 2019.txt +++ b/forge-gui/res/editions/Commander 2019.txt @@ -2,7 +2,6 @@ Code=C19 Date=2019-08-23 Name=Commander 2019 -Code2=C19 Type=Commander ScryfallCode=C19 @@ -336,5 +335,8 @@ ScryfallCode=C19 26 c_10_10_eldrazi @Jack Wang [other] -embalm_angel_of_sanctions -embalm_heart-piercer_manticore \ No newline at end of file +6 embalm_angel_of_sanctions @Min Yum +7 embalm_heart-piercer_manticore @Cristi Balanescu +27 morph @Raymond Swanland +28 manifest @Raymond Swanland +29 emblem_ob_nixilis_reignited @Chris Rahn From 8653a26d3813393af186615cd8aa604079078480 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:09:57 -0400 Subject: [PATCH 121/183] Update CM2 --- forge-gui/res/editions/Commander Anthology Volume II.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/editions/Commander Anthology Volume II.txt b/forge-gui/res/editions/Commander Anthology Volume II.txt index 369e143de00..fa15564b5c2 100644 --- a/forge-gui/res/editions/Commander Anthology Volume II.txt +++ b/forge-gui/res/editions/Commander Anthology Volume II.txt @@ -337,3 +337,6 @@ ScryfallCode=CM2 15 tuktuk_the_returned @Franz Vohwinkel 16 c_3_3_a_phyrexian_wurm_deathtouch @Raymond Swanland 17 c_3_3_a_phyrexian_wurm_lifelink @Raymond Swanland + +[other] +18 emblem_daretti_scrap_savant @Dan Murayama Scott \ No newline at end of file From a602b1bdf2e3392dd6392e85cd2e8a0957ae13e8 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:37:54 -0400 Subject: [PATCH 122/183] Update CMA --- forge-gui/res/editions/Commander Anthology.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Commander Anthology.txt b/forge-gui/res/editions/Commander Anthology.txt index bd2a9321608..085766b8733 100644 --- a/forge-gui/res/editions/Commander Anthology.txt +++ b/forge-gui/res/editions/Commander Anthology.txt @@ -2,7 +2,6 @@ Code=CMA Date=2017-06-09 Name=Commander Anthology -Code2=CMA Type=Commander ScryfallCode=CMA @@ -332,7 +331,7 @@ ScryfallCode=CMA 1 w_1_1_kithkin_soldier @Randy Gallegos 2 w_2_2_knight_vigilance @Matt Stewart 3 w_1_1_spirit_flying @Ryan Yee -4 b_0_0_phyrexian_germ @Igor Kieryluk +4 b_0_0_germ @Igor Kieryluk 5 b_2_2_zombie @Lucas Graciano 6 r_5_5_dragon_flying @Jim Pavelec 7 g_3_3_beast @Dave Allsop From 63397dee07837ed8aa5f8df22cc30c3d21ef9c88 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:42:18 -0400 Subject: [PATCH 123/183] Update CC2 --- forge-gui/res/editions/Commander Collection Black.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Commander Collection Black.txt b/forge-gui/res/editions/Commander Collection Black.txt index 202603476f6..ddddd300eae 100644 --- a/forge-gui/res/editions/Commander Collection Black.txt +++ b/forge-gui/res/editions/Commander Collection Black.txt @@ -17,5 +17,6 @@ TokensCode=CC2 8 R Command Tower @Julian Kok Joon Wen [tokens] -9 b_1_1_snake_deathtouch @Caroline Gariba & Xavier Ribeiro -b_2_2_zombie +9 b_1_1_snake_deathtouch @Caroline Gariba +# Double sided tokens are not supported yet. +# 9☇ b_2_2_zombie @Xavier Ribeiro From 90c8f8e332093e45b7eda1a1f193d086bdba8a1b Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:44:35 -0400 Subject: [PATCH 124/183] Germ token as Phyrexian Germ token has been printed --- forge-gui/res/editions/Commander 2014.txt | 2 +- forge-gui/res/editions/Commander 2015.txt | 2 +- forge-gui/res/editions/Commander 2016.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/editions/Commander 2014.txt b/forge-gui/res/editions/Commander 2014.txt index df3b4a92010..e0a77698a12 100644 --- a/forge-gui/res/editions/Commander 2014.txt +++ b/forge-gui/res/editions/Commander 2014.txt @@ -358,7 +358,7 @@ ScryfallCode=C14 11 u_x_x_zombie @Dave Kendall 12 b_x_x_demon_flying @Pete Venters 13 b_5_5_demon_flying @Kev Walker -14 b_0_0_phyrexian_germ @Igor Kieryluk +14 b_0_0_germ @Igor Kieryluk 15 b_x_x_horror @Jason Felix 16 b_2_2_zombie @Lucas Graciano 17 r_1_1_goblin @Dave Kendall diff --git a/forge-gui/res/editions/Commander 2015.txt b/forge-gui/res/editions/Commander 2015.txt index 24d5bb2d14b..96eeb14720e 100644 --- a/forge-gui/res/editions/Commander 2015.txt +++ b/forge-gui/res/editions/Commander 2015.txt @@ -357,7 +357,7 @@ ScryfallCode=C15 4 w_2_2_knight_first_strike @Matt Stewart 5 w_2_2_knight_vigilance @Matt Stewart 6 u_2_2_drake_flying @Svetlin Velinov -7 b_0_0_phyrexian_germ @Igor Kieryluk +7 b_0_0_germ @Igor Kieryluk 8 b_2_2_zombie @Lucas Graciano 9 r_5_5_dragon_flying @Jim Pavelec 10 r_3_1_elemental_shaman_haste @Jim Pavelec diff --git a/forge-gui/res/editions/Commander 2016.txt b/forge-gui/res/editions/Commander 2016.txt index d508bccaeee..fcbeda627eb 100644 --- a/forge-gui/res/editions/Commander 2016.txt +++ b/forge-gui/res/editions/Commander 2016.txt @@ -368,7 +368,7 @@ ScryfallCode=C16 7 u_2_2_bird_flying @Peter Mohrbacher 8 u_1_1_squid_islandwalk @Jack Wang 9 u_1_1_a_thopter_flying @Andrew Murray -10 b_0_0_phyrexian_germ @Igor Kieryluk +10 b_0_0_germ @Igor Kieryluk 11 b_2_2_zombie @Lucas Graciano 12 r_1_1_goblin_all_attack @Wayne Reynolds 13 r_3_3_ogre @Paul Bonner From 9e2ab76be351eab0420060c89112fcb4bdbdfa96 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:48:41 -0400 Subject: [PATCH 125/183] Update CLB --- .../res/editions/Commander Legends Battle for Baldur's Gate.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander Legends Battle for Baldur's Gate.txt b/forge-gui/res/editions/Commander Legends Battle for Baldur's Gate.txt index 92fc7be45d4..f39cf042490 100644 --- a/forge-gui/res/editions/Commander Legends Battle for Baldur's Gate.txt +++ b/forge-gui/res/editions/Commander Legends Battle for Baldur's Gate.txt @@ -1169,7 +1169,7 @@ Zevlor, Elturel Exile|CLB 22 c_1_1_shapeshifter_changeling @Steve Prescott 23 c_2_2_shapeshifter_changeling @Johann Bodin 24 c_3_2_shapeshifter_changeling @Igor Grechanyi -25 w_4_4_angel_flying_vigilance @ +25 w_4_4_angel_flying_vigilance @Alexander Mokhov 26 w_1_1_human @Ben Maier 27 w_1_1_kor_warrior @Randy Vargas 28 u_2_2_shapeshifter_changeling @Filip Burburan From cb47a9c4be7bb8907aeb740bd8008788bce73a86 Mon Sep 17 00:00:00 2001 From: Eradev Date: Wed, 9 Jul 2025 23:35:55 -0400 Subject: [PATCH 126/183] Update CMM --- forge-gui/res/editions/Commander Masters.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander Masters.txt b/forge-gui/res/editions/Commander Masters.txt index 3e38fc1219d..6e1d798e0c5 100644 --- a/forge-gui/res/editions/Commander Masters.txt +++ b/forge-gui/res/editions/Commander Masters.txt @@ -1147,7 +1147,7 @@ ScryfallCode=CMM [other] 49 blessing @Yeong-Hao Han 50 monarch @Volkan Baǵa -51 Emblem_daretti_scrap_savant @Dan Murayama Scott +51 emblem_daretti_scrap_savant @Dan Murayama Scott 52 emblem_ob_nixilis_of_the_black_oath @Daarken 53 emblem_teferi_temporal_archmage @Tyler Jacobson 54 copy @David Palumbo From fa1557c775ad68caf6743790283f1c8c5cdc1a05 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:55:22 -0400 Subject: [PATCH 127/183] Update CMD --- .../{Commander.txt => Commander 2011.txt} | 30 ++----------------- 1 file changed, 3 insertions(+), 27 deletions(-) rename forge-gui/res/editions/{Commander.txt => Commander 2011.txt} (96%) diff --git a/forge-gui/res/editions/Commander.txt b/forge-gui/res/editions/Commander 2011.txt similarity index 96% rename from forge-gui/res/editions/Commander.txt rename to forge-gui/res/editions/Commander 2011.txt index 6c5f325c928..b221da5b717 100644 --- a/forge-gui/res/editions/Commander.txt +++ b/forge-gui/res/editions/Commander 2011.txt @@ -1,12 +1,10 @@ [metadata] -Code=COM +Code=CMD Date=2011-06-17 -Name=Commander +Name=Commander 2011 Code2=COM -Alias=CMD Type=Commander -BoosterBox=0 -ScryfallCode=cmd +ScryfallCode=CMD [cards] 1 U Artisan of Kozilek @Jason Felix @@ -327,25 +325,3 @@ ScryfallCode=cmd 316 L Forest @Steven Belledin 317 L Forest @Zoltan Boros & Gabor Szikszai 318 L Forest @Anthony S. Waters - -[tokens] -c_0_1_eldrazi_spawn_sac -c_0_1_eldrazi_spawn_sac -w_1_1_kithkin_soldier -w_1_1_pegasus_flying -w_1_1_soldier -w_1_1_spirit_flying -b_2_4_spider_reach -b_2_2_zombie -r_5_5_dragon_flying -g_3_3_beast -g_4_4_beast -g_3_3_elephant -g_1_1_insect -g_1_1_insect_flying_deathtouch -g_1_1_saproling -g_1_1_snake -g_1_1_squirrel -g_2_2_wolf -ur_5_5_elemental_flying -c_1_1_a_triskelavite_flying_ammo From 5d0a7b5ef998c4cd42ca942a27a7b591043aa890 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:56:32 -0400 Subject: [PATCH 128/183] Update CM1 --- forge-gui/res/editions/Commander's Arsenal.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/forge-gui/res/editions/Commander's Arsenal.txt b/forge-gui/res/editions/Commander's Arsenal.txt index 0c22a4506ed..487016b5cc8 100644 --- a/forge-gui/res/editions/Commander's Arsenal.txt +++ b/forge-gui/res/editions/Commander's Arsenal.txt @@ -3,8 +3,8 @@ Code=CM1 Date=2012-11-02 Name=Commander's Arsenal ScryfallCode=CM1 - Type=Commander + [cards] 1 R Chaos Warp @Trevor Claxton 2 C Command Tower @Adam Paquette @@ -24,7 +24,3 @@ Type=Commander 16 R Scroll Rack @Heather Hudson 17 R Sylvan Library @Yeong-Hao Han 18 M Vela the Night-Clad @Allen Williams - -[tokens] -c_1_1_sliver -g_1_1_insect From 3022129fb5fd7a6af6dbedd6dc51805b324047ff Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 07:58:39 -0400 Subject: [PATCH 129/183] Update CON --- forge-gui/res/editions/Conflux.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Conflux.txt b/forge-gui/res/editions/Conflux.txt index 4440722108f..a70cc5654fe 100644 --- a/forge-gui/res/editions/Conflux.txt +++ b/forge-gui/res/editions/Conflux.txt @@ -1,9 +1,8 @@ [metadata] -Code=CFX +Code=CON Date=2009-02-06 Name=Conflux Code2=CFX -Alias=CON Type=Expansion BoosterCovers=3 Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA From 48496cfbbc077cdde7b38d63296d60aef563772a Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:00:43 -0400 Subject: [PATCH 130/183] Update CN2 --- forge-gui/res/editions/Conspiracy Take the Crown.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Conspiracy Take the Crown.txt b/forge-gui/res/editions/Conspiracy Take the Crown.txt index af6d6778350..1f692521abc 100644 --- a/forge-gui/res/editions/Conspiracy Take the Crown.txt +++ b/forge-gui/res/editions/Conspiracy Take the Crown.txt @@ -2,7 +2,6 @@ Code=CN2 Date=2016-08-26 Name=Conspiracy: Take the Crown -Code2=CN2 Type=Draft BoosterCovers=3 Booster=10 Common:!fromSheet("CN2 Draft Matters"), 3 Uncommon:!fromSheet("CN2 Draft Matters"), 1 RareMythic:!fromSheet("CN2 Draft Matters"):fromSheet("CN2 cards"), 1 fromSheet("CN2 Draft Matters") @@ -276,3 +275,6 @@ Kaya, Ghost Assassin|CN2|2 10 g_3_3_beast @Jesper Ejsing 11 g_1_1_insect @Carl Critchlow 12 c_1_1_a_construct_defender @Victor Adame Minguez + +[other] +1 monarch @Mike Bierek From 643fc2106bf44bcfa46353cdcfa4312c6e7cafc9 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:03:13 -0400 Subject: [PATCH 131/183] Update CNS --- forge-gui/res/editions/Conspiracy.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Conspiracy.txt b/forge-gui/res/editions/Conspiracy.txt index da86380a8b7..735fb34123f 100644 --- a/forge-gui/res/editions/Conspiracy.txt +++ b/forge-gui/res/editions/Conspiracy.txt @@ -2,7 +2,6 @@ Code=CNS Date=2014-06-06 Name=Conspiracy -Code2=CNS Type=Draft BoosterCovers=3 Booster=10 Common:!fromSheet("CNS Draft Matters"), 3 Uncommon:!fromSheet("CNS Draft Matters"), 1 RareMythic:!fromSheet("CNS Draft Matters"), 1 fromSheet("CNS Draft Matters") @@ -256,3 +255,6 @@ ScryfallCode=CNS 6 g_1_1_squirrel @Daniel Ljunggren 7 g_2_2_wolf @Raoul Vitale 8 c_1_1_a_construct_defender @Adam Paquette + +[other] +9 emblem_dack_fayden @Eric Deschamps \ No newline at end of file From b37c280bf8e64bd170e33e1befc42868bd42a5e2 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:05:46 -0400 Subject: [PATCH 132/183] Update M19 --- forge-gui/res/editions/Core Set 2019.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge-gui/res/editions/Core Set 2019.txt b/forge-gui/res/editions/Core Set 2019.txt index 7fdb970eee6..e11e48a8a3e 100644 --- a/forge-gui/res/editions/Core Set 2019.txt +++ b/forge-gui/res/editions/Core Set 2019.txt @@ -377,3 +377,8 @@ ScryfallCode=M19 12 g_3_3_beast @Jason Felix 13 g_1_1_elf_warrior @William O'Connor 14 c_1_1_a_thopter_flying @Svetlin Velinov + +[other] +15 emblem_ajani_adversary_of_tyrants @Victor Adame Minguez +16 emblem_tezzeret_artifice_master @Josh Hass +17 emblem_vivien_reid @Anna Steinbauer From dbde27bc88f02ff7eb938ee044c82885e0f94af5 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:08:05 -0400 Subject: [PATCH 133/183] Update PM20 --- forge-gui/res/editions/Core Set 2020 Promos.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/forge-gui/res/editions/Core Set 2020 Promos.txt b/forge-gui/res/editions/Core Set 2020 Promos.txt index 015fc70d83b..fb649bc3679 100644 --- a/forge-gui/res/editions/Core Set 2020 Promos.txt +++ b/forge-gui/res/editions/Core Set 2020 Promos.txt @@ -4,7 +4,6 @@ Date=2019-07-12 Name=Core Set 2020 Promos Type=Promo ScryfallCode=PM20 -TokensCode=TM20 [cards] 69 C Negate @Magali Villeneuve @@ -12,8 +11,6 @@ TokensCode=TM20 131 R Chandra's Regulator @Mathias Kollros 139 U Flame Sweep @Viktor Titov 185 R Nightpack Ambusher @Sam Rowan +172 R Gargos, Vicious Watcher @Mathias Kollros 197 U Thrashing Brontodon @Jakub Kasper 206 U Corpse Knight @Karl Kopinski - -[tokens] -8 g_2_2_wolf @Aaron Miller \ No newline at end of file From 9b465812899cf91cc390d508e5aa2ee491dd90ce Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:15:22 -0400 Subject: [PATCH 134/183] Update M20 --- forge-gui/res/editions/Core Set 2020.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Core Set 2020.txt b/forge-gui/res/editions/Core Set 2020.txt index b78f9c5cd33..fcf71e24622 100644 --- a/forge-gui/res/editions/Core Set 2020.txt +++ b/forge-gui/res/editions/Core Set 2020.txt @@ -400,5 +400,9 @@ ScryfallCode=M20 6 b_2_2_zombie @Anna Steinbauer 7 r_1_1_elemental @Winona Nelson 8 g_2_2_wolf @Aaron Miller -9 c_3_3_a_phyrexian_golem @Daarken +9 c_3_3_a_golem @Daarken 10 c_a_treasure_sac @Alayna Danner + +[other] +11 emblem_chandra_awakened_inferno @Chris Rahn +12 emblem_mu_yanling_sky_dancer @g-host Lee From 35563fe8342d06cfb6763c692ab757f7c717f5cf Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:15:31 -0400 Subject: [PATCH 135/183] Update M21 --- forge-gui/res/editions/Core Set 2021.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge-gui/res/editions/Core Set 2021.txt b/forge-gui/res/editions/Core Set 2021.txt index e3f6db5085c..0343d5e8e16 100644 --- a/forge-gui/res/editions/Core Set 2021.txt +++ b/forge-gui/res/editions/Core Set 2021.txt @@ -474,3 +474,8 @@ ScryfallCode=M21 15 c_a_treasure_sac @Alayna Danner 19 w_1_1_dog @Manuel Castañón 20 g_1_1_cat @Leesha Hannigan + +[other] +16 emblem_basri_ket @Kieran Yanner +17 emblem_garruk_unleashed @Lie Setiawan +18 emblem_liliana_waker_of_the_dead @Anna Steinbauer From 6564e76aad20afd6be0aed719b361dbb3dd116d5 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 11 Jul 2025 08:15:40 -0400 Subject: [PATCH 136/183] Update CMR --- forge-gui/res/editions/Commander Legends.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander Legends.txt b/forge-gui/res/editions/Commander Legends.txt index 2b01f19aa48..7cb00b71936 100644 --- a/forge-gui/res/editions/Commander Legends.txt +++ b/forge-gui/res/editions/Commander Legends.txt @@ -1337,7 +1337,7 @@ Guildless Commons|CMR 6 b_2_2_zombie @Paul Scott Canavan 7 r_2_2_dragon_flying_firebreathing @Lars Grant-West 8 g_1_1_elf_warrior @William O'Connor -9 c_3_3_a_phyrexian_golem @Volkan Baǵa +9 c_3_3_a_golem @Volkan Baǵa 10 c_x_x_a_horror @Scott Chou 11 rock @Tomasz Jedruszek 12 c_a_treasure_sac @Alayna Danner From 073f32c1c9431d5862b291020f822583348b86bd Mon Sep 17 00:00:00 2001 From: Eradev Date: Tue, 15 Jul 2025 04:19:24 -0400 Subject: [PATCH 137/183] Update CM2 --- forge-gui/res/editions/Commander Anthology Volume II.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Commander Anthology Volume II.txt b/forge-gui/res/editions/Commander Anthology Volume II.txt index fa15564b5c2..4b5497bfb12 100644 --- a/forge-gui/res/editions/Commander Anthology Volume II.txt +++ b/forge-gui/res/editions/Commander Anthology Volume II.txt @@ -325,7 +325,7 @@ ScryfallCode=CM2 3 w_0_1_goat @Adam Paquette 4 w_2_2_knight_first_strike @Hideaki Takamura 5 w_1_1_spirit_flying @Mike Sass -6 b_0_0_phyrexian_germ @Igor Kieryluk +6 b_0_0_germ @Igor Kieryluk 7 b_2_2_zombie @Bud Cook 8 r_3_1_elemental_shaman_haste @Jim Pavelec 9 r_1_1_goblin @Dave Kendall From 9b80408bc69cc534ec3aa91bb011d49a4d7fc4aa Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 23 Jul 2025 04:42:15 +0200 Subject: [PATCH 138/183] Token wording update (July 2025 Comprehensive Rules) (#8160) * Token wording update (July 2025 Comprehensive Rules) * Update c_a_food_sac.txt * Update c_a_treasure_sac.txt * Update c_a_gold_sac.txt * Update c_e_shard_draw.txt * Update c_a_clue_draw.txt * Update incubator_c_0_0_a_phyrexian.txt * Update role_wicked.txt * Update c_a_map_sac_explore.txt * Update c_a_junk_sac_exileplay.txt * Update c_a_blood_draw.txt * Update elegy_acolyte.txt * Update systems_override.txt * Update survey_mechan.txt --- forge-gui/res/cardsfolder/e/elegy_acolyte.txt | 2 +- forge-gui/res/cardsfolder/s/survey_mechan.txt | 2 +- forge-gui/res/cardsfolder/s/systems_override.txt | 2 +- forge-gui/res/tokenscripts/c_a_blood_draw.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_clue_draw.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_food_sac.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_gold_sac.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_junk_sac_exileplay.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_map_sac_explore.txt | 4 ++-- forge-gui/res/tokenscripts/c_a_treasure_sac.txt | 4 ++-- forge-gui/res/tokenscripts/c_e_shard_draw.txt | 4 ++-- forge-gui/res/tokenscripts/incubator_c_0_0_a_phyrexian.txt | 4 ++-- forge-gui/res/tokenscripts/role_wicked.txt | 4 ++-- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/elegy_acolyte.txt b/forge-gui/res/cardsfolder/e/elegy_acolyte.txt index b8bae9148e6..b66d5596522 100644 --- a/forge-gui/res/cardsfolder/e/elegy_acolyte.txt +++ b/forge-gui/res/cardsfolder/e/elegy_acolyte.txt @@ -5,7 +5,7 @@ PT:4/4 K:Lifelink T:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, you draw a card and lose 1 life. SVar:TrigDraw:DB$ Draw | SubAbility$ DBLoseLife -SVar:DBLoseLifeYou:DB$ LoseLife | LifeAmount$ 1 +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | Execute$ TrigToken | TriggerDescription$ Void — At the beginning of your end step, if a nonland permanent left the battlefield this turn or a spell was warped this turn, create a 2/2 colorless Robot artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_a_robot | TokenOwner$ You SVar:X:Count$Void.1.0 diff --git a/forge-gui/res/cardsfolder/s/survey_mechan.txt b/forge-gui/res/cardsfolder/s/survey_mechan.txt index 8d59eab4eed..aba0c2c2635 100644 --- a/forge-gui/res/cardsfolder/s/survey_mechan.txt +++ b/forge-gui/res/cardsfolder/s/survey_mechan.txt @@ -5,7 +5,7 @@ PT:1/3 K:Flying K:Hexproof A:AB$ DealDamage | Cost$ 10 Sac<1/CARDNAME> | ValidTgts$ Any | NumDmg$ 3 | ReduceCost$ X | SubAbility$ DBDraw | SpellDescription$ It deals 3 damage to any target. Target player draws three cards and gains 3 life. This ability costs {X} less to activate, where X is the number of differently named lands you control. -A:SP$ Draw | NumCards$ 3 | ValidTgts$ Player | SubAbility$ DBGainLife +SVar:DBDraw:DB$ Draw | NumCards$ 3 | ValidTgts$ Player | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ ParentTarget | LifeAmount$ 3 SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield Oracle:Flying\nHexproof (This creature can't be the target of spells or abilities your opponents control.)\n{10}, Sacrifice this creature: It deals 3 damage to any target. Target player draws three cards and gains 3 life. This ability costs {X} less to activate, where X is the number of differently named lands you control. diff --git a/forge-gui/res/cardsfolder/s/systems_override.txt b/forge-gui/res/cardsfolder/s/systems_override.txt index 424aa0431e5..4c19e5c88dc 100644 --- a/forge-gui/res/cardsfolder/s/systems_override.txt +++ b/forge-gui/res/cardsfolder/s/systems_override.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Sorcery A:SP$ GainControl | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBPutCounter | SpellDescription$ Gain control of target artifact or creature until end of turn. Untap that permanent. It gains haste until end of turn. If it's a Spacecraft, put ten charge counters on it. If you do, remove ten charge counters from it at the beginning of the next end step. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted.Spacecraft | CounterType$ CHARGE | CounterNum$ 10 | RememberPut$ True | SubAbility$ DBDelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigRemoveCounter | RememberObjects$ RememberedLKI | ConditionDefined$ Remembered | ConditionPresent$ Card | TriggerDescription$ Remove ten charge counters from it at the beginning of the next end step. | SubAbility$ DBCleanup +SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigRemoveCounter | RememberObjects$ RememberedLKI | ConditionDefined$ Remembered | ConditionPresent$ Card | TriggerDescription$ Remove ten charge counters from it at the beginning of the next end step. | SubAbility$ DBCleanup SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ DelayTriggerRememberedLKI | CounterType$ CHARGE | CounterNum$ 10 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Gain control of target artifact or creature until end of turn. Untap that permanent. It gains haste until end of turn. If it's a Spacecraft, put ten charge counters on it. If you do, remove ten charge counters from it at the beginning of the next end step. diff --git a/forge-gui/res/tokenscripts/c_a_blood_draw.txt b/forge-gui/res/tokenscripts/c_a_blood_draw.txt index e7746ffd675..db495745c58 100644 --- a/forge-gui/res/tokenscripts/c_a_blood_draw.txt +++ b/forge-gui/res/tokenscripts/c_a_blood_draw.txt @@ -1,5 +1,5 @@ Name:Blood Token ManaCost:no cost Types:Artifact Blood -A:AB$ Draw | Cost$ 1 T Discard<1/Card> Sac<1/CARDNAME/this artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -Oracle:{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card. +A:AB$ Draw | Cost$ 1 T Discard<1/Card> Sac<1/CARDNAME/this token> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:{1}, {T}, Discard a card, Sacrifice this token: Draw a card. diff --git a/forge-gui/res/tokenscripts/c_a_clue_draw.txt b/forge-gui/res/tokenscripts/c_a_clue_draw.txt index f5684e7da3c..6502cb43210 100644 --- a/forge-gui/res/tokenscripts/c_a_clue_draw.txt +++ b/forge-gui/res/tokenscripts/c_a_clue_draw.txt @@ -1,5 +1,5 @@ Name:Clue Token ManaCost:no cost Types:Artifact Clue -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME/this artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -Oracle:{2}, Sacrifice this artifact: Draw a card. +A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME/this token> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:{2}, Sacrifice this token: Draw a card. diff --git a/forge-gui/res/tokenscripts/c_a_food_sac.txt b/forge-gui/res/tokenscripts/c_a_food_sac.txt index 935a1465729..dc5c48fb3a8 100644 --- a/forge-gui/res/tokenscripts/c_a_food_sac.txt +++ b/forge-gui/res/tokenscripts/c_a_food_sac.txt @@ -1,5 +1,5 @@ Name:Food Token ManaCost:no cost Types:Artifact Food -A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME/this artifact> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -Oracle:{2}, {T}, Sacrifice this artifact: You gain 3 life. +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME/this token> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +Oracle:{2}, {T}, Sacrifice this token: You gain 3 life. diff --git a/forge-gui/res/tokenscripts/c_a_gold_sac.txt b/forge-gui/res/tokenscripts/c_a_gold_sac.txt index cce99b7a65a..8058007c204 100644 --- a/forge-gui/res/tokenscripts/c_a_gold_sac.txt +++ b/forge-gui/res/tokenscripts/c_a_gold_sac.txt @@ -1,5 +1,5 @@ Name:Gold Token ManaCost:no cost Types:Artifact Gold -A:AB$ Mana | Cost$ Sac<1/CARDNAME/this artifact> | Produced$ Any | SpellDescription$ Add one mana of any color. -Oracle:Sacrifice this artifact: Add one mana of any color. +A:AB$ Mana | Cost$ Sac<1/CARDNAME/this token> | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Sacrifice this token: Add one mana of any color. diff --git a/forge-gui/res/tokenscripts/c_a_junk_sac_exileplay.txt b/forge-gui/res/tokenscripts/c_a_junk_sac_exileplay.txt index 3201cb42f73..bd2162165c1 100644 --- a/forge-gui/res/tokenscripts/c_a_junk_sac_exileplay.txt +++ b/forge-gui/res/tokenscripts/c_a_junk_sac_exileplay.txt @@ -1,8 +1,8 @@ Name:Junk Token ManaCost:no cost Types:Artifact Junk -A:AB$ Dig | Cost$ T Sac<1/CARDNAME/this artifact> | SorcerySpeed$ True | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play that card this turn. Activate only as a sorcery. +A:AB$ Dig | Cost$ T Sac<1/CARDNAME/this token> | SorcerySpeed$ True | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play that card this turn. Activate only as a sorcery. SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play this card this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -Oracle:{T}, Sacrifice this artifact: Exile the top card of your library. You may play that card this turn. Activate only as a sorcery. +Oracle:{T}, Sacrifice this token: Exile the top card of your library. You may play that card this turn. Activate only as a sorcery. diff --git a/forge-gui/res/tokenscripts/c_a_map_sac_explore.txt b/forge-gui/res/tokenscripts/c_a_map_sac_explore.txt index fa9954f3321..361f8586982 100644 --- a/forge-gui/res/tokenscripts/c_a_map_sac_explore.txt +++ b/forge-gui/res/tokenscripts/c_a_map_sac_explore.txt @@ -1,5 +1,5 @@ Name:Map Token ManaCost:no cost Types:Artifact Map -A:AB$ Explore | Cost$ 1 T Sac<1/CARDNAME/this artifact> | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | SpellDescription$ Target creature you control explores. Activate only as a sorcery. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on that creature, then put the card back or put it into your graveyard.) -Oracle:{1}, {T}, Sacrifice this artifact: Target creature you control explores. Activate only as a sorcery. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on that creature, then put the card back or put it into your graveyard.) +A:AB$ Explore | Cost$ 1 T Sac<1/CARDNAME/this token> | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | SpellDescription$ Target creature you control explores. Activate only as a sorcery. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on that creature, then put the card back or put it into your graveyard.) +Oracle:{1}, {T}, Sacrifice this token: Target creature you control explores. Activate only as a sorcery. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on that creature, then put the card back or put it into your graveyard.) diff --git a/forge-gui/res/tokenscripts/c_a_treasure_sac.txt b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt index 0e31fb28cce..e9712e250c9 100644 --- a/forge-gui/res/tokenscripts/c_a_treasure_sac.txt +++ b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt @@ -1,5 +1,5 @@ Name:Treasure Token ManaCost:no cost Types:Artifact Treasure -A:AB$ Mana | Cost$ T Sac<1/CARDNAME/this artifact> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -Oracle:{T}, Sacrifice this artifact: Add one mana of any color. +A:AB$ Mana | Cost$ T Sac<1/CARDNAME/this token> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. +Oracle:{T}, Sacrifice this token: Add one mana of any color. diff --git a/forge-gui/res/tokenscripts/c_e_shard_draw.txt b/forge-gui/res/tokenscripts/c_e_shard_draw.txt index b7fb6baf705..96dd5cf05cb 100644 --- a/forge-gui/res/tokenscripts/c_e_shard_draw.txt +++ b/forge-gui/res/tokenscripts/c_e_shard_draw.txt @@ -1,6 +1,6 @@ Name:Shard Token ManaCost:no cost Types:Enchantment Shard -A:AB$ Scry | Cost$ 2 Sac<1/CARDNAME> | CostDesc$ {2}, Sacrifice this enchantment: | ScryNum$ 1 | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ Scry 1, then draw a card. +A:AB$ Scry | Cost$ 2 Sac<1/CARDNAME/this token> | CostDesc$ {2}, Sacrifice this enchantment: | ScryNum$ 1 | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ Scry 1, then draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | StackDescription$ None -Oracle:{2}, Sacrifice this enchantment: Scry 1, then draw a card. +Oracle:{2}, Sacrifice this token: Scry 1, then draw a card. diff --git a/forge-gui/res/tokenscripts/incubator_c_0_0_a_phyrexian.txt b/forge-gui/res/tokenscripts/incubator_c_0_0_a_phyrexian.txt index 1009957d1c4..a1b71529928 100644 --- a/forge-gui/res/tokenscripts/incubator_c_0_0_a_phyrexian.txt +++ b/forge-gui/res/tokenscripts/incubator_c_0_0_a_phyrexian.txt @@ -1,9 +1,9 @@ Name:Incubator Token ManaCost:no cost Types:Artifact Incubator -A:AB$ SetState | Cost$ 2 | Mode$ Transform | SpellDescription$ Transform this artifact. +A:AB$ SetState | Cost$ 2 | Mode$ Transform | SpellDescription$ Transform this token. AlternateMode:DoubleFaced -Oracle:{2}: Transform this artifact. +Oracle:{2}: Transform this token. ALTERNATE diff --git a/forge-gui/res/tokenscripts/role_wicked.txt b/forge-gui/res/tokenscripts/role_wicked.txt index 445e4bb53f9..10965acb1e8 100644 --- a/forge-gui/res/tokenscripts/role_wicked.txt +++ b/forge-gui/res/tokenscripts/role_wicked.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura Role K:Enchant:Creature SVar:AttachAILogic:Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDamage | TriggerDescription$ When this Aura is put into a graveyard, each opponent loses 1 life. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDamage | TriggerDescription$ When this token is put into a graveyard, each opponent loses 1 life. SVar:TrigDamage:DB$ LoseLife | LifeAmount$ 1 | Defined$ Opponent -Oracle:Enchant Creature\nEnchanted creature gets +1/+1.\nWhen this Aura is put into a graveyard, each opponent loses 1 life. +Oracle:Enchant Creature\nEnchanted creature gets +1/+1.\nWhen this token is put into a graveyard, each opponent loses 1 life. From 5787dfbca5376510ae7ec2691f55f808e1a47fdb Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 23 Jul 2025 06:31:31 +0200 Subject: [PATCH 139/183] Update Edge of Eternities Commander.txt Fix Insect Token --- forge-gui/res/editions/Edge of Eternities Commander.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Edge of Eternities Commander.txt b/forge-gui/res/editions/Edge of Eternities Commander.txt index 99063b0c8f5..58b5b1b3b41 100644 --- a/forge-gui/res/editions/Edge of Eternities Commander.txt +++ b/forge-gui/res/editions/Edge of Eternities Commander.txt @@ -201,7 +201,7 @@ ScryfallCode=EOC [tokens] 2 c_x_x_shapeshifter_changeling_deathtouch @Carlos Palma Cruchaga 3 u_2_2_bird_flying @Alessandra Pisano -4 g_1_1_insect_flying @Deruchenko Alexander +4 b_1_1_insect_flying @Deruchenko Alexander 5 g_3_3_beast @Dave Allsop 6 g_4_4_beast @Xabi Gaztelua 7 g_5_3_elemental @Nils Hamm From e3637586d64ac43d4afcfba47420b6c3cb7c6303 Mon Sep 17 00:00:00 2001 From: Eradev Date: Wed, 23 Jul 2025 00:33:44 -0400 Subject: [PATCH 140/183] Revert "Add g_1_1_insect_flying token" This reverts commit 0d2d01060d5d95a0abfb346bdffc5f629717a2a5. --- forge-gui/res/tokenscripts/g_1_1_insect_flying.txt | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 forge-gui/res/tokenscripts/g_1_1_insect_flying.txt diff --git a/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt b/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt deleted file mode 100644 index 86cb3c8b510..00000000000 --- a/forge-gui/res/tokenscripts/g_1_1_insect_flying.txt +++ /dev/null @@ -1,7 +0,0 @@ -Name:Insect Token -ManaCost:no cost -Colors:green -Types:Creature Insect -PT:1/1 -K:Flying -Oracle:Flying From 2792c5740512fa034394f45a626c6532085b257d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Jul 2025 21:26:19 +0800 Subject: [PATCH 141/183] fix Summon: Choco/Mog not importing --- forge-core/src/main/java/forge/deck/DeckRecognizer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index ef9ee92a76d..2757f418b26 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -581,7 +581,9 @@ public class DeckRecognizer { line = refLine.trim(); // Remove any trailing formatting // Some websites export split card names with a single slash. Replace with double slash. - line = SEARCH_SINGLE_SLASH.matcher(line).replaceFirst(" // "); + // Final fantasy cards like Summon: Choco/Mog should be ommited to be recognized. TODO: fix maybe for future cards + if (!line.contains("Summon:")) + line = SEARCH_SINGLE_SLASH.matcher(line).replaceFirst(" // "); if (StringUtils.startsWith(line, ASTERISK)) // markdown lists (tappedout md export) line = line.substring(2); From c66e4a08e6623b21223632931a318d9782ad8207 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Jul 2025 22:12:26 +0800 Subject: [PATCH 142/183] QOL Groupby CardType Land --- forge-gui/src/main/java/forge/itemmanager/GroupDef.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index eae4ac38bdb..ac514210d5c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -102,10 +102,10 @@ public enum GroupDef { return 2; } if (type.isArtifact()) { - return 4; + return type.isLand() ? 6 : 4; } if (type.isEnchantment()) { - return 5; + return type.isLand() ? 6 : 5; } if (type.isBattle()) { return 7; From 11be569f3525f798cf0e1176c7e9566c476720b9 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:37:19 +0100 Subject: [PATCH 143/183] Rename rukarumal_biologist.txt to rukarumel_biologist.txt (#8173) --- .../r/{rukarumal_biologist.txt => rukarumel_biologist.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/r/{rukarumal_biologist.txt => rukarumel_biologist.txt} (100%) diff --git a/forge-gui/res/cardsfolder/r/rukarumal_biologist.txt b/forge-gui/res/cardsfolder/r/rukarumel_biologist.txt similarity index 100% rename from forge-gui/res/cardsfolder/r/rukarumal_biologist.txt rename to forge-gui/res/cardsfolder/r/rukarumel_biologist.txt From 5cf155fb946149f2b19255ff8e98c4426f93c5e8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 23 Jul 2025 10:04:20 +0200 Subject: [PATCH 144/183] CardFactory: fix Squad TokenNames Can be used for WH40K token But FalloutToken need a fallback to Copy? --- .../java/forge/game/card/CardFactory.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index dcc762c0dea..52aece9e97d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -722,29 +722,32 @@ public class CardFactory { // Special Rules for Embalm and Eternalize if (sa.isEmbalm() && sa.isIntrinsic()) { - String name = TextUtil.fastReplace( + String name = "embalm_" + TextUtil.fastReplace( TextUtil.fastReplace(host.getName(), ",", ""), " ", "_").toLowerCase(); - String set = host.getSetCode().toLowerCase(); - state.setImageKey(ImageKeys.getTokenKey("embalm_" + name + "_" + set)); + state.setImageKey(StaticData.instance().getOtherImageKey(name, host.getSetCode())); } if (sa.isEternalize() && sa.isIntrinsic()) { - String name = TextUtil.fastReplace( + String name = "eternalize_" + TextUtil.fastReplace( TextUtil.fastReplace(host.getName(), ",", ""), " ", "_").toLowerCase(); - String set = host.getSetCode().toLowerCase(); - state.setImageKey(ImageKeys.getTokenKey("eternalize_" + name + "_" + set)); + state.setImageKey(StaticData.instance().getOtherImageKey(name, host.getSetCode())); } if (sa.isKeyword(Keyword.OFFSPRING) && sa.isIntrinsic()) { - String name = TextUtil.fastReplace( + String name = "offspring_" + TextUtil.fastReplace( TextUtil.fastReplace(host.getName(), ",", ""), " ", "_").toLowerCase(); - String set = host.getSetCode().toLowerCase(); - state.setImageKey(ImageKeys.getTokenKey("offspring_" + name + "|" + set)); + state.setImageKey(StaticData.instance().getOtherImageKey(name, host.getSetCode())); } + if (sa.isKeyword(Keyword.SQUAD) && sa.isIntrinsic()) { + String name = "squad_" + TextUtil.fastReplace( + TextUtil.fastReplace(host.getName(), ",", ""), + " ", "_").toLowerCase(); + state.setImageKey(StaticData.instance().getOtherImageKey(name, host.getSetCode())); + } if (sa.hasParam("GainTextOf") && originalState != null) { state.setSetCode(originalState.getSetCode()); From 9164e76f4476e331752dc4939979440ef09260e8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 23 Jul 2025 09:41:06 +0200 Subject: [PATCH 145/183] CopyPermanentEffect: fix DefinedName TokenKey --- .../java/forge/game/ability/effects/CopyPermanentEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index df3cd87c0df..43b8755efc5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -281,7 +281,7 @@ public class CopyPermanentEffect extends TokenEffectBase { String set = sa.getOriginalHost().getSetCode(); copy.getCurrentState().setRarity(CardRarity.Token); copy.getCurrentState().setSetCode(set); - copy.getCurrentState().setImageKey(ImageKeys.getTokenKey(name + "_" + set.toLowerCase())); + copy.getCurrentState().setImageKey(StaticData.instance().getOtherImageKey(name, set)); } else { final Card host = sa.getHostCard(); From c6514e018357d552af204d47674e13d0a03afcb8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 23 Jul 2025 09:47:42 +0200 Subject: [PATCH 146/183] Update CopyPermanentEffect.java --- .../java/forge/game/ability/effects/CopyPermanentEffect.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 43b8755efc5..276491ded83 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -12,7 +12,6 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.google.common.collect.Lists; -import forge.ImageKeys; import forge.StaticData; import forge.card.CardRarity; import forge.card.CardRulesPredicates; From 854d6640d160728b3978f6dccccf941a5ac6fb86 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 23 Jul 2025 18:26:27 +0200 Subject: [PATCH 147/183] Fix PlayEffect skipping some checks (e.g. split second on AI) (#8162) --- .../java/forge/game/ability/AbilityUtils.java | 16 ++++------------ .../src/main/java/forge/game/player/Player.java | 12 +++++------- .../main/java/forge/game/spellability/Spell.java | 2 +- .../spellability/SpellAbilityRestriction.java | 16 +++++++++------- ...nos_yae_galvus_shinryu_transcendent_rival.txt | 2 +- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 28f26ae520a..48e2646c629 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3007,18 +3007,10 @@ public class AbilityUtils { } } else { final Spell newSA = (Spell) s.copy(controller); - SpellAbilityRestriction res = new SpellAbilityRestriction(); - // timing restrictions still apply - res.setPlayerTurn(s.getRestrictions().getPlayerTurn()); - res.setOpponentTurn(s.getRestrictions().getOpponentTurn()); - res.setPhases(s.getRestrictions().getPhases()); - res.setZone(null); - newSA.setRestrictions(res); - // timing restrictions still apply - if (res.checkTimingRestrictions(tgtCard, newSA) - // still need to check the other restrictions like Aftermath - && res.checkOtherRestrictions(tgtCard, newSA, controller)) { - newSA.setCastFromPlayEffect(true); + newSA.getRestrictions().setZone(null); + newSA.setCastFromPlayEffect(true); + // extra timing restrictions still apply + if (newSA.canPlay()) { sas.add(newSA); } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 16cc3e9c99f..46fb064f17f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1713,14 +1713,7 @@ public class Player extends GameEntity implements Comparable { if (!canCastSorcery() && (landSa == null || !landSa.withFlash(land, this))) { return false; } - } - // CantBeCast static abilities - if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { - return false; - } - - if (land != null && !ignoreZoneAndTiming) { final boolean mayPlay = landSa == null ? !land.mayPlay(this).isEmpty() : landSa.getMayPlay() != null; if (land.getOwner() != this && !mayPlay) { return false; @@ -1732,6 +1725,11 @@ public class Player extends GameEntity implements Comparable { } } + // CantBeCast static abilities + if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { + return false; + } + // **** Check for land play limit per turn **** // Dev Mode if (getMaxLandPlaysInfinite()) { diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 351be674fba..057ca219569 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -72,7 +72,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } // CR 118.6 cost is unpayable - if (getPayCosts().hasManaCost() && getPayCosts().getCostMana().getMana().isNoCost()) { + if (!isCastFromPlayEffect() && getPayCosts().hasManaCost() && getPayCosts().getCostMana().getMana().isNoCost()) { return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 3a425af9465..615d27406c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -353,6 +353,10 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { public final boolean checkActivatorRestrictions(final Card c, final SpellAbility sa) { Player activator = sa.getActivatingPlayer(); + if (sa.isCastFromPlayEffect()) { + return true; + } + if (sa.isSpell()) { // Spells should always default to "controller" but use mayPlay check. final CardPlayOption o = c.mayPlay(sa.getMayPlay()); @@ -615,14 +619,12 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { return false; } - if (!sa.isCastFromPlayEffect()) { - if (!checkTimingRestrictions(c, sa)) { - return false; - } + if (!checkActivatorRestrictions(c, sa)) { + return false; + } - if (!checkActivatorRestrictions(c, sa)) { - return false; - } + if (!checkTimingRestrictions(c, sa)) { + return false; } if (!checkZoneRestrictions(c, sa)) { diff --git a/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt b/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt index d3fc598d604..fe3e82eb96c 100644 --- a/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt +++ b/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt @@ -2,7 +2,7 @@ Name:Zenos yae Galvus ManaCost:3 B B Types:Legendary Creature Human Noble Warrior PT:4/4 -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ My First Friend — When CARDNAME enters, choose a creature an opponent controls. Until end of turn, creatures other than Zenos yae Galvus and the chosen creature get -2/-2. +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ My First Friend — When CARDNAME enters, choose a creature an opponent controls. Until end of turn, creatures other than CARDNAME and the chosen creature get -2/-2. SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.OppCtrl | Mandatory$ True | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature.Other+!ChosenCardStrict | IsCurse$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.ChosenCardStrict | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When the chosen creature leaves the battlefield, transform CARDNAME. From 234237b43a8153b0486b092370850c27a4293eec Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 23 Jul 2025 19:11:47 +0200 Subject: [PATCH 148/183] Basic renderer support for Spacecraft PT --- .../src/main/java/forge/game/card/CardView.java | 6 +++++- .../forge/toolbox/imaging/FCardImageRenderer.java | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 26baefbf331..b8e8dec334e 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -1401,6 +1401,11 @@ public class CardView extends GameEntityView { set(TrackableProperty.RulesText, rulesText); } + public boolean hasPrintedPower() { + EnumMap props = getProps(); + return props.containsKey(TrackableProperty.Power); + } + public int getPower() { return get(TrackableProperty.Power); } @@ -1480,7 +1485,6 @@ public class CardView extends GameEntityView { set(TrackableProperty.Loyalty, "0"); //alternates don't need loyalty } - public String getDefense() { return get(TrackableProperty.Defense); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java index b3ba1060646..75657b4a752 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java @@ -294,7 +294,8 @@ public class FCardImageRenderer { int headerHeight = NAME_SIZE + 2 * HEADER_PADDING; int typeBoxHeight = TYPE_SIZE + 2 * TYPE_PADDING; int ptBoxHeight = 0; - if (state.isCreature() || state.isPlaneswalker() | state.isBattle() || state.isVehicle()) { + if (state.isCreature() || state.isPlaneswalker() | state.isBattle() || state.isVehicle() || + (state.getType().hasSubtype("Spacecraft") && state.hasPrintedPower())) { //if P/T box needed, make room for it ptBoxHeight = headerHeight; } @@ -682,7 +683,6 @@ public class FCardImageRenderer { new Rectangle(x, y, w, h), NAME_FONT, NAME_SIZE); } - private static void drawArt(Graphics2D g, Color[] colors, int x, int y, int w, int h, BufferedImage art) { if (art != null) { int artWidth = art.getWidth(); @@ -841,6 +841,14 @@ public class FCardImageRenderer { pieces.add(String.valueOf(state.getToughness())); } } + else if (state.getType().hasSubtype("Spacecraft")) { + Color [] scColor = { Color.BLACK }; + colors = scColor; + TEXT_COLOR = Color.WHITE; + pieces.add(String.valueOf(state.getPower())); + pieces.add("/"); + pieces.add(String.valueOf(state.getToughness())); + } else if (state.isPlaneswalker()) { Color [] pwColor = { Color.BLACK }; colors = pwColor; From f426e9f236eb0e6c81c2ca07b92e8ede91d2fec6 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 23 Jul 2025 21:29:25 +0000 Subject: [PATCH 149/183] Update plasma_bolt.txt --- forge-gui/res/cardsfolder/p/plasma_bolt.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/plasma_bolt.txt b/forge-gui/res/cardsfolder/p/plasma_bolt.txt index 2bdf1b39305..a8a37b4ae4b 100644 --- a/forge-gui/res/cardsfolder/p/plasma_bolt.txt +++ b/forge-gui/res/cardsfolder/p/plasma_bolt.txt @@ -1,6 +1,6 @@ Name:Plasma Bolt ManaCost:R -Types:Instant +Types:Sorcery A:SP$ DealDamage | ValidTgts$ Any | NumDmg$ X | SpellDescription$ CARDNAME deals 2 damage to any target. Void — CARDNAME deals 3 damage instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. SVar:X:Count$Void.3.2 Oracle:Plasma Bolt deals 2 damage to any target.\nVoid — Plasma Bolt deals 3 damage instead if a nonland permanent left the battlefield this turn or a spell was warped this turn. From 64738f58d6b1aaa1d3c02e81c66553dcfcacb252 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Jul 2025 07:33:42 +0800 Subject: [PATCH 150/183] remove isNyx check --- .../main/java/forge/game/card/CardView.java | 6 ++---- .../src/forge/card/CardImageRenderer.java | 21 +++++++++---------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 26baefbf331..7f24fab956e 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -1799,10 +1799,8 @@ public class CardView extends GameEntityView { public boolean isArtifact() { return getType().isArtifact(); } - public boolean isNyx() { - if (!getType().isEnchantment() || getType().getCoreTypes() == null) - return false; - return Iterables.size(getType().getCoreTypes()) > 1; + public boolean isEnchantment() { + return getType().isEnchantment(); } public boolean isAttraction() { return getType().isAttraction(); diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index c5122490e6e..04539c011e1 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -952,7 +952,6 @@ public class CardImageRenderer { public static Color[] drawCardBackgroundTexture(CardStateView state, Graphics g, List backColors, float x, float y, float w, float h) { boolean isHybrid = state.getManaCost().hasMultiColor(); boolean isPW = state.isPlaneswalker(); - boolean isNyx = state.isNyx(); Color[] colors = new Color[backColors.size()]; for (int i = 0; i < colors.length; i++) { DetailColors dc = backColors.get(i); @@ -967,7 +966,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.MULTICOLOR) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_M, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -978,7 +977,7 @@ public class CardImageRenderer { g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); else if (isPW) g.drawImage(FSkinTexture.PWBG_C, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_C, x, y, w, h); else if (state.isArtifact()) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -987,7 +986,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.GREEN) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_G, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -996,7 +995,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.RED) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_R, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1005,7 +1004,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.BLACK) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_B, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1014,7 +1013,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.BLUE) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_U, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1023,7 +1022,7 @@ public class CardImageRenderer { } else if (backColors.get(0) == DetailColors.WHITE) { if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_W, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1034,7 +1033,7 @@ public class CardImageRenderer { case 2: if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_M, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1067,7 +1066,7 @@ public class CardImageRenderer { case 3: if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_M, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); @@ -1077,7 +1076,7 @@ public class CardImageRenderer { default: if (state.isVehicle()) g.drawImage(FSkinTexture.CARDBG_V, x, y, w, h); - else if (isNyx) + else if (state.isEnchantment()) g.drawImage(FSkinTexture.NYX_C, x, y, w, h); else if (state.isArtifact() && !isPW) g.drawImage(FSkinTexture.CARDBG_A, x, y, w, h); From 4c87c8a1ff8685e99e0f9f2800aa6f00f33cc13b Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Thu, 24 Jul 2025 12:20:00 +0800 Subject: [PATCH 151/183] update renderer for Spacecraft PT (#8178) * update renderer for Spacecraft PT --- .../src/main/java/forge/card/CardRules.java | 4 ++++ .../main/java/forge/game/card/CardView.java | 20 ++++++++++++------- .../forge/trackable/TrackableProperty.java | 1 + .../toolbox/imaging/FCardImageRenderer.java | 5 ++--- .../java/forge/view/arcane/CardPanel.java | 2 +- .../src/forge/card/CardImageRenderer.java | 4 ++-- .../src/forge/card/CardRenderer.java | 2 +- .../java/forge/gui/card/CardDetailUtil.java | 11 +++++----- 8 files changed, 29 insertions(+), 20 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 4164705a2ee..e1c99fbe57c 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -277,6 +277,10 @@ public final class CardRules implements ICardCharacteristics { return getType().isDungeon(); } + public boolean hasPrintedPT() { + return getPower() != null || getToughness() != null; + } + public boolean canBeCommander() { if (mainPart.getOracleText().contains(" is your commander, choose a color before the game begins.")) { addsWildCardColor = true; diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 8666dafe681..5bf402b30f8 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -1098,6 +1098,7 @@ public class CardView extends GameEntityView { currentState.getView().setOriginalColors(c); //set original Colors currentStateView.updateAttractionLights(currentState); + currentStateView.updateHasPrintedPT(c.getRules() != null && c.getRules().hasPrintedPT()); CardState alternateState = isSplitCard && isFaceDown() ? c.getState(CardStateName.RightSplit) : c.getAlternateState(); @@ -1401,17 +1402,12 @@ public class CardView extends GameEntityView { set(TrackableProperty.RulesText, rulesText); } - public boolean hasPrintedPower() { - EnumMap props = getProps(); - return props.containsKey(TrackableProperty.Power); - } - public int getPower() { return get(TrackableProperty.Power); } void updatePower(Card c) { int num; - if (getType().hasSubtype("Vehicle") && !isCreature()) { + if (hasPrintedPT() && !isCreature()) { // use printed value so user can still see it num = c.getCurrentPower(); } else { @@ -1436,7 +1432,7 @@ public class CardView extends GameEntityView { } void updateToughness(Card c) { int num; - if (getType().hasSubtype("Vehicle") && !isCreature()) { + if (hasPrintedPT() && !isCreature()) { // use printed value so user can still see it num = c.getCurrentToughness(); } else { @@ -1521,6 +1517,13 @@ public class CardView extends GameEntityView { set(TrackableProperty.AttractionLights, c.getAttractionLights()); } + public boolean hasPrintedPT() { + return get(TrackableProperty.HasPrintedPT); + } + void updateHasPrintedPT(boolean val) { + set(TrackableProperty.HasPrintedPT, val); + } + public String getSetCode() { return get(TrackableProperty.SetCode); } @@ -1806,6 +1809,9 @@ public class CardView extends GameEntityView { public boolean isEnchantment() { return getType().isEnchantment(); } + public boolean isSpaceCraft() { + return getType().hasSubtype("Spacecraft"); + } public boolean isAttraction() { return getType().isAttraction(); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index a303fb14d2d..0068a966f2c 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -137,6 +137,7 @@ public enum TrackableProperty { AttractionLights(TrackableTypes.IntegerSetType), ChangedColorWords(TrackableTypes.StringMapType), HasChangedColors(TrackableTypes.BooleanType), + HasPrintedPT(TrackableTypes.BooleanType, FreezeMode.IgnoresFreeze), ChangedTypes(TrackableTypes.StringMapType), //check produce mana for BG diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java index 75657b4a752..a0c12ad1a5a 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java @@ -294,8 +294,7 @@ public class FCardImageRenderer { int headerHeight = NAME_SIZE + 2 * HEADER_PADDING; int typeBoxHeight = TYPE_SIZE + 2 * TYPE_PADDING; int ptBoxHeight = 0; - if (state.isCreature() || state.isPlaneswalker() | state.isBattle() || state.isVehicle() || - (state.getType().hasSubtype("Spacecraft") && state.hasPrintedPower())) { + if (state.isCreature() || state.isPlaneswalker() | state.isBattle() || state.hasPrintedPT()) { //if P/T box needed, make room for it ptBoxHeight = headerHeight; } @@ -841,7 +840,7 @@ public class FCardImageRenderer { pieces.add(String.valueOf(state.getToughness())); } } - else if (state.getType().hasSubtype("Spacecraft")) { + else if (state.isSpaceCraft()) { Color [] scColor = { Color.BLACK }; colors = scColor; TEXT_COLOR = Color.WHITE; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 73b334f2490..29bded8c8eb 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -1046,7 +1046,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl else if (state.isCreature()) { sPt = state.getPower() + "/" + state.getToughness(); } - else if (state.getType().hasSubtype("Vehicle")) { + else if (state.isVehicle()) { sPt = "[" + state.getPower() + "/" + state.getToughness() + "]"; } else if (state.isPlaneswalker()) { diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 04539c011e1..03decae98cf 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -151,7 +151,7 @@ public class CardImageRenderer { float ptBoxHeight = 0; float textBoxHeight = h - headerHeight - artHeight - typeBoxHeight - outerBorderThickness - artInset; - if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle") || state.isBattle()) { + if (state.isCreature() || state.isPlaneswalker() || state.hasPrintedPT() || state.isBattle()) { ptBoxHeight = 2 * PT_FONT.getCapHeight(); } //space for artist @@ -724,7 +724,7 @@ public class CardImageRenderer { pieces.add(String.valueOf(state.getToughness())); } else if (state.isPlaneswalker()) { pieces.add(String.valueOf(state.getLoyalty())); - } else if (state.getType().hasSubtype("Vehicle")) { + } else if (state.hasPrintedPT()) { // TODO Invert color box for Vehicles? pieces.add("["); pieces.add(String.valueOf(state.getPower())); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 9b9bfa8f1b5..5fd00ed4565 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -1382,7 +1382,7 @@ public class CardRenderer { pieces.add(String.valueOf(details.getPower())); pieces.add("/"); pieces.add(String.valueOf(details.getToughness())); - } else if (details.getType().hasSubtype("Vehicle")) { + } else if (details.hasPrintedPT()) { pieces.add("["); pieces.add(String.valueOf(details.getPower())); pieces.add("/"); diff --git a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java index 2a4b251771c..9fc2f2cbc84 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java @@ -174,17 +174,16 @@ public class CardDetailUtil { return ""; } final StringBuilder ptText = new StringBuilder(); - boolean vehicle = card.getType().hasSubtype("Vehicle"); - if (vehicle && !card.isCreature()) { - ptText.append("{"); + if (card.hasPrintedPT() && !card.isCreature()) { + ptText.append("["); } - if (card.isCreature() || vehicle) { + if (card.isCreature() || card.hasPrintedPT()) { ptText.append(card.getPower()).append(" / ").append(card.getToughness()); } - if (vehicle && !card.isCreature()) { - ptText.append("}"); + if (card.hasPrintedPT() && !card.isCreature()) { + ptText.append("]"); } if (card.isPlaneswalker()) { From 1627503248785eb3a4718929fcf7756fea8c7432 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 07:31:04 +0200 Subject: [PATCH 152/183] Origin of Spider-Man (SPM) (#8176) --- .../res/cardsfolder/upcoming/origin_of_spider_man.txt | 10 ++++++++++ forge-gui/res/tokenscripts/g_2_1_spider_reach.txt | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/origin_of_spider_man.txt create mode 100644 forge-gui/res/tokenscripts/g_2_1_spider_reach.txt diff --git a/forge-gui/res/cardsfolder/upcoming/origin_of_spider_man.txt b/forge-gui/res/cardsfolder/upcoming/origin_of_spider_man.txt new file mode 100644 index 00000000000..d38d95814cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/origin_of_spider_man.txt @@ -0,0 +1,10 @@ +Name:Origin of Spider-Man +ManaCost:1 W +Types:Enchantment Saga +K:Chapter:3:DBToken,DBPutCounter,DBPump +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_2_1_spider_reach | TokenOwner$ You | SpellDescription$ Create a 2/1 green Spider creature token with reach. +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBAnimate | SpellDescription$ Put a +1/+1 counter on target creature you control. It becomes a legendary Spider Hero in addition to its other types. +SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Types$ Legendary,Spider,Hero | Duration$ Permanent +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Double Strike | SpellDescription$ Target creature you control gains double strike until end of turn. +DeckHas:Ability$Token & Type$Legendary|Spider|Hero +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Create a 2/1 green Spider creature token with reach.\nII — Put a +1/+1 counter on target creature you control. It becomes a legendary Spider Hero in addition to its other types.\nIII — Target creature you control gains double strike until end of turn. diff --git a/forge-gui/res/tokenscripts/g_2_1_spider_reach.txt b/forge-gui/res/tokenscripts/g_2_1_spider_reach.txt new file mode 100644 index 00000000000..100977b1624 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_2_1_spider_reach.txt @@ -0,0 +1,7 @@ +Name:Spider Token +ManaCost:no cost +Colors:green +Types:Creature Spider +PT:2/1 +K:Reach +Oracle:Reach From f61e1cd435f3280443c56d2d031e5d4ad45bc947 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 24 Jul 2025 08:17:29 +0100 Subject: [PATCH 153/183] Edition updates: SPE, SPM --- .../editions/Marvel's Spider-Man Eternal.txt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/forge-gui/res/editions/Marvel's Spider-Man Eternal.txt b/forge-gui/res/editions/Marvel's Spider-Man Eternal.txt index 7acee25da37..4c2b3ffc31e 100644 --- a/forge-gui/res/editions/Marvel's Spider-Man Eternal.txt +++ b/forge-gui/res/editions/Marvel's Spider-Man Eternal.txt @@ -6,6 +6,26 @@ Type=Expansion ScryfallCode=SPE [cards] +1 C Amateur Hero @Anthony Devine +2 R Amazing Alliance @Filipe Pagliuso +3 U MJ, Rising Star @Bachzim +4 M Spider-Man, Peter Parker @Paolo Rivera +5 C Alchemax Slayer-Bots @Kevin Glint +6 R Future Flight @Lie Setiawan +7 U Lyla, Holographic Assistant @Nereida +8 M Spider-Man 2099, Miguel O'Hara @Thanh Tuấn +9 U Grendel, Spawn of Knull @Steve Prescott +10 R Lethal Protection @Néstor Ossandón Leal +11 C Symbiote Spawn @Helge C. Balzer +12 M Venom, Eddie Brock @Simon Dominic +13 R Double Trouble @Nathaniel Himawan +14 M Ghost-Spider, Gwen Stacy @Xabi Gaztelua +15 U The Mary Janes @Toni Infante +16 C Rampaging Classmate @Xabi Gaztelua +17 U Prowler, Misguided Mentor @Bartek Fedyczak +18 M Spider-Man, Miles Morales @InHyuk Lee +19 C Twisted Spider-Clone @Kevin Sidharta +20 R Venom Blast @Toni Infante 21 R Grasping Tentacles @Dan Dos Santos 22 R Venom, Deadly Devourer @Dan Dos Santos 23 R Green Goblin, Nemesis @Dan Dos Santos From 41dfb3488cf32e512a950a5c15913f53528e17c7 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 24 Jul 2025 08:21:45 +0100 Subject: [PATCH 154/183] Create Marvel's Spider-Man.txt --- .../res/editions/Marvel's Spider-Man.txt | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 forge-gui/res/editions/Marvel's Spider-Man.txt diff --git a/forge-gui/res/editions/Marvel's Spider-Man.txt b/forge-gui/res/editions/Marvel's Spider-Man.txt new file mode 100644 index 00000000000..fd483ea2df5 --- /dev/null +++ b/forge-gui/res/editions/Marvel's Spider-Man.txt @@ -0,0 +1,65 @@ +[metadata] +Code=SPM +Date=2025-09-26 +Name=Marvel's Spider-Man +Type=Expansion +ScryfallCode=SPM + +[cards] +3 U Aunt May @Randy Gallegos +6 C Daily Bugle Reporters @Zoltan Boros +9 R Origin of Spider-Man @Bill Sienkiewicz +10 M Peter Parker @Thanh Tuấn +12 C Selfless Police Captain @Aniekan Udofia +15 C Spectacular Tactics @Zoltan Boros +16 C Spider-Man, Web-Slinger @Ryan Pancoast +18 C Starling, Aerial Ally @Aniekan Udofia +20 C Thwip! @Lordigan +21 C Web Up @David Palumbo +23 C Wild Pack Squad @John Tyler Christopher +26 C Beetle, Legacy Criminal @Carlos Dattoli +29 C Doc Ock, Sinister Scientist @Piotr Dura +30 C Doc Ock's Henchmen @Nathaniel Himawan +31 U Flying Octobot @John Tyler Christopher +40 C Oscorp Research Team @Gal Or +44 U Spider-Byte, Web Warden @Thanh Tuấn +47 C Unstable Experiment @David Palumbo +48 C Whoosh! @Nathaniel Himawan +58 C Merciless Enforcers @Alex Horley-Orlandelli +62 C Risky Research @Rafater +64 U Scorpion, Seething Striker @Simon Dominic +65 C Scorpion's Sting @Lee Woo-chul +67 U Spider-Man Noir @Xabi Gaztelua +70 U Tombstone, Career Criminal @Bartek Fedyczak +71 C Venom, Evil Unleashed @Jesper Ejsing +73 C Venom's Hunger @Dave DeVries +75 C Angry Rabble @Bartek Fedyczak +77 C Electro's Bolt @JB Casacop +82 C Masked Meower @Narendra Bintara Adi +86 C Romantic Rendezvous @Nereida +88 C Shock @Piotr Dura +89 U Shocker, Unshakable @Kevin Glint +90 C Spider-Gwen, Free Spirit @Lie Setiawan +91 C Spider-Islanders @Helge C. Balzer +95 C Stegron the Dinosaur Man @John Tyler Christopher +97 C Taxi Driver @Néstor Ossandón Leal +101 C Grow Extra Arms @Kevin Sidharta +102 C Guy in the Chair @Zoltan Boros +103 C Kapow! @Jessica Fong +104 C Kraven's Cats @Kevin Glint +107 C Lurking Lizards @Rafater +113 C Scout the City @Rafater +114 R Spider-Ham, Peter Porker @Filipe Pagliuso +115 C Spider-Man, Brooklyn Visionary @Aniekan Udofia +116 C Spider-Rex, Daring Dino @Narendra Bintara Adi +147 U SP//dr, Piloted by Peni @Toni Infante +150 R Spider-Man 2099 @Toni Infante +163 C Eerie Gravestone @Lordigan +168 C Mechanical Mobster @David Szabo +173 C Spider-Bot @Carlos Dattoli +194 L Plains @Jonas De Ro +195 L Island @Jonas De Ro +196 L Swamp @Jonas De Ro +197 L Mountain @Jonas De Ro +198 L Forest @Jonas De Ro +232 M Peter Parker @Jack Kirby & Steve Ditko From 6ee86f97627f55c4fd13664c21ccb7503e2971d1 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 24 Jul 2025 08:25:02 +0100 Subject: [PATCH 155/183] Update Secret Lair Drop Series.txt --- forge-gui/res/editions/Secret Lair Drop Series.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 7dcd7789aff..9e9b9ea1855 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -2045,6 +2045,14 @@ F1540 M Rainbow Dash @John Thacker 7027 R Tibalt's Trickery @Babs Webb 7028 R Minds Aglow @Evan Geltosky 7029 R Command Tower @Dan Black +7030 R Command Tower @Sylvain Sarrailh +7031 M Lotus Petal @Mike Burns +7032 M Lotus Petal @Mike Burns +7033 M Lotus Petal @Mike Burns +7034 M Lotus Petal @Mike Burns +7035 M Lotus Petal @Mike Burns +7036 M Lotus Petal @Mike Burns +7037 M Lotus Petal @Mike Burns 8001 M Jace, the Mind Sculptor @Wizard of Barge 9990 R Doom Blade @Cynthia Sheppard 9991 R Massacre @Andrey Kuzinskiy From 1f28e46e06aae7f54655964e11bf530e3dc06835 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Jul 2025 15:58:03 +0800 Subject: [PATCH 156/183] invert PT Box color --- .../src/forge/card/CardImageRenderer.java | 22 +++++++++---------- .../src/forge/card/CardRenderer.java | 5 +++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 03decae98cf..6cfc7eb8418 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -45,6 +45,8 @@ public class CardImageRenderer { private static FSkinFont NAME_FONT, TYPE_FONT, TEXT_FONT, PT_FONT; private static float prevImageWidth, prevImageHeight; private static final float BLACK_BORDER_THICKNESS_RATIO = 0.021f; + public static final Color[] VEHICLE_PTBOX_COLOR = new Color[] { Color.valueOf("#A36C42") }; + public static final Color[] SPACECRAFT_PTBOX_COLOR = new Color[] { Color.valueOf("#6F6E6E") }; private static Color fromDetailColor(DetailColors detailColor) { return FSkinColor.fromRGB(detailColor.r, detailColor.g, detailColor.b); @@ -231,7 +233,7 @@ public class CardImageRenderer { if (onTop && ptBoxHeight > 0) { //only needed if on top since otherwise P/T will be hidden Color[] ptColors = FSkinColor.tintColors(Color.WHITE, colors, CardRenderer.PT_BOX_TINT); - drawPtBox(g, card, state, ptColors, x, y - 2 * artInset, w, ptBoxHeight, noText); + drawPtBox(g, state, ptColors, x, y - 2 * artInset, w, ptBoxHeight, noText); } //draw artist if (showArtist) @@ -716,7 +718,7 @@ public class CardImageRenderer { g.drawImage(Forge.getAssets().getTexture(getDefaultSkinFile("overlay_alpha.png")), x, y, w, h); } - private static void drawPtBox(Graphics g, CardView card, CardStateView state, Color[] colors, float x, float y, float w, float h, boolean noText) { + private static void drawPtBox(Graphics g, CardStateView state, Color[] colors, float x, float y, float w, float h, boolean noText) { List pieces = new ArrayList<>(); if (state.isCreature()) { pieces.add(String.valueOf(state.getPower())); @@ -725,7 +727,6 @@ public class CardImageRenderer { } else if (state.isPlaneswalker()) { pieces.add(String.valueOf(state.getLoyalty())); } else if (state.hasPrintedPT()) { - // TODO Invert color box for Vehicles? pieces.add("["); pieces.add(String.valueOf(state.getPower())); pieces.add("/"); @@ -753,17 +754,16 @@ public class CardImageRenderer { w = boxWidth; h = boxHeight; - fillColorBackground(g, colors, x, y, w, h); + fillColorBackground(g, state.isVehicle() ? VEHICLE_PTBOX_COLOR : state.isSpaceCraft() ? SPACECRAFT_PTBOX_COLOR : colors, x, y, w, h); //draw outline color here - if (state != null) - drawOutlineColor(g, state.getColors(), x, y, w, h); + drawOutlineColor(g, state.getColors(), x, y, w, h); g.drawRect(BORDER_THICKNESS, Color.BLACK, x, y, w, h); if (noText) return; x += (boxWidth - totalPieceWidth) / 2; for (int i = 0; i < pieces.size(); i++) { - g.drawText(pieces.get(i), PT_FONT, Color.BLACK, x, y, w, h, false, Align.left, true); + g.drawText(pieces.get(i), PT_FONT, state.isVehicle() || state.isSpaceCraft() ? Color.WHITE : Color.BLACK, x, y, w, h, false, Align.left, true); x += pieceWidths[i]; } } @@ -936,7 +936,7 @@ public class CardImageRenderer { y += textBoxHeight + innerBorderThickness; Color[] ptColors = FSkinColor.tintColors(Color.WHITE, colors, CardRenderer.PT_BOX_TINT); - drawDetailsIdAndPtBox(g, card, state, canShow, idForeColor, ptColors, x, y, w, ptBoxHeight); + drawDetailsIdAndPtBox(g, state, canShow, idForeColor, ptColors, x, y, w, ptBoxHeight); } public static Color[] fillColorBackground(Graphics g, List backColors, float x, float y, float w, float h) { @@ -1167,7 +1167,7 @@ public class CardImageRenderer { cardTextRenderer.drawText(g, CardDetailUtil.composeCardText(state, gameView, canShow), TEXT_FONT, Color.BLACK, x, y, w, h, y, h, true, Align.left, false); } - private static void drawDetailsIdAndPtBox(Graphics g, CardView card, CardStateView state, boolean canShow, Color idForeColor, Color[] colors, float x, float y, float w, float h) { + private static void drawDetailsIdAndPtBox(Graphics g, CardStateView state, boolean canShow, Color idForeColor, Color[] colors, float x, float y, float w, float h) { float idWidth = 0; if (canShow) { String idText = CardDetailUtil.formatCardId(state); @@ -1187,8 +1187,8 @@ public class CardImageRenderer { x += w - boxWidth; w = boxWidth; - fillColorBackground(g, colors, x, y, w, h); + fillColorBackground(g, state.isVehicle() ? VEHICLE_PTBOX_COLOR : state.isSpaceCraft() ? SPACECRAFT_PTBOX_COLOR : colors, x, y, w, h); g.drawRect(BORDER_THICKNESS, Color.BLACK, x, y, w, h); - cardTextRenderer.drawText(g, ptText, PT_FONT, Color.BLACK, x, y, w, h, y, h, false, Align.center, true); + cardTextRenderer.drawText(g, ptText, PT_FONT, state.isVehicle() || state.isSpaceCraft() ? Color.WHITE : Color.BLACK, x, y, w, h, y, h, false, Align.center, true); } } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 5fd00ed4565..90bc944573e 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -1422,12 +1422,13 @@ public class CardRenderer { g.drawOutlinedText(">" + card.getDamage() + "<", font, Color.RED, Color.WHITE, x, y - h + padding, w, h, false, Align.center, true); } - g.fillRect(color, x, y, w, h); + g.fillRect(details.isVehicle() ? CardImageRenderer.VEHICLE_PTBOX_COLOR[0] : + details.isSpaceCraft() ? CardImageRenderer.SPACECRAFT_PTBOX_COLOR[0] : color, x, y, w, h); g.drawRect(BORDER_THICKNESS, Color.BLACK, x, y, w, h); x += padding; for (int i = 0; i < pieces.size(); i++) { - g.drawText(pieces.get(i), font, Color.BLACK, x, y, w, h, false, Align.left, true); + g.drawText(pieces.get(i), font, details.isVehicle() || details.isSpaceCraft() ? Color.WHITE : Color.BLACK, x, y, w, h, false, Align.left, true); x += pieceWidths.get(i); } } From 4b5bf6fef42d183efa4a317cdf307af9eef40bd5 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:12:08 +0100 Subject: [PATCH 157/183] Update Edge of Eternities.txt --- forge-gui/res/editions/Edge of Eternities.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Edge of Eternities.txt b/forge-gui/res/editions/Edge of Eternities.txt index c7bc748a7c0..2ee627ffa00 100644 --- a/forge-gui/res/editions/Edge of Eternities.txt +++ b/forge-gui/res/editions/Edge of Eternities.txt @@ -461,7 +461,7 @@ Replace=0.04F BasicLand:fromSheet("EOE borderless")+ 399 R Emissary Escort @Lius Lasahido [special guests] -1 Warping Wall|SPG +1 Warping Wail|SPG 1 Nexus of Fate|SPG 1 Paradox of Haze|SPG 1 Magus of the Moon|SPG From 10fa3f7f225d460dd7ea389dec5d13f5b4006acb Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 11:38:41 +0200 Subject: [PATCH 158/183] Removing RemoveIntrinsicAbilities$ (#8188) --- forge-gui/res/cardsfolder/d/dream_thrush.txt | 2 +- forge-gui/res/cardsfolder/e/elsewhere_flask.txt | 2 +- forge-gui/res/cardsfolder/g/graceful_antelope.txt | 2 +- forge-gui/res/cardsfolder/g/grixis_illusionist.txt | 2 +- forge-gui/res/cardsfolder/l/lydari_druid.txt | 2 +- forge-gui/res/cardsfolder/m/moonbow_illusionist.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_compass.txt | 2 +- forge-gui/res/cardsfolder/n/nightcreep.txt | 2 +- forge-gui/res/cardsfolder/p/pixie_illusionist.txt | 2 +- forge-gui/res/cardsfolder/r/reef_shaman.txt | 2 +- forge-gui/res/cardsfolder/s/sea_snidd.txt | 2 +- forge-gui/res/cardsfolder/t/terraformer.txt | 2 +- forge-gui/res/cardsfolder/t/tideshaper_mystic.txt | 2 +- forge-gui/res/cardsfolder/u/unstable_frontier.txt | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dream_thrush.txt b/forge-gui/res/cardsfolder/d/dream_thrush.txt index c9adb426eca..0573eae31c7 100644 --- a/forge-gui/res/cardsfolder/d/dream_thrush.txt +++ b/forge-gui/res/cardsfolder/d/dream_thrush.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:1/1 K:Flying A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:Flying\n{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/e/elsewhere_flask.txt b/forge-gui/res/cardsfolder/e/elsewhere_flask.txt index 3c456ec72ee..f67f59dad24 100644 --- a/forge-gui/res/cardsfolder/e/elsewhere_flask.txt +++ b/forge-gui/res/cardsfolder/e/elsewhere_flask.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters, draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 A:AB$ ChooseType | Cost$ Sac<1/CARDNAME> | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Choose a basic land type. Each land you control becomes that type until end of turn. -SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:When Elsewhere Flask enters, draw a card.\nSacrifice Elsewhere Flask: Choose a basic land type. Each land you control becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/g/graceful_antelope.txt b/forge-gui/res/cardsfolder/g/graceful_antelope.txt index 89f174e0763..d4d2d783ab3 100644 --- a/forge-gui/res/cardsfolder/g/graceful_antelope.txt +++ b/forge-gui/res/cardsfolder/g/graceful_antelope.txt @@ -4,6 +4,6 @@ Types:Creature Antelope PT:1/4 K:Landwalk:Plains T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigAnimate | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have target land become a Plains until CARDNAME leaves the battlefield. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Duration$ UntilHostLeavesPlay | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Duration$ UntilHostLeavesPlay | Types$ Plains | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:Plainswalk (This creature can't be blocked as long as defending player controls a Plains.)\nWhenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/grixis_illusionist.txt b/forge-gui/res/cardsfolder/g/grixis_illusionist.txt index fe999dc847a..7a78856a1c0 100644 --- a/forge-gui/res/cardsfolder/g/grixis_illusionist.txt +++ b/forge-gui/res/cardsfolder/g/grixis_illusionist.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Human Wizard PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land you control becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{T}: Target land you control becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/l/lydari_druid.txt b/forge-gui/res/cardsfolder/l/lydari_druid.txt index 35e4bdbe50a..0522358c4ef 100644 --- a/forge-gui/res/cardsfolder/l/lydari_druid.txt +++ b/forge-gui/res/cardsfolder/l/lydari_druid.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters, for each land on the battlefield, choose a basic land type at random. Those lands become the land types chosen this way. (This effect lasts indefinitely.) SVar:TrigRepeat:DB$ RepeatEach | RepeatCards$ Land | RepeatSubAbility$ DBChooseLT | SubAbility$ DBCleanup SVar:DBChooseLT:DB$ ChooseType | Defined$ You | AtRandom$ True | Type$ Basic Land | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Duration$ Permanent +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ ChosenType | RemoveLandTypes$ True | Duration$ Permanent SVar:DBCleanup:DB$ Cleanup | ClearChosenType$ True Oracle:When Lydari Druid enters, for each land on the battlefield, choose a basic land type at random. Those lands become the land types chosen this way. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt b/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt index 08494e56a5a..8efa9921047 100644 --- a/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt +++ b/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:2/1 K:Flying A:AB$ ChooseType | Cost$ 2 Return<1/Land> | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:Flying\n{2}, Return a land you control to its owner's hand: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mystic_compass.txt b/forge-gui/res/cardsfolder/m/mystic_compass.txt index 4705f5b071e..ea9d7c0c0aa 100644 --- a/forge-gui/res/cardsfolder/m/mystic_compass.txt +++ b/forge-gui/res/cardsfolder/m/mystic_compass.txt @@ -2,6 +2,6 @@ Name:Mystic Compass ManaCost:2 Types:Artifact A:AB$ ChooseType | Cost$ 1 T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{1}, {T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/n/nightcreep.txt b/forge-gui/res/cardsfolder/n/nightcreep.txt index 0aea4202676..a585c10b5c6 100644 --- a/forge-gui/res/cardsfolder/n/nightcreep.txt +++ b/forge-gui/res/cardsfolder/n/nightcreep.txt @@ -2,6 +2,6 @@ Name:Nightcreep ManaCost:B B Types:Instant A:SP$ AnimateAll | ValidCards$ Creature | Colors$ Black | OverwriteColors$ True | SubAbility$ AnimateSwamp | SpellDescription$ Until end of turn, all creatures become black and all lands become Swamps. -SVar:AnimateSwamp:DB$ AnimateAll | ValidCards$ Land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:AnimateSwamp:DB$ AnimateAll | ValidCards$ Land | Types$ Swamp | RemoveLandTypes$ True AI:RemoveDeck:Random Oracle:Until end of turn, all creatures become black and all lands become Swamps. diff --git a/forge-gui/res/cardsfolder/p/pixie_illusionist.txt b/forge-gui/res/cardsfolder/p/pixie_illusionist.txt index b059462d39e..1f80d33e178 100644 --- a/forge-gui/res/cardsfolder/p/pixie_illusionist.txt +++ b/forge-gui/res/cardsfolder/p/pixie_illusionist.txt @@ -6,7 +6,7 @@ K:Kicker:3 G K:etbCounter:P1P1:2:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters with two +1/+1 counters on it. K:Flying A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land you control becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True SVar:WasKicked:Count$Kicked.1.0 DeckHas:Ability$Counters DeckHints:Color$Green diff --git a/forge-gui/res/cardsfolder/r/reef_shaman.txt b/forge-gui/res/cardsfolder/r/reef_shaman.txt index 3084f1043a8..a8804887136 100644 --- a/forge-gui/res/cardsfolder/r/reef_shaman.txt +++ b/forge-gui/res/cardsfolder/r/reef_shaman.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Merfolk Shaman PT:0/2 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sea_snidd.txt b/forge-gui/res/cardsfolder/s/sea_snidd.txt index 6223a732429..addf959bc39 100644 --- a/forge-gui/res/cardsfolder/s/sea_snidd.txt +++ b/forge-gui/res/cardsfolder/s/sea_snidd.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Creature Beast PT:3/3 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/t/terraformer.txt b/forge-gui/res/cardsfolder/t/terraformer.txt index 10b5eaaff53..a30f5a86875 100644 --- a/forge-gui/res/cardsfolder/t/terraformer.txt +++ b/forge-gui/res/cardsfolder/t/terraformer.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:2/2 A:AB$ ChooseType | Cost$ 1 | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Choose a basic land type. Each land you control becomes that type until end of turn. -SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{1}: Choose a basic land type. Each land you control becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt b/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt index 87523721595..9a593503b65 100644 --- a/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt +++ b/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Merfolk Wizard PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | PlayerTurn$ True | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. Activate only during your turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. Activate only during your turn. diff --git a/forge-gui/res/cardsfolder/u/unstable_frontier.txt b/forge-gui/res/cardsfolder/u/unstable_frontier.txt index 25a7952468a..f4c0713cdaa 100644 --- a/forge-gui/res/cardsfolder/u/unstable_frontier.txt +++ b/forge-gui/res/cardsfolder/u/unstable_frontier.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land you control becomes the basic land type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True AI:RemoveDeck:All Oracle:{T}: Add {C}.\n{T}: Target land you control becomes the basic land type of your choice until end of turn. From bd6ea12cc6397a5fd4818382b1728f093dfe1609 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 24 Jul 2025 10:10:47 +0000 Subject: [PATCH 159/183] Update coercive_recruiter.txt --- forge-gui/res/cardsfolder/c/coercive_recruiter.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/coercive_recruiter.txt b/forge-gui/res/cardsfolder/c/coercive_recruiter.txt index 52e7273cbf0..e8012efe59a 100644 --- a/forge-gui/res/cardsfolder/c/coercive_recruiter.txt +++ b/forge-gui/res/cardsfolder/c/coercive_recruiter.txt @@ -4,7 +4,7 @@ Types:Creature Orc Pirate PT:4/3 T:Mode$ ChangesZone | ValidCard$ Card.Self,Pirate.Other+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ Whenever CARDNAME or another Pirate you control enters, gain control of target creature until end of turn. Untap that creature. Until end of turn, it gains haste and becomes a Pirate in addition to its other types. SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Pirate | UntilEndOfTurn$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Pirate SVar:PlayMain1:ALWAYS SVar:NeedsToPlay:Creature.OppCtrl+powerGE5 DeckHints:Ability$Sacrifice From 34e31e7e29a40bd194dee11f3a6a5417cd8df874 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:34:54 +0200 Subject: [PATCH 160/183] 11 SPM/SPE cards (July 24th, Batch 2) (#8180) --- forge-gui/res/cardsfolder/b/barret_wallace.txt | 2 +- forge-gui/res/cardsfolder/upcoming/double_trouble.txt | 5 +++++ .../res/cardsfolder/upcoming/eerie_gravestone.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/flying_octobot.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/future_flight.txt | 9 +++++++++ .../cardsfolder/upcoming/ghost_spider_gwen_stacy.txt | 9 +++++++++ .../cardsfolder/upcoming/grendel_spawn_of_knull.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt | 7 +++++++ .../res/cardsfolder/upcoming/guy_in_the_chair.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/kapow.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/kravens_cats.txt | 6 ++++++ .../res/cardsfolder/upcoming/lethal_protection.txt | 6 ++++++ 12 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/double_trouble.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/eerie_gravestone.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flying_octobot.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/future_flight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ghost_spider_gwen_stacy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grendel_spawn_of_knull.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kapow.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kravens_cats.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lethal_protection.txt diff --git a/forge-gui/res/cardsfolder/b/barret_wallace.txt b/forge-gui/res/cardsfolder/b/barret_wallace.txt index 74cb10355e0..2b2e0e8c83d 100644 --- a/forge-gui/res/cardsfolder/b/barret_wallace.txt +++ b/forge-gui/res/cardsfolder/b/barret_wallace.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Rebel PT:4/4 K:Reach T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals damage equal to the number of equipped creatures you control to defending player. -SVar:TrigDamage:DB$ DealDamage | Defined$ Opponent | NumDmg$ X +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ X SVar:X:Count$Valid Creature.YouCtrl+equipped DeckNeeds:Type$Equipment Oracle:Reach\nWhenever Barret Wallace attacks, it deals damage equal to the number of equipped creatures you control to defending player. diff --git a/forge-gui/res/cardsfolder/upcoming/double_trouble.txt b/forge-gui/res/cardsfolder/upcoming/double_trouble.txt new file mode 100644 index 00000000000..a495e98293e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/double_trouble.txt @@ -0,0 +1,5 @@ +Name:Double Trouble +ManaCost:4 R +Types:Instant +A:SP$ Pump | Defined$ Valid Creature.YouCtrl | NumAtt$ Double | SpellDescription$ Double the power of each creature you control until end of turn. +Oracle:Double the power of each creature you control until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/eerie_gravestone.txt b/forge-gui/res/cardsfolder/upcoming/eerie_gravestone.txt new file mode 100644 index 00000000000..bb0d7df62cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eerie_gravestone.txt @@ -0,0 +1,10 @@ +Name:Eerie Gravestone +ManaCost:2 +Types:Artifact +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDraw | TriggerDescription$ When this artifact enters, draw a card. +SVar:TrigDraw:DB$ Draw +A:AB$ Mill | Cost$ 1 B Sac<1/CARDNAME> | NumCards$ 4 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Mill four cards. You may put a creature card from among them into your hand. (To mill four cards, put the top four cards of your library into your graveyard.) +SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ Graveyard,Exile | Destination$ Hand | ChangeType$ Creature.IsRemembered | SelectPrompt$ You may select a creature card | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Mill +Oracle:When this artifact enters, draw a card.\n{1}{B}, Sacrifice this artifact: Mill four cards. You may put a creature card from among them into your hand. (To mill four cards, put the top four cards of your library into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/flying_octobot.txt b/forge-gui/res/cardsfolder/upcoming/flying_octobot.txt new file mode 100644 index 00000000000..faac33f1329 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flying_octobot.txt @@ -0,0 +1,10 @@ +Name:Flying Octobot +ManaCost:1 U +Types:Artifact Creature Robot Villain +PT:1/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Villain.Other+YouCtrl | ActivationLimit$ 1 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another Villain you control enters, put a +1/+1 counter on this creature. This ability triggers only once each turn. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Villain +DeckHas:Ability$Counters +Oracle:Flying\nWhenever another Villain you control enters, put a +1/+1 counter on this creature. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/future_flight.txt b/forge-gui/res/cardsfolder/upcoming/future_flight.txt new file mode 100644 index 00000000000..fa49d8e5dfa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/future_flight.txt @@ -0,0 +1,9 @@ +Name:Future Flight +ManaCost:2 U U +Types:Enchantment Aura +K:Enchant:Creature +SVar:AttachAILogic:Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this Aura enters, draw two cards. +SVar:TrigDraw:DB$ Draw | NumCards$ 2 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddKeyword$ Flying | Description$ Enchanted creature gets +2/+0 and has flying. (It can't be blocked except by creatures with flying or reach.) +Oracle:Enchant creature\nWhen this Aura enters, draw two cards.\nEnchanted creature gets +2/+0 and has flying. (It can't be blocked except by creatures with flying or reach.) diff --git a/forge-gui/res/cardsfolder/upcoming/ghost_spider_gwen_stacy.txt b/forge-gui/res/cardsfolder/upcoming/ghost_spider_gwen_stacy.txt new file mode 100644 index 00000000000..ef6f3906888 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ghost_spider_gwen_stacy.txt @@ -0,0 +1,9 @@ +Name:Ghost-Spider, Gwen Stacy +ManaCost:3 R R +Types:Legendary Creature Spider Human Hero +PT:4/4 +K:Menace +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever NICKNAME attacks, she deals X damage to defending player, where X is the number of attacking creatures. +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ X +SVar:X:Count$Valid Creature.attacking +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhenever Ghost-Spider attacks, she deals X damage to defending player, where X is the number of attacking creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/grendel_spawn_of_knull.txt b/forge-gui/res/cardsfolder/upcoming/grendel_spawn_of_knull.txt new file mode 100644 index 00000000000..7a210ea6f23 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grendel_spawn_of_knull.txt @@ -0,0 +1,7 @@ +Name:Grendel, Spawn of Knull +ManaCost:3 B +Types:Legendary Creature Symbiote Dragon Villain +PT:3/3 +K:Flying +K:Deathtouch +Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nDeathtouch (Any amount of damage this deals to a creature is enough to destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt b/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt new file mode 100644 index 00000000000..716a010cacb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt @@ -0,0 +1,7 @@ +Name:Grow Extra Arms +ManaCost:1 G +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | ValidTarget$ Spider | Description$ This spell costs {1} less to cast if it targets a Spider. +A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. +DeckHints:Type$Spider +Oracle:This spell costs {1} less to cast if it targets a Spider.\nTarget creature gets +4/+4 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt b/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt new file mode 100644 index 00000000000..46ecf3cb706 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt @@ -0,0 +1,7 @@ +Name:Guy in the Chair +ManaCost:2 G +Types:Creature Human Advisor +PT:2/3 +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +A:AB$ PutCounter | PrecostDesc$ Web Support — | Cost$ 2 G T | ValidTgts$ Spider | TgtPrompt$ Select target Spider | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target Spider. Activate only as a sorcery. +Oracle:{T}: Add one mana of any color.\nWeb Support — {2}{G}, {T}: Put a +1/+1 counter on target Spider. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/kapow.txt b/forge-gui/res/cardsfolder/upcoming/kapow.txt new file mode 100644 index 00000000000..89c25211d74 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kapow.txt @@ -0,0 +1,6 @@ +Name:Kapow! +ManaCost:2 G +Types:Sorcery +A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBFight | SpellDescription$ Put a +1/+1 counter on target creature you control. It fights target creature an opponent controls. (Each deals damage equal to its power to the other.) +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls +Oracle:Put a +1/+1 counter on target creature you control. It fights target creature an opponent controls. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/upcoming/kravens_cats.txt b/forge-gui/res/cardsfolder/upcoming/kravens_cats.txt new file mode 100644 index 00000000000..735d82200cc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kravens_cats.txt @@ -0,0 +1,6 @@ +Name:Kraven's Cats +ManaCost:1 G +Types:Creature Cat Villain +PT:2/2 +A:AB$ Pump | Cost$ 2 G | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ This creature gets +2/+2 until end of turn. Activate only once each turn. +Oracle:{2}{G}: This creature gets +2/+2 until end of turn. Activate only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lethal_protection.txt b/forge-gui/res/cardsfolder/upcoming/lethal_protection.txt new file mode 100644 index 00000000000..363c4f2ea95 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lethal_protection.txt @@ -0,0 +1,6 @@ +Name:Lethal Protection +ManaCost:3 B +Types:Sorcery +A:SP$ Destroy | ValidTgts$ Creature | SubAbility$ DBReturn | SpellDescription$ Destroy target creature. Return up to one target creature card from your graveyard to your hand. +SVar:DBReturn:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose up to one target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Hand +Oracle:Destroy target creature. Return up to one target creature card from your graveyard to your hand. From 23b0fa09d99927f678dd3f46a08f953148c59420 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:36:18 +0200 Subject: [PATCH 161/183] 10 SPM/SPE cards (July 24th, Batch 3) (#8181) --- forge-gui/res/cardsfolder/a/aurochs.txt | 2 ++ forge-gui/res/cardsfolder/a/aurochs_herd.txt | 2 ++ forge-gui/res/cardsfolder/b/bull_aurochs.txt | 2 ++ forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/lurking_lizards.txt | 10 ++++++++++ .../upcoming/lyla_holographic_assistant.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/masked_meower.txt | 9 +++++++++ .../res/cardsfolder/upcoming/mechanical_mobster.txt | 8 ++++++++ .../res/cardsfolder/upcoming/merciless_enforcers.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/mj_rising_star.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/oscorp_research_team.txt | 6 ++++++ .../cardsfolder/upcoming/prowler_misguided_mentor.txt | 9 +++++++++ .../res/cardsfolder/upcoming/rampaging_classmate.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/risky_research.txt | 8 ++++++++ 14 files changed, 91 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/lurking_lizards.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lyla_holographic_assistant.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/masked_meower.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/merciless_enforcers.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mj_rising_star.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/oscorp_research_team.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/prowler_misguided_mentor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rampaging_classmate.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/risky_research.txt diff --git a/forge-gui/res/cardsfolder/a/aurochs.txt b/forge-gui/res/cardsfolder/a/aurochs.txt index 42c5e2ce355..37288557a23 100644 --- a/forge-gui/res/cardsfolder/a/aurochs.txt +++ b/forge-gui/res/cardsfolder/a/aurochs.txt @@ -6,4 +6,6 @@ K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X SVar:X:Count$Valid Aurochs.attacking+Other +SVar:HasAttackEffect:TRUE +DeckHints:Type$Aurochs Oracle:Trample\nWhenever Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. diff --git a/forge-gui/res/cardsfolder/a/aurochs_herd.txt b/forge-gui/res/cardsfolder/a/aurochs_herd.txt index 14f497b34dd..79bd0e385cb 100644 --- a/forge-gui/res/cardsfolder/a/aurochs_herd.txt +++ b/forge-gui/res/cardsfolder/a/aurochs_herd.txt @@ -8,4 +8,6 @@ SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeTyp T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X SVar:X:Count$Valid Aurochs.attacking+Other +SVar:HasAttackEffect:TRUE +DeckHints:Type$Aurochs Oracle:Trample\nWhen Aurochs Herd enters, you may search your library for an Aurochs card, reveal it, put it into your hand, then shuffle.\nWhenever Aurochs Herd attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. diff --git a/forge-gui/res/cardsfolder/b/bull_aurochs.txt b/forge-gui/res/cardsfolder/b/bull_aurochs.txt index ab03e708c5d..90fadbe60e7 100644 --- a/forge-gui/res/cardsfolder/b/bull_aurochs.txt +++ b/forge-gui/res/cardsfolder/b/bull_aurochs.txt @@ -6,4 +6,6 @@ K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X SVar:X:Count$Valid Aurochs.attacking+Other +SVar:HasAttackEffect:TRUE +DeckHints:Type$Aurochs Oracle:Trample\nWhenever Bull Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. diff --git a/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt b/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt index 86a31b03cf4..a9d4d6cf456 100644 --- a/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt +++ b/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt @@ -10,4 +10,6 @@ A:AB$ Pump | Cost$ 2 S | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:DBMustBlock:DB$ MustBlock | DefinedAttacker$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to block AI:RemoveDeck:All AI:RemoveDeck:Random +SVar:HasAttackEffect:TRUE +DeckHints:Type$Aurochs Oracle:Trample\nWhenever Rimehorn Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs.\n{2}{S}: Target creature blocks target creature this turn if able. ({S} can be paid with one mana from a snow source.) diff --git a/forge-gui/res/cardsfolder/upcoming/lurking_lizards.txt b/forge-gui/res/cardsfolder/upcoming/lurking_lizards.txt new file mode 100644 index 00000000000..bb9319c86a8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lurking_lizards.txt @@ -0,0 +1,10 @@ +Name:Lurking Lizards +ManaCost:1 G +Types:Creature Lizard Villain +PT:1/3 +K:Trample +T:Mode$ SpellCast | ValidCard$ Card.cmcGE4 | ValidActivatingPlayer$ You | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with mana value 4 or greater, put a +1/+1 counter on this creature. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Permanent.cmcGE4 +DeckHas:Ability$Counters +Oracle:Trample\nWhenever you cast a spell with mana value 4 or greater, put a +1/+1 counter on this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/lyla_holographic_assistant.txt b/forge-gui/res/cardsfolder/upcoming/lyla_holographic_assistant.txt new file mode 100644 index 00000000000..1545e9360cf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lyla_holographic_assistant.txt @@ -0,0 +1,7 @@ +Name:Lyla, Holographic Assistant +ManaCost:3 U +Types:Legendary Artifact Creature Illusion Advisor +PT:2/2 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw a card, put a +1/+1 counter on target creature. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 +Oracle:Whenever you draw a card, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/masked_meower.txt b/forge-gui/res/cardsfolder/upcoming/masked_meower.txt new file mode 100644 index 00000000000..69d48c22247 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/masked_meower.txt @@ -0,0 +1,9 @@ +Name:Masked Meower +ManaCost:R +Types:Creature Spider Cat Hero +PT:1/1 +K:Haste +A:AB$ Draw | Cost$ Discard<1/Card> Sac<1/CARDNAME/this creature> | SpellDescription$ Draw a card. +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium +Oracle:Haste\nDiscard a card, Sacrifice this creature: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt b/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt new file mode 100644 index 00000000000..c826b440954 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt @@ -0,0 +1,8 @@ +Name:Mechanical Mobster +ManaCost:3 +Types:Artifact Creature Human Robot Villain +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature enters, exile up to one target card from a graveyard. Target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBConnive | TgtPrompt$ Select target card in a graveyard to exile +SVar:DBConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +Oracle:When this creature enters, exile up to one target card from a graveyard. Target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/merciless_enforcers.txt b/forge-gui/res/cardsfolder/upcoming/merciless_enforcers.txt new file mode 100644 index 00000000000..f79cdf5370a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/merciless_enforcers.txt @@ -0,0 +1,7 @@ +Name:Merciless Enforcers +ManaCost:1 B +Types:Creature Human Mercenary Villain +PT:2/1 +K:Lifelink +A:AB$ DealDamage | Defined$ Opponent | NumDmg$ 1 | Cost$ 3 B | SpellDescription$ This creature deals 1 damage to each opponent. +Oracle:Lifelink\n{3}{B}: This creature deals 1 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/mj_rising_star.txt b/forge-gui/res/cardsfolder/upcoming/mj_rising_star.txt new file mode 100644 index 00000000000..1c9c2e8795f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mj_rising_star.txt @@ -0,0 +1,10 @@ +Name:MJ, Rising Star +ManaCost:2 W +Types:Legendary Creature Human Performer +PT:2/3 +K:Vigilance +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on NICKNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +DeckHints:Ability$LifeGain +Oracle:Vigilance (Attacking doesn't cause this creature to tap.)\nWhenever you gain life, put a +1/+1 counter on MJ. diff --git a/forge-gui/res/cardsfolder/upcoming/oscorp_research_team.txt b/forge-gui/res/cardsfolder/upcoming/oscorp_research_team.txt new file mode 100644 index 00000000000..ede691b4fd3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oscorp_research_team.txt @@ -0,0 +1,6 @@ +Name:Oscorp Research Team +ManaCost:3 U +Types:Creature Human Scientist +PT:1/5 +A:AB$ Draw | Cost$ 6 U | NumCards$ 2 | SpellDescription$ Draw a card. +Oracle:{6}{U}: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/prowler_misguided_mentor.txt b/forge-gui/res/cardsfolder/upcoming/prowler_misguided_mentor.txt new file mode 100644 index 00000000000..e84ee1936e3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prowler_misguided_mentor.txt @@ -0,0 +1,9 @@ +Name:Prowler, Misguided Mentor +ManaCost:2 G +Types:Legendary Creature Human Rogue Villain +PT:3/3 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ NICKNAME can't be blocked by creatures with power 2 or less. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigPutCounter | CombatDamage$ True | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, put a +1/+1 counter on another target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Prowler can't be blocked by creatures with power 2 or less.\nWhenever Prowler deals combat damage to a player, put a +1/+1 counter on another target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_classmate.txt b/forge-gui/res/cardsfolder/upcoming/rampaging_classmate.txt new file mode 100644 index 00000000000..fd88a8e0fd4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampaging_classmate.txt @@ -0,0 +1,9 @@ +Name:Rampaging Classmate +ManaCost:2 R +Types:Creature Lizard Berserker +PT:3/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature attacks, it gets +1/+0 until end of turn for each other attacking creature. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X +SVar:X:Count$Valid Creature.attacking+Other +SVar:HasAttackEffect:TRUE +Oracle:Whenever this creature attacks, it gets +1/+0 until end of turn for each other attacking creature. diff --git a/forge-gui/res/cardsfolder/upcoming/risky_research.txt b/forge-gui/res/cardsfolder/upcoming/risky_research.txt new file mode 100644 index 00000000000..bc50d477f6c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/risky_research.txt @@ -0,0 +1,8 @@ +Name:Risky Research +ManaCost:2 B +Types:Sorcery +A:SP$ Surveil | Amount$ 2 | SubAbility$ DBDraw | SpellDescription$ Surveil 2, then draw two cards. You lose 2 life. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 +DeckHas:Ability$Surveil|Graveyard +Oracle:Surveil 2, then draw two cards. You lose 2 life. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) From 15e955576f01f99f7fc8e7c4f2e964172890a031 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:42:08 +0200 Subject: [PATCH 162/183] 10 SPM/SPE cards (July 24th, Batch 1) (#8179) --- forge-gui/res/cardsfolder/e/endless_evil.txt | 4 ++-- .../res/cardsfolder/upcoming/alchemax_slayer_bots.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/amateur_hero.txt | 8 ++++++++ .../res/cardsfolder/upcoming/amazing_alliance.txt | 11 +++++++++++ forge-gui/res/cardsfolder/upcoming/angry_rabble.txt | 11 +++++++++++ forge-gui/res/cardsfolder/upcoming/aunt_may.txt | 10 ++++++++++ .../cardsfolder/upcoming/beetle_legacy_criminal.txt | 8 ++++++++ .../cardsfolder/upcoming/daily_bugle_reporters.txt | 10 ++++++++++ .../upcoming/doc_ock_sinister_scientist.txt | 8 ++++++++ .../res/cardsfolder/upcoming/doc_ocks_henchmen.txt | 10 ++++++++++ .../cardsfolder/upcoming/spider_rex_daring_dino.txt | 8 ++++++++ 11 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/amateur_hero.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/amazing_alliance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/angry_rabble.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/aunt_may.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/doc_ock_sinister_scientist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/doc_ocks_henchmen.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_rex_daring_dino.txt diff --git a/forge-gui/res/cardsfolder/e/endless_evil.txt b/forge-gui/res/cardsfolder/e/endless_evil.txt index f4d1fffd3cb..08e6004b4a4 100644 --- a/forge-gui/res/cardsfolder/e/endless_evil.txt +++ b/forge-gui/res/cardsfolder/e/endless_evil.txt @@ -5,8 +5,8 @@ K:Enchant:Creature.YouCtrl:creature you control SVar:AttachAILogic:HighestEvaluation T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a 1/1. SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | SetPower$ 1 | SetToughness$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When enchanted creature dies, if that creature was a Horror, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self | ConditionDefined$ TriggeredCardLKICopy | ConditionPresent$ Creature.Horror | ConditionCompare$ EQ1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EnchantedBy+Horror | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When enchanted creature dies, if that creature was a Horror, return CARDNAME to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self DeckHints:Type$Horror DeckHas:Ability$Token Oracle:Enchant creature you control\nAt the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a 1/1.\nWhen enchanted creature dies, if that creature was a Horror, return Endless Evil to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt new file mode 100644 index 00000000000..59db5293d54 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt @@ -0,0 +1,8 @@ +Name:Alchemax Slayer-Bots +ManaCost:2 U +Types:Artifact Creature Robot Villain +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 +Oracle:When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/cardsfolder/upcoming/amateur_hero.txt b/forge-gui/res/cardsfolder/upcoming/amateur_hero.txt new file mode 100644 index 00000000000..53755f4d911 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/amateur_hero.txt @@ -0,0 +1,8 @@ +Name:Amateur Hero +ManaCost:2 W +Types:Creature Human Hero +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters, you gain 2 life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 2 +DeckHas:Ability$LifeGain +Oracle:When this creature enters, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/amazing_alliance.txt b/forge-gui/res/cardsfolder/upcoming/amazing_alliance.txt new file mode 100644 index 00000000000..02a660d2bd0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/amazing_alliance.txt @@ -0,0 +1,11 @@ +Name:Amazing Alliance +ManaCost:1 W W +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. +T:Mode$ AttackersDeclared | ValidAttackers$ Creature.Legendary+YouCtrl | Execute$ TrigGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack with one or more legendary creatures, you gain that much life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ X +SVar:X:TriggerObjectsAttackers$Amount +SVar:PlayMain1:TRUE +DeckHas:Ability$LifeGain +DeckHints:Type$Legendary +Oracle:Creatures you control get +1/+1.\nWhenever you attack with one or more legendary creatures, you gain that much life. diff --git a/forge-gui/res/cardsfolder/upcoming/angry_rabble.txt b/forge-gui/res/cardsfolder/upcoming/angry_rabble.txt new file mode 100644 index 00000000000..7ef43d32b50 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/angry_rabble.txt @@ -0,0 +1,11 @@ +Name:Angry Rabble +ManaCost:1 R +Types:Creature Human Citizen +PT:2/2 +K:Trample +T:Mode$ SpellCast | ValidCard$ Card.cmcGE4 | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with mana value 4 or greater, this creature deals 1 damage to each opponent. +SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 +A:AB$ PutCounter | Cost$ 5 R | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SorcerySpeed$ True | SpellDescription$ Put two +1/+1 counters on this creature. Activate only as a sorcery. +SVar:BuffedBy:Card.cmcGE4 +DeckHas:Ability$Counters +Oracle:Trample\nWhenever you cast a spell with mana value 4 or greater, this creature deals 1 damage to each opponent.\n{5}{R}: Put two +1/+1 counters on this creature. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/aunt_may.txt b/forge-gui/res/cardsfolder/upcoming/aunt_may.txt new file mode 100644 index 00000000000..006edacdbf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aunt_may.txt @@ -0,0 +1,10 @@ +Name:Aunt May +ManaCost:W +Types:Legendary Creature Human Citizen +PT:0/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature you control enters, you gain 1 life. If it’s a Spider, put a +1/+1 counter on it. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy.Spider | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$LifeGain|Counters +DeckHints:Type$Spider +Oracle:Whenever another creature you control enters, you gain 1 life. If it's a Spider, put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt b/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt new file mode 100644 index 00000000000..efdc7f76610 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt @@ -0,0 +1,8 @@ +Name:Beetle, Legacy Criminal +ManaCost:3 U +Types:Legendary Creature Human Rogue Villain +PT:3/3 +K:Flying +A:AB$ PutCounter | Cost$ 1 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature. It gains flying until end of turn. Activate only as a sorcery. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Flying +Oracle:Flying\n{1}{U}, Exile this card from your graveyard: Put a +1/+1 counter on target creature. It gains flying until end of turn. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt b/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt new file mode 100644 index 00000000000..9ca22b03561 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt @@ -0,0 +1,10 @@ +Name:Daily Bugle Reporters +ManaCost:3 W +Types:Creature Human Citizen +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When this creature enters, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBPutCounter,DBReturn +SVar:DBPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Puff Piece — Put a +1/+1 counter on each of up to two target creatures. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouOwn+cmcLE2 | SpellDescription$ Investigative Journalism — Return target creature card with mana value 2 or less from your graveyard to your hand. +DeckHas:Ability$Counters +Oracle:When this creature enters, choose one —\n• Puff Piece — Put a +1/+1 counter on each of up to two target creatures.\n• Investigative Journalism — Return target creature card with mana value 2 or less from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/doc_ock_sinister_scientist.txt b/forge-gui/res/cardsfolder/upcoming/doc_ock_sinister_scientist.txt new file mode 100644 index 00000000000..d126e46de1f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/doc_ock_sinister_scientist.txt @@ -0,0 +1,8 @@ +Name:Doc Ock, Sinister Scientist +ManaCost:4 U +Types:Legendary Creature Human Scientist Villain +PT:4/5 +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 8 | SetToughness$ 8 | IsPresent$ Card.YouOwn | PresentZone$ Graveyard | PresentCompare$ GE8 | Description$ As long as there are eight or more cards in your graveyard, NICKNAME has base power and toughness 8/8. +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | IsPresent$ Villain.YouCtrl+Other | Description$ As long as you control another Villain, NICKNAME has hexproof. (He can't be the target of spells or abilities your opponents control.) +DeckHints:Ability$Sacrifice|Discard|Mill|Dredge|Graveyard & Type$Villain +Oracle:As long as there are eight or more cards in your graveyard, Doc Ock has base power and toughness 8/8.\nAs long as you control another Villain, Doc Ock has hexproof. (He can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/doc_ocks_henchmen.txt b/forge-gui/res/cardsfolder/upcoming/doc_ocks_henchmen.txt new file mode 100644 index 00000000000..5be9fe77435 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/doc_ocks_henchmen.txt @@ -0,0 +1,10 @@ +Name:Doc Ock's Henchmen +ManaCost:2 U +Types:Creature Human Villain +PT:2/1 +K:Flash +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature attacks, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +SVar:HasAttackEffect:True +DeckHas:Ability$Counters|Discard +Oracle:Flash\nWhenever this creature attacks, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/spider_rex_daring_dino.txt b/forge-gui/res/cardsfolder/upcoming/spider_rex_daring_dino.txt new file mode 100644 index 00000000000..fcb3ff7ba6f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_rex_daring_dino.txt @@ -0,0 +1,8 @@ +Name:Spider-Rex, Daring Dino +ManaCost:4 G G +Types:Legendary Creature Spider Dinosaur Hero +PT:6/6 +K:Reach +K:Trample +K:Ward:2 +Oracle:Reach, trample\nWard {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.) From 82f5e177057e5a5c04280c6dd14b55fc85ff8fc1 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:43:27 +0200 Subject: [PATCH 163/183] 10 SPM/SPE cards (July 24th, Batch 4) (#8182) --- forge-gui/res/cardsfolder/c/collision_course.txt | 2 +- .../res/cardsfolder/upcoming/romantic_rendezvous.txt | 6 ++++++ .../cardsfolder/upcoming/scorpion_seething_striker.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/scorpions_sting.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/scout_the_city.txt | 10 ++++++++++ .../cardsfolder/upcoming/selfless_police_captain.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/shocker_unshakable.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/spectacular_tactics.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/spider_bot.txt | 8 ++++++++ .../cardsfolder/upcoming/spider_byte_web_warden.txt | 7 +++++++ .../upcoming/spider_man_2099_miguel_ohara.txt | 9 +++++++++ 11 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/romantic_rendezvous.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scorpion_seething_striker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scorpions_sting.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scout_the_city.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/selfless_police_captain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spectacular_tactics.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_bot.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_byte_web_warden.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_man_2099_miguel_ohara.txt diff --git a/forge-gui/res/cardsfolder/c/collision_course.txt b/forge-gui/res/cardsfolder/c/collision_course.txt index fc5ac2653ac..a897ae87913 100644 --- a/forge-gui/res/cardsfolder/c/collision_course.txt +++ b/forge-gui/res/cardsfolder/c/collision_course.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Sorcery A:SP$ Charm | Choices$ DBDmg,DBDestroy SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature, where X is the number of permanents you control that are creatures and/or Vehicles. -SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Destroy target artifact. +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:X:Count$Valid Creature.YouCtrl,Vehicle.YouCtrl DeckHints:Type$Vehicle Oracle:Choose one —\n• Collision Course deals X damage to target creature, where X is the number of permanents you control that are creatures and/or Vehicles.\n• Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/romantic_rendezvous.txt b/forge-gui/res/cardsfolder/upcoming/romantic_rendezvous.txt new file mode 100644 index 00000000000..d9987465a16 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/romantic_rendezvous.txt @@ -0,0 +1,6 @@ +Name:Romantic Rendezvous +ManaCost:1 R +Types:Sorcery +A:SP$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Discard a card, then draw two cards. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 +Oracle:Discard a card, then draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/scorpion_seething_striker.txt b/forge-gui/res/cardsfolder/upcoming/scorpion_seething_striker.txt new file mode 100644 index 00000000000..1941870ba01 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scorpion_seething_striker.txt @@ -0,0 +1,10 @@ +Name:Scorpion, Seething Striker +ManaCost:3 B +Types:Legendary Creature Scorpion Human Villain +PT:3/3 +K:Deathtouch +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | Execute$ TrigConnive | TriggerDescription$ At the beginning of your end step, if a creature died this turn, target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:TrigConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:Morbid:Count$Morbid.1.0 +DeckHas:Ability$Counters +Oracle:Deathtouch\nAt the beginning of your end step, if a creature died this turn, target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/scorpions_sting.txt b/forge-gui/res/cardsfolder/upcoming/scorpions_sting.txt new file mode 100644 index 00000000000..81bd52938df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scorpions_sting.txt @@ -0,0 +1,5 @@ +Name:Scorpion's Sting +ManaCost:1 B +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. +Oracle:Target creature gets -3/-3 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/scout_the_city.txt b/forge-gui/res/cardsfolder/upcoming/scout_the_city.txt new file mode 100644 index 00000000000..5a3f7bcf04d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scout_the_city.txt @@ -0,0 +1,10 @@ +Name:Scout the City +ManaCost:1 G +Types:Sorcery +A:SP$ Charm | Choices$ DBMill,DBDestroy +SVar:DBMill:DB$ Mill | NumCards$ 3 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Look Around — Mill three cards. You may put a permanent card from among them into your hand. You gain 3 life. (To mill three cards, put the top three cards of your library into your graveyard.) +SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ Graveyard,Exile | Destination$ Hand | ChangeType$ Permanent.IsRemembered | SelectPrompt$ You may select a permanent card | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Bring Down — Destroy target creature with flying. +Oracle:Choose one —\n• Look Around — Mill three cards. You may put a permanent card from among them into your hand. You gain 3 life. (To mill three cards, put the top three cards of your library into your graveyard.)\n• Bring Down — Destroy target creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/selfless_police_captain.txt b/forge-gui/res/cardsfolder/upcoming/selfless_police_captain.txt new file mode 100644 index 00000000000..22c98a5135b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/selfless_police_captain.txt @@ -0,0 +1,10 @@ +Name:Selfless Police Captain +ManaCost:1 W +Types:Creature Human Detective +PT:1/1 +K:etbCounter:P1P1:1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature leaves the battlefield, put its +1/+1 counters on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ X +SVar:X:Count$CardCounters.P1P1 +DeckHas:Ability$Counters +Oracle:This creature enters with a +1/+1 counter on it.\nWhen this creature leaves the battlefield, put its +1/+1 counters on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt b/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt new file mode 100644 index 00000000000..5488255b066 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt @@ -0,0 +1,10 @@ +Name:Shocker, Unshakable +ManaCost:4 R R +Types:Legendary Creature Human Rogue Villain +PT:5/5 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ First Strike| Condition$ PlayerTurn | Description$ During your turn, NICKNAME has first strike. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Vibro-Shock Gauntlets — When NICKNAME enters, he deals 2 damage to target creature and 2 damage to that creature's controller. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | DamageMap$ True | SubAbility$ DBDamage +SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 | SubAbility$ DBDamageResolve +SVar:DBDamageResolve:DB$ DamageResolve +Oracle:During your turn, Shocker has first strike.\nVibro-Shock Gauntlets — When Shocker enters, he deals 2 damage to target creature and 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/upcoming/spectacular_tactics.txt b/forge-gui/res/cardsfolder/upcoming/spectacular_tactics.txt new file mode 100644 index 00000000000..2aab74a53cb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spectacular_tactics.txt @@ -0,0 +1,8 @@ +Name:Spectacular Tactics +ManaCost:1 W +Types:Instant +A:SP$ Charm | Choices$ DBPutCounter,DBDestroy +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | CounterType$ P1P1 | TgtPrompt$ Select target creature you control | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn. +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ Hexproof +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | SpellDescription$ Destroy target creature with power 4 or greater. +Oracle:Choose one —\n• Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn.\n• Destroy target creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_bot.txt b/forge-gui/res/cardsfolder/upcoming/spider_bot.txt new file mode 100644 index 00000000000..610fcc1f4c9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_bot.txt @@ -0,0 +1,8 @@ +Name:Spider-Bot +ManaCost:2 +Types:Artifact Creature Spider Robot Scout +PT:2/1 +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Land.Basic | ChangeNum$ 1 | ShuffleNonMandatory$ True +Oracle:Reach\nWhen this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_byte_web_warden.txt b/forge-gui/res/cardsfolder/upcoming/spider_byte_web_warden.txt new file mode 100644 index 00000000000..3ba77fbc1ba --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_byte_web_warden.txt @@ -0,0 +1,7 @@ +Name:Spider-Byte, Web Warden +ManaCost:2 U +Types:Legendary Creature Spider Avatar Hero +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME enters, return up to one target nonland permanent to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Permanent.nonLand | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Select up to one target nonland permanent +Oracle:When Spider-Byte enters, return up to one target nonland permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_2099_miguel_ohara.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_2099_miguel_ohara.txt new file mode 100644 index 00000000000..13d6286be7a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_2099_miguel_ohara.txt @@ -0,0 +1,9 @@ +Name:Spider-Man 2099, Miguel O'Hara +ManaCost:4 U +Types:Legendary Creature Spider Human Hero +PT:4/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME enters, return up to one target creature to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Select up to one target creature +T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | Execute$ TrigDraw | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw +Oracle:When Spider-Man 2099 enters, return up to one target creature to its owner's hand.\nWhenever one or more creatures you control deal combat damage to a player, draw a card. From b1afd28556539e7997a06f2e9bc5334e7d604ce4 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:45:53 +0200 Subject: [PATCH 164/183] 20 SPM/SPE cards plus Katara (July 24th, Batch 5) (#8184) --- .../cardsfolder/upcoming/katara_the_fearless.txt | 6 ++++++ .../cardsfolder/upcoming/spectacular_spider_man.txt | 8 ++++++++ .../upcoming/spider_gwen_free_spirit.txt | 9 +++++++++ .../upcoming/spider_man_miles_morales.txt | 13 +++++++++++++ .../upcoming/spider_man_peter_parker.txt | 11 +++++++++++ .../cardsfolder/upcoming/starling_aerial_ally.txt | 8 ++++++++ .../upcoming/stegron_the_dinosaur_man.txt | 8 ++++++++ .../res/cardsfolder/upcoming/symbiote_spawn.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/taxi_driver.txt | 6 ++++++ .../res/cardsfolder/upcoming/the_mary_janes.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/thwip.txt | 7 +++++++ .../upcoming/tombstone_career_criminal.txt | 8 ++++++++ .../cardsfolder/upcoming/twisted_spider_clone.txt | 10 ++++++++++ .../cardsfolder/upcoming/unstable_experiment.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/venom_blast.txt | 7 +++++++ .../res/cardsfolder/upcoming/venom_eddie_brock.txt | 10 ++++++++++ .../cardsfolder/upcoming/venom_evil_unleashed.txt | 8 ++++++++ .../res/cardsfolder/upcoming/venoms_hunger.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/web_up.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/whoosh.txt | 7 +++++++ .../res/cardsfolder/upcoming/wild_pack_squad.txt | 8 ++++++++ 21 files changed, 174 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/katara_the_fearless.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_gwen_free_spirit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_man_miles_morales.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_man_peter_parker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/starling_aerial_ally.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/stegron_the_dinosaur_man.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/symbiote_spawn.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/taxi_driver.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_mary_janes.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thwip.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/twisted_spider_clone.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venom_blast.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venom_eddie_brock.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/web_up.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/whoosh.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt diff --git a/forge-gui/res/cardsfolder/upcoming/katara_the_fearless.txt b/forge-gui/res/cardsfolder/upcoming/katara_the_fearless.txt new file mode 100644 index 00000000000..5a808772daa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/katara_the_fearless.txt @@ -0,0 +1,6 @@ +Name:Katara, the Fearless +ManaCost:G W U +Types:Legendary Creature Human Warrior Ally +PT:3/3 +S:Mode$ Panharmonicon | ValidCard$ Ally.YouCtrl | Description$ If a triggered ability of an Ally you control triggers, that ability triggers an additional time. +Oracle:If a triggered ability of an Ally you control triggers, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt b/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt new file mode 100644 index 00000000000..07caebb9f28 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt @@ -0,0 +1,8 @@ +Name:Spectacular Spider-Man +ManaCost:1 W +Types:Legendary Creature Spider Human Hero +PT:3/2 +K:Flash +A:AB$ Pump | Cost$ 1 | KW$ Flying | Defined$ Self | SpellDescription$ CARDNAME gains flying until end of turn. +A:AB$ PumpAll | Cost$ 1 Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Indestructible & Hexproof | SpellDescription$ Creatures you control gain hexproof and indestructible until end of turn. +Oracle:Flash\n{1}: Spectacular Spider-Man gains flying until end of turn.\n{1}, Sacrifice Spectaculer Spider-Man: Creatures you control gain hexproof and indescructible until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_gwen_free_spirit.txt b/forge-gui/res/cardsfolder/upcoming/spider_gwen_free_spirit.txt new file mode 100644 index 00000000000..9d1c4d78b45 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_gwen_free_spirit.txt @@ -0,0 +1,9 @@ +Name:Spider-Gwen, Free Spirit +ManaCost:2 R +Types:Legendary Creature Spider Human Hero +PT:2/3 +K:Reach +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever NICKNAME becomes tapped, you may discard a card. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> +DeckHas:Ability$Discard +Oracle:Reach\nWhenever Spider-Gwen becomes tapped, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_miles_morales.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_miles_morales.txt new file mode 100644 index 00000000000..1927515d003 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_miles_morales.txt @@ -0,0 +1,13 @@ +Name:Spider-Man, Miles Morales +ManaCost:4 G G +Types:Legendary Creature Spider Human Hero +PT:5/5 +K:Vigilance +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ Whenever NICKNAME enters or attacks, put a +1/+1 counter on each other creature you control. Those creatures gain trample until end of turn. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | Secondary$ True | TriggerDescription$ Whenever NICKNAME enters or attacks, put a +1/+1 counter on each other creature you control. Those creatures gain trample until end of turn. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl+StrictlyOther | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+StrictlyOther | KW$ Trample +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Counters +Oracle:Vigilance, trample (Attacking doesn't cause this creature to tap. He can deal excess combat damage to the player he's attacking.)\nWhenever Spider-Man enters or attacks, put a +1/+1 counter on each other creature you control. Those creatures gain trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_peter_parker.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_peter_parker.txt new file mode 100644 index 00000000000..3dc50529fe0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_peter_parker.txt @@ -0,0 +1,11 @@ +Name:Spider-Man, Peter Parker +ManaCost:3 W W +Types:Legendary Creature Spider Human Hero +PT:4/4 +K:Flying +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on target creature you control. It gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Indestructible +DeckHas:Ability$Counters +DeckHints:Ability$LifeGain +Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhenever you gain life, put a +1/+1 counter on target creature you control. It gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/starling_aerial_ally.txt b/forge-gui/res/cardsfolder/upcoming/starling_aerial_ally.txt new file mode 100644 index 00000000000..b4364d2bdf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/starling_aerial_ally.txt @@ -0,0 +1,8 @@ +Name:Starling, Aerial Ally +ManaCost:4 W +Types:Legendary Creature Human Hero +PT:3/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When NICKNAME enters, another target creature you control gains flying until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | KW$ Flying +Oracle:Flying\nWhen Starling enters, another target creature you control gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/stegron_the_dinosaur_man.txt b/forge-gui/res/cardsfolder/upcoming/stegron_the_dinosaur_man.txt new file mode 100644 index 00000000000..e550e28f9e5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stegron_the_dinosaur_man.txt @@ -0,0 +1,8 @@ +Name:Stegron the Dinosaur Man +ManaCost:4 R +Types:Legendary Creature Dinosaur Villain +PT:5/4 +K:Menace +A:AB$ Pump | Cost$ 1 R Discard<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | PrecostDesc$ Dinosaur Formula — | NumAtt$ +3 | NumDef$ +1 | ActivationZone$ Hand | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature you control gets +3/+1 and becomes a Dinosaur in addition to its other types. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Dinosaur +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nDinosaur Formula — {1}{R}, Discard this card: Until end of turn, target creature you control gets +3/+1 and becomes a Dinosaur in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/symbiote_spawn.txt b/forge-gui/res/cardsfolder/upcoming/symbiote_spawn.txt new file mode 100644 index 00000000000..e62e7497e94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/symbiote_spawn.txt @@ -0,0 +1,9 @@ +Name:Symbiote Spawn +ManaCost:2 B +Types:Creature Symbiote Villain +PT:3/2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When this creature dies, each opponent loses 2 life and you gain 2 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ TriggeredCardController | LifeAmount$ 2 +DeckHas:Ability$LifeGain +Oracle:When this creature dies, each opponent loses 2 life and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt b/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt new file mode 100644 index 00000000000..63190fc66d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt @@ -0,0 +1,6 @@ +Name:Taxi Driver +ManaCost:1 R +Types:Creature Human Pilot +PT:3/1 +A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. +Oracle:{1}, {T}: Target creature gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/the_mary_janes.txt b/forge-gui/res/cardsfolder/upcoming/the_mary_janes.txt new file mode 100644 index 00000000000..65f1d265645 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_mary_janes.txt @@ -0,0 +1,8 @@ +Name:The Mary Janes +ManaCost:3 R +Types:Legendary Creature Human Bard Performer +PT:3/3 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each creature that attacked this turn. +K:Menace +SVar:X:PlayerCountPlayers$AttackersDeclared +Oracle:This spell costs {1} less to cast for each creature that attacked this turn.\nMenace (This creature can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/thwip.txt b/forge-gui/res/cardsfolder/upcoming/thwip.txt new file mode 100644 index 00000000000..a193c5cdba6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thwip.txt @@ -0,0 +1,7 @@ +Name:Thwip! +ManaCost:W +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ +2 | NumDef$ +2 | KW$ Flying | SubAbility$ DBGainLife | SpellDescription$ Target creature gets +2/+2 and gains flying until end of turn. If it's a Spider, you gain 2 life. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Spider +DeckHints:Type$Spider +Oracle:Target creature gets +2/+2 and gains flying until end of turn. If it's a Spider, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt b/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt new file mode 100644 index 00000000000..b21be92ce28 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt @@ -0,0 +1,8 @@ +Name:Tombstone, Career Criminal +ManaCost:2 B +Types:Legendary Creature Human Villain +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME enters, return target Villain card from your graveyard to your hand. +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Villain.YouOwn | TgtPrompt$ Select target Villain card in your graveyard +S:Mode$ ReduceCost | ValidCard$ Villain | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Villain spells you cast cost {1} less to cast. +Oracle:When Tombstone enters, return target Villain card from your graveyard to your hand.\nVillain spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/twisted_spider_clone.txt b/forge-gui/res/cardsfolder/upcoming/twisted_spider_clone.txt new file mode 100644 index 00000000000..4ba27eaebcd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/twisted_spider_clone.txt @@ -0,0 +1,10 @@ +Name:Twisted Spider-Clone +ManaCost:3 G +Types:Creature Spider Human +PT:4/4 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ When this creature enters, put a +1/+1 counter on each creature you control with a +1/+1 counter on it. +SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | CounterType$ P1P1 | CounterNum$ 1 +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +DeckHints:Ability$Counters +Oracle:When this creature enters, put a +1/+1 counter on each creature you control with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt b/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt new file mode 100644 index 00000000000..92f48ff79b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt @@ -0,0 +1,6 @@ +Name:Unstable Experiment +ManaCost:1 U +Types:Instant +A:SP$ Draw | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBConnive | SpellDescription$ Target player draws a card, then up to one target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:DBConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ 1 +Oracle:Target player draws a card, then up to one target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/venom_blast.txt b/forge-gui/res/cardsfolder/upcoming/venom_blast.txt new file mode 100644 index 00000000000..ab1c7d6a1b0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venom_blast.txt @@ -0,0 +1,7 @@ +Name:Venom Blast +ManaCost:2 G G +Types:Instant +A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBDamage | SpellDescription$ Put two +1/+1 counters on target creature you control. It deals damage equal to its power to up to one other target creature. +SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TargetUnique$ True | TargetMin$ 0 | TargetMax$ 1 | NumDmg$ X | DamageSource$ ParentTarget | AILogic$ PowerDmg +SVar:X:ParentTargeted$CardPower +Oracle:Put two +1/+1 counters on target creature you control. It deals damage equal to its power to up to one other target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/venom_eddie_brock.txt b/forge-gui/res/cardsfolder/upcoming/venom_eddie_brock.txt new file mode 100644 index 00000000000..d9ddc26fae9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venom_eddie_brock.txt @@ -0,0 +1,10 @@ +Name:Venom, Eddie Brock +ManaCost:4 B B +Types:Legendary Creature Symbiote Villain +PT:3/3 +K:Menace +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature dies, put a +1/+1 counter on NICKNAME. If that creature was a Villain, draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | ConditionDefined$ TriggeredCardLKICopy | ConditionPresent$ Villain +DeckHints:Type$Villain +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhenever another creature dies, put a +1/+1 counter on Venom. If that creature was a Villain, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt b/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt new file mode 100644 index 00000000000..bc54902b9b9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt @@ -0,0 +1,8 @@ +Name:Venom, Evil Unleashed +ManaCost:4 B +Types:Legendary Creature Symbiote Villain +PT:4/5 +K:Deathtouch +A:AB$ PutCounter | Cost$ 2 B ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 2 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Deathtouch +Oracle:Deathtouch\n{2}{B}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt b/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt new file mode 100644 index 00000000000..335234d0da7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt @@ -0,0 +1,9 @@ +Name:Venom's Hunger +ManaCost:4 B +Types:Sorcery +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Villain.YouCtrl | Description$ This spell costs {2} less to cast if you control a Villain. +A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBLifeGain | SpellDescription$ Destroy target creature. You gain 2 life. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ 2 +DeckHas:Ability$LifeGain +DeckHints:Type$Villain +Oracle:This spell costs {2} less to cast if you control a Villain.\nDestroy target creature. You gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/web_up.txt b/forge-gui/res/cardsfolder/upcoming/web_up.txt new file mode 100644 index 00000000000..2621dfa3882 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/web_up.txt @@ -0,0 +1,8 @@ +Name:Web Up +ManaCost:2 W +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this enchantment enters, exile target nonland permanent an opponent controls until this enchantment leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay +SVar:PlayMain1:TRUE +SVar:OblivionRing:TRUE +Oracle:When this enchantment enters, exile target nonland permanent an opponent controls until this enchantment leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/whoosh.txt b/forge-gui/res/cardsfolder/upcoming/whoosh.txt new file mode 100644 index 00000000000..5ee78f796ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/whoosh.txt @@ -0,0 +1,7 @@ +Name:Whoosh! +ManaCost:1 U +Types:Instant +K:Kicker:1 U +A:SP$ ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDraw | SpellDescription$ Return target nonland permanent to its owner's hand. If this spell was kicked, draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | Condition$ Kicked | ConditionDescription$ If CARDNAME was kicked, +Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.)\nReturn target nonland permanent to its owner's hand. If this spell was kicked, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt b/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt new file mode 100644 index 00000000000..f6a332548d3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt @@ -0,0 +1,8 @@ +Name:Wild Pack Squad +ManaCost:2 W +Types:Creature Human Mercenary +PT:2/2 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, up to one target creature gains first strike and vigilance until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target creature | KW$ First Strike & Vigilance +SVar:PlayMain1:TRUE +Oracle:At the beginning of combat on your turn, up to one target creature gains first strike and vigilance until end of turn. From a78c648e775d75da2ff253145da59876f6b68caa Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 24 Jul 2025 16:33:51 +0200 Subject: [PATCH 165/183] Fix Offering being an AltCost (#8190) --- .../src/main/java/forge/game/GameActionUtil.java | 11 ++++++++--- .../game/ability/effects/PermanentEffect.java | 10 +++++----- .../java/forge/game/card/CardFactoryUtil.java | 16 ---------------- .../forge/game/spellability/AlternativeCost.java | 1 - .../forge/game/spellability/OptionalCost.java | 1 + .../forge/game/spellability/SpellAbility.java | 4 ++-- 6 files changed, 16 insertions(+), 27 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 6126e03bfb8..73b4651689c 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -495,9 +495,11 @@ public final class GameActionUtil { String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); costs.add(new OptionalCostValue(OptionalCost.Flash, cost)); + } else if (keyword.endsWith(" offering")) { + final String type = keyword.split(" ")[0]; + final Cost cost = new Cost("Sac<1/" + type + ">", false); + costs.add(new OptionalCostValue(OptionalCost.Offering, cost)); } - - // Surge while having OptionalCost is none of them } // reset static abilities @@ -524,7 +526,9 @@ public final class GameActionUtil { result.putParam("RaiseCost", sa.getParam("RaiseCost")); } for (OptionalCostValue v : list) { - result.getPayCosts().add(v.getCost()); + if (v.getType() != OptionalCost.Offering) { + result.getPayCosts().add(v.getCost()); + } result.addOptionalCost(v.getType()); // add some extra logic, try to move it to other parts @@ -534,6 +538,7 @@ public final class GameActionUtil { result.getRestrictions().setZone(ZoneType.Graveyard); break; case Flash: + case Offering: result.getRestrictions().setInstantSpeed(true); break; default: diff --git a/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java index a84981cb4a0..14ce438c8ea 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PermanentEffect.java @@ -31,20 +31,20 @@ public class PermanentEffect extends SpellAbilityEffect { final Card c = game.getAction().moveToPlay(host, sa, moveParams); sa.setHostCard(c); + // CR 608.3g if (sa.isIntrinsic() || c.wasCast()) { - // some extra for Dashing if (sa.isDash() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Dash"), c.getGame().getNextTimestamp(), 0); registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c)); + // add AI hint + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Dash"), c.getGame().getNextTimestamp(), 0); } - // similar for Blitz keyword if (sa.isBlitz() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Blitz"), c.getGame().getNextTimestamp(), 0); registerDelayedTrigger(sa, "Sacrifice", Lists.newArrayList(c)); + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Blitz"), c.getGame().getNextTimestamp(), 0); } if (sa.isWarp() && c.isInPlay()) { - c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Warp"), c.getGame().getNextTimestamp(), 0); registerDelayedTrigger(sa, "Exile", Lists.newArrayList(c)); + c.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "Warp"), c.getGame().getNextTimestamp(), 0); } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 1a4b9a935e2..eaf2913ae88 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3810,22 +3810,6 @@ public class CardFactoryUtil { newSA.setAlternativeCost(AlternativeCost.Warp); newSA.setIntrinsic(intrinsic); inst.addSpellAbility(newSA); - } else if (keyword.endsWith(" offering")) { - final String offeringType = keyword.split(" ")[0]; - final SpellAbility sa = card.getFirstSpellAbility(); - - final SpellAbility newSA = sa.copy(); - - SpellAbilityRestriction sar = newSA.getRestrictions(); - sar.setIsPresent(offeringType + ".YouCtrl+CanBeSacrificedBy"); - sar.setInstantSpeed(true); - - newSA.putParam("Secondary", "True"); - newSA.setAlternativeCost(AlternativeCost.Offering); - newSA.setPayCosts(sa.getPayCosts()); - newSA.setDescription(sa.getDescription() + " (" + offeringType + " offering)"); - newSA.setIntrinsic(intrinsic); - inst.addSpellAbility(newSA); } else if (keyword.startsWith("Crew")) { final String[] k = keyword.split(":"); final String power = k[1]; diff --git a/forge-game/src/main/java/forge/game/spellability/AlternativeCost.java b/forge-game/src/main/java/forge/game/spellability/AlternativeCost.java index e88c409b0f1..471451a0ca6 100644 --- a/forge-game/src/main/java/forge/game/spellability/AlternativeCost.java +++ b/forge-game/src/main/java/forge/game/spellability/AlternativeCost.java @@ -17,7 +17,6 @@ public enum AlternativeCost { Madness, MTMtE, // More Than Meets the Eye (Transformers Universes Beyond) Mutate, - Offering, Overload, Prowl, Plotted, diff --git a/forge-game/src/main/java/forge/game/spellability/OptionalCost.java b/forge-game/src/main/java/forge/game/spellability/OptionalCost.java index 086a4ed5545..9a36518a3c8 100644 --- a/forge-game/src/main/java/forge/game/spellability/OptionalCost.java +++ b/forge-game/src/main/java/forge/game/spellability/OptionalCost.java @@ -13,6 +13,7 @@ public enum OptionalCost { PromiseGift("Promise Gift", ""), Retrace("Retrace", ""), Jumpstart("Jump-start", ""), + Offering("Offering", ""), ReduceW("(to reduce white mana)", "W"), ReduceU("(to reduce blue mana)", "U"), ReduceB("(to reduce black mana)", "B"), diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 95a75446d57..70e9da92c9f 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1609,10 +1609,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public boolean isOffering() { - return isAlternativeCost(AlternativeCost.Offering); + return isOptionalCostPaid(OptionalCost.Offering); } - public Card getSacrificedAsOffering() { //for Patron offering + public Card getSacrificedAsOffering() { return sacrificedAsOffering; } public void setSacrificedAsOffering(final Card c) { From d6451ae4860d18ef5639b65d164a6bae0c59267f Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Thu, 24 Jul 2025 23:06:41 +0800 Subject: [PATCH 166/183] Update Murders at Karlov Manor.txt fix crash sealed --- forge-gui/res/editions/Murders at Karlov Manor.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Murders at Karlov Manor.txt b/forge-gui/res/editions/Murders at Karlov Manor.txt index 00d5acd51eb..f9bfeaef251 100644 --- a/forge-gui/res/editions/Murders at Karlov Manor.txt +++ b/forge-gui/res/editions/Murders at Karlov Manor.txt @@ -6,7 +6,7 @@ Type=Expansion ScryfallCode=MKM BoosterSlots=Common,Common-Guest,Uncommon,RareMythic,BasicLand,Wildcard,PrereleasePromo Booster=6 Common, 1 Common-Guest, 3 Uncommon, 1 RareMythic, 1 BasicLand, 1 Wildcard, 1 Wildcard+ -Prerelease=6 Boosters, 1 RareMythic+, 1 PrereleasePromo+ +Prerelease=6 Boosters, 1 RareMythic+ BoosterBox=36 [Common] @@ -21,6 +21,7 @@ Base=Uncommon:fromSheet("MKM cards") [RareMythic] Base=RareMythic:fromSheet("MKM cards") +Replace=.175F fromSheet("MKM prerelease promo") [BasicLand] Base=BasicLand:fromSheet("MKM cards") From f3b2192dd2a04a959f74d2a0f2c40620debbef69 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 25 Jul 2025 00:36:42 +0800 Subject: [PATCH 167/183] fix planechase bg download --- .../src/forge/util/LibGDXImageFetcher.java | 7 +++--- .../main/java/forge/util/ImageFetcher.java | 24 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java index 549f3ceb0c6..38338a7327d 100644 --- a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java +++ b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java @@ -37,7 +37,8 @@ public class LibGDXImageFetcher extends ImageFetcher { String newdespath = urlToDownload.contains(".fullborder.") || urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) ? TextUtil.fastReplace(destPath, ".full.", ".fullborder.") : destPath; - if (!newdespath.contains(".full") && urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) && !destPath.startsWith(ForgeConstants.CACHE_TOKEN_PICS_DIR)) + if (!newdespath.contains(".full") && urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) && + !destPath.startsWith(ForgeConstants.CACHE_TOKEN_PICS_DIR) && !destPath.startsWith(ForgeConstants.CACHE_PLANECHASE_PICS_DIR)) newdespath = newdespath.replace(".jpg", ".fullborder.jpg"); //fix planes/phenomenon for round border options URL url = new URL(urlToDownload); System.out.println("Attempting to fetch: " + url); @@ -83,10 +84,10 @@ public class LibGDXImageFetcher extends ImageFetcher { public void run() { boolean success = false; for (String urlToDownload : downloadUrls) { - boolean isPlanechaseBG = urlToDownload.startsWith("https://downloads.cardforge.org/images/planes/"); + boolean isPlanechaseBG = urlToDownload.startsWith("PLANECHASEBG:"); try { - success = doFetch(urlToDownload); + success = doFetch(urlToDownload.replace("PLANECHASEBG:", "")); if (success) { break; diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 4ffb505747c..7ce0da05ff1 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -116,13 +116,22 @@ public abstract class ImageFetcher { final ArrayList downloadUrls = new ArrayList<>(); if (imageKey.startsWith("PLANECHASEBG:")) { final String filename = imageKey.substring("PLANECHASEBG:".length()); - downloadUrls.add("https://downloads.cardforge.org/images/planes/" + filename); - FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_PLANECHASE_PICS_DIR); - File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, filename); - if (destFile.exists()) - return; + PaperCard pc = StaticData.instance().getVariantCards().getCard(filename.replace("_", " ").replace(".jpg", "")); + if (pc != null) { + CardEdition ed = StaticData.instance().getEditions().get(pc.getEdition()); + if (ed != null) { + String setCode = ed.getScryfallCode(); + String langCode = ed.getCardsLangCode(); + downloadUrls.add("PLANECHASEBG:" + ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, "", setCode, langCode, true)); + FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_PLANECHASE_PICS_DIR); + File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, filename); + if (destFile.exists()) + return; - setupObserver(destFile.getAbsolutePath(), callback, downloadUrls); + setupObserver(destFile.getAbsolutePath(), callback, downloadUrls); + return; + } + } return; } @@ -266,7 +275,8 @@ public abstract class ImageFetcher { return; if (tempdata.length < 2) { - System.err.println("Token image key is malformed: " + imageKey); + if (!"planechase".equals(tempdata[0])) + System.err.println("Token image key is malformed: " + imageKey); return; } From d903e4d80de7c3ba939b1cdd5627365d63cef29f Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Thu, 24 Jul 2025 18:47:54 +0100 Subject: [PATCH 168/183] Edition updates: PURL, SPM --- forge-gui/res/editions/Marvel's Spider-Man.txt | 1 + forge-gui/res/editions/URL Convention Promos.txt | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/editions/Marvel's Spider-Man.txt b/forge-gui/res/editions/Marvel's Spider-Man.txt index fd483ea2df5..abcd6d152e5 100644 --- a/forge-gui/res/editions/Marvel's Spider-Man.txt +++ b/forge-gui/res/editions/Marvel's Spider-Man.txt @@ -11,6 +11,7 @@ ScryfallCode=SPM 9 R Origin of Spider-Man @Bill Sienkiewicz 10 M Peter Parker @Thanh Tuấn 12 C Selfless Police Captain @Aniekan Udofia +14 R Spectacular Spider-Man @Roberta Ingranata 15 C Spectacular Tactics @Zoltan Boros 16 C Spider-Man, Web-Slinger @Ryan Pancoast 18 C Starling, Aerial Ally @Aniekan Udofia diff --git a/forge-gui/res/editions/URL Convention Promos.txt b/forge-gui/res/editions/URL Convention Promos.txt index b910da27660..3a27ae3f5d8 100644 --- a/forge-gui/res/editions/URL Convention Promos.txt +++ b/forge-gui/res/editions/URL Convention Promos.txt @@ -16,7 +16,5 @@ ScryfallCode=PURL 23 R Kor Skyfisher @Dan Murayama Scott 34★ U Shepherd of the Lost @Kekai Kotaki 445 M Ral, Monsoon Mage @Borja Pindado -2025-1 Hylda of the Icy Crown @Yakotakos - -[tokens] -wu_4_4_elemental \ No newline at end of file +2025-1 M Hylda of the Icy Crown @Yakotakos +2025-3 R Katara, the Fearless @Yueko From e64faa3cf2d5dc361728dbe1fa3da9679a644290 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 24 Jul 2025 18:53:33 +0000 Subject: [PATCH 169/183] Update patchwork_crawler.txt --- forge-gui/res/cardsfolder/p/patchwork_crawler.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/patchwork_crawler.txt b/forge-gui/res/cardsfolder/p/patchwork_crawler.txt index 00cd90ab133..572881b0d98 100644 --- a/forge-gui/res/cardsfolder/p/patchwork_crawler.txt +++ b/forge-gui/res/cardsfolder/p/patchwork_crawler.txt @@ -4,8 +4,6 @@ Types:Creature Zombie Horror PT:1/2 A:AB$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target creature from your graveyard | SubAbility$ DBCounter | SpellDescription$ Exile target creature from your graveyard and put a +1/+1 counter on CARDNAME. SVar:DBCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Self -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Creature.ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all creature cards exiled with it. DeckHas:Ability$Counters|Graveyard DeckHints:Ability$Discard From 895c5c1e653dc929458af58687c6ddb08e5659ed Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:14:47 +0100 Subject: [PATCH 170/183] SPM: 4 cards (#8194) --- .../upcoming/sp_dr_piloted_by_peni.txt | 10 ++++++++++ .../upcoming/spider_ham_peter_porker.txt | 8 ++++++++ .../cardsfolder/upcoming/spider_man_2099.txt | 18 ++++++++++++++++++ .../cardsfolder/upcoming/spider_man_noir.txt | 10 ++++++++++ 4 files changed, 46 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/sp_dr_piloted_by_peni.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_ham_peter_porker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spider_man_noir.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sp_dr_piloted_by_peni.txt b/forge-gui/res/cardsfolder/upcoming/sp_dr_piloted_by_peni.txt new file mode 100644 index 00000000000..5a80bdf0d97 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sp_dr_piloted_by_peni.txt @@ -0,0 +1,10 @@ +Name:SP//dr, Piloted by Peni +ManaCost:3 W U +Types:Legendary Artifact Creature Spider Hero +PT:4/4 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When NICKNAME enters, put a +1/+1 counter on target creature. +SVar:TrigPut:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl+modified | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a modified creature you control deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +Oracle:Vigilance\nWhen SP//dr enters, put a +1/+1 counter on target creature.\nWhenever a modified creature you control deals combat damage to a player, draw a card. (Equipment, Auras you control, and counters are modifications.) diff --git a/forge-gui/res/cardsfolder/upcoming/spider_ham_peter_porker.txt b/forge-gui/res/cardsfolder/upcoming/spider_ham_peter_porker.txt new file mode 100644 index 00000000000..ddab967a67a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_ham_peter_porker.txt @@ -0,0 +1,8 @@ +Name:Spider-Ham, Peter Porker +ManaCost:1 G +Types:Legendary Creature Spider Boar Hero +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When NICKNAME enters, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You +S:Mode$ Continuous | Affected$ Spider.Other+YouCtrl,Boar.Other+YouCtrl,Bat.Other+YouCtrl,Bear.Other+YouCtrl,Bird.Other+YouCtrl,Cat.Other+YouCtrl,Dog.Other+YouCtrl,Frog.Other+YouCtrl,Jackal.Other+YouCtrl,Lizard.Other+YouCtrl,Mouse.Other+YouCtrl,Otter.Other+YouCtrl,Rabbit.Other+YouCtrl,Raccoon.Other+YouCtrl,Rat.Other+YouCtrl,Squirrel.Other+YouCtrl,Turtle.Other+YouCtrl,Wolf.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Animal May-Ham — Other Spiders, Boars, Bats, Bears, Birds, Cats, Dogs, Frogs, Jackals, Lizards, Mice, Otters, Rabbits, Raccoons, Rats, Squirrels, Turtles, and Wolves you control get +1/+1. +Oracle:When Spider-Ham enters, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this token: You gain 3 life.")\nAnimal May-Ham — Other Spiders, Boars, Bats, Bears, Birds, Cats, Dogs, Frogs, Jackals, Lizards, Mice, Otters, Rabbits, Raccoons, Rats, Squirrels, Turtles, and Wolves you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt new file mode 100644 index 00000000000..ef991888a02 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt @@ -0,0 +1,18 @@ +Name:Spider-Man 2099 +ManaCost:U R +Types:Legendary Creature Spider Human Hero +PT:2/3 +K:Double Strike +K:Vigilance +S:Mode$ CantBeCast | ValidCard$ Card.Self | EffectZone$ All | Caster$ Player.Active | CheckSVar$ Z | SVarCompare$ LE3 | Description$ You can't cast CARDNAME during your first, second, or third turns of the game. +SVar:Z:Count$YourTurns +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ Y | SVarCompare$ EQ1 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your end step, if you’ve played a land or cast a spell this turn from anywhere other than your hand, CARDNAME deals damage equal to his power to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X | AILogic$ PowerDmg +SVar:X:Count$CardPower +T:Mode$ LandPlayed | Origin$ Exile,Library,Graveyard | ValidCard$ Land.YouCtrl | Execute$ StoreVar | Static$ True +SVar:StoreVar:DB$ StoreSVar | SVar$ LandsPlayedFromNotHand | Type$ Number | Expression$ 1 +T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigReset | Static$ True +SVar:TrigReset:DB$ StoreSVar | SVar$ LandsPlayedFromNotHand | Type$ Number | Expression$ 0 +SVar:Y:Count$ThisTurnCast_Card.YouCtrl+!wasCastFromYourHand/Plus.LandsPlayedFromNotHand +SVar:LandsPlayedFromNotHand:Number$0 +Oracle:From the Future — You can’t cast Spider-Man 2099 during your first, second, or third turns of the game.\nDouble strike, vigilance\nAt the beginning of your end step, if you’ve played a land or cast a spell this turn from anywhere other than your hand, Spider-Man 2099 deals damage equal to his power to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_noir.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_noir.txt new file mode 100644 index 00000000000..0734e8be3a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_noir.txt @@ -0,0 +1,10 @@ +Name:Spider-Man Noir +ManaCost:4 B +Types:Legendary Creature Spider Human Hero +PT:4/4 +K:Menace +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control attacks alone, put a +1/+1 counter on it. Then surveil X, where X is the number of counters on it. (Look at the top X cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredAttackerLKICopy | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBSurveil +SVar:DBSurveil:DB$ Surveil | Amount$ X +SVar:X:TriggeredAttacker$CardCounters.ALL +Oracle:Menace\nWhenever a creature you control attacks alone, put a +1/+1 counter on it. Then surveil X, where X is the number of counters on it. (Look at the top X cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) From 8c5dfb61e7c95a872d4e280b4004be391049ebae Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 25 Jul 2025 08:44:21 +0800 Subject: [PATCH 171/183] refactor planechase fetcher --- forge-gui-mobile/src/forge/assets/FSkinTexture.java | 5 +++-- forge-gui-mobile/src/forge/screens/match/MatchScreen.java | 3 +-- forge-gui/src/main/java/forge/util/ImageFetcher.java | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index 6ebce7ae318..bd0df481202 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -119,7 +119,8 @@ public enum FSkinTexture implements FImage { return false; if (!planeName.isEmpty()) { texture = null; //reset - this.filename = planeName + ".jpg"; + this.filename = planeName.replace(" ", "_").replace("'", "") + .replace("-", "").replace("!", "").replace(":", "") + ".jpg"; } FileHandle preferredFile = isPlanechaseBG ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename); if (preferredFile.exists()) { @@ -140,7 +141,7 @@ public enum FSkinTexture implements FImage { FileHandle defaultFile = FSkin.getDefaultSkinFile(filename); if(isPlanechaseBG) { ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); - fetcher.fetchImage("PLANECHASEBG:" + filename, () -> { + fetcher.fetchImage("PLANECHASEBG:" + planeName, () -> { hasError = false; load(); }); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 403f1c09d68..2a5b7d6a8ea 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -969,8 +969,7 @@ public class MatchScreen extends FScreen { //overrideBG if (!Forge.isMobileAdventureMode) { if (hasActivePlane()) { - imageName = getPlaneName().replace(" ", "_").replace("'", "") - .replace("-", "").replace("!", ""); + imageName = getPlaneName(); if (!plane.equals(imageName)) { plane = imageName; bgAnimation.progress = 0; diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 7ce0da05ff1..3098205bdc8 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -116,7 +116,7 @@ public abstract class ImageFetcher { final ArrayList downloadUrls = new ArrayList<>(); if (imageKey.startsWith("PLANECHASEBG:")) { final String filename = imageKey.substring("PLANECHASEBG:".length()); - PaperCard pc = StaticData.instance().getVariantCards().getCard(filename.replace("_", " ").replace(".jpg", "")); + PaperCard pc = StaticData.instance().getVariantCards().getCard(filename); if (pc != null) { CardEdition ed = StaticData.instance().getEditions().get(pc.getEdition()); if (ed != null) { @@ -124,7 +124,8 @@ public abstract class ImageFetcher { String langCode = ed.getCardsLangCode(); downloadUrls.add("PLANECHASEBG:" + ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, "", setCode, langCode, true)); FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_PLANECHASE_PICS_DIR); - File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, filename); + File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, filename.replace(" ", "_").replace("'", "") + .replace("-", "").replace("!", "").replace(":", "") + ".jpg"); if (destFile.exists()) return; From 924d9f57a66371cf3460d916a39e9dbf9a14a687 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 25 Jul 2025 09:10:32 +0800 Subject: [PATCH 172/183] minor cleanup --- .../src/forge/assets/FSkinTexture.java | 106 +++++++++--------- .../main/java/forge/util/ImageFetcher.java | 41 ++++--- 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index bd0df481202..1868d5e4cfd 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -37,50 +37,50 @@ public enum FSkinTexture implements FImage { ADV_BG_DUNGEON(ForgeConstants.ADV_BG_DUNGEON_FILE, false, false), ADV_BG_CASTLE(ForgeConstants.ADV_BG_CASTLE_FILE, false, false), //CARD BG - CARDBG_A (ForgeConstants.IMG_CARDBG_A, false, false), - CARDBG_B (ForgeConstants.IMG_CARDBG_B, false, false), - CARDBG_BG (ForgeConstants.IMG_CARDBG_BG, false, false), - CARDBG_BR (ForgeConstants.IMG_CARDBG_BR, false, false), - CARDBG_C (ForgeConstants.IMG_CARDBG_C, false, false), - CARDBG_G (ForgeConstants.IMG_CARDBG_G, false, false), - CARDBG_L (ForgeConstants.IMG_CARDBG_L, false, false), - CARDBG_M (ForgeConstants.IMG_CARDBG_M, false, false), - CARDBG_R (ForgeConstants.IMG_CARDBG_R, false, false), - CARDBG_RG (ForgeConstants.IMG_CARDBG_RG, false, false), - CARDBG_U (ForgeConstants.IMG_CARDBG_U, false, false), - CARDBG_UB (ForgeConstants.IMG_CARDBG_UB, false, false), - CARDBG_UG (ForgeConstants.IMG_CARDBG_UG, false, false), - CARDBG_UR (ForgeConstants.IMG_CARDBG_UR, false, false), - CARDBG_V (ForgeConstants.IMG_CARDBG_V, false, false), - CARDBG_W (ForgeConstants.IMG_CARDBG_W, false, false), - CARDBG_WB (ForgeConstants.IMG_CARDBG_WB, false, false), - CARDBG_WG (ForgeConstants.IMG_CARDBG_WG, false, false), - CARDBG_WR (ForgeConstants.IMG_CARDBG_WR, false, false), - CARDBG_WU (ForgeConstants.IMG_CARDBG_WU, false, false), - PWBG_B (ForgeConstants.IMG_PWBG_B, false, false), - PWBG_BG (ForgeConstants.IMG_PWBG_BG, false, false), - PWBG_BR (ForgeConstants.IMG_PWBG_BR, false, false), - PWBG_C (ForgeConstants.IMG_PWBG_C, false, false), - PWBG_G (ForgeConstants.IMG_PWBG_G, false, false), - PWBG_M (ForgeConstants.IMG_PWBG_M, false, false), - PWBG_R (ForgeConstants.IMG_PWBG_R, false, false), - PWBG_RG (ForgeConstants.IMG_PWBG_RG, false, false), - PWBG_U (ForgeConstants.IMG_PWBG_U, false, false), - PWBG_UB (ForgeConstants.IMG_PWBG_UB, false, false), - PWBG_UG (ForgeConstants.IMG_PWBG_UG, false, false), - PWBG_UR (ForgeConstants.IMG_PWBG_UR, false, false), - PWBG_W (ForgeConstants.IMG_PWBG_W, false, false), - PWBG_WB (ForgeConstants.IMG_PWBG_WB, false, false), - PWBG_WG (ForgeConstants.IMG_PWBG_WG, false, false), - PWBG_WR (ForgeConstants.IMG_PWBG_WR, false, false), - PWBG_WU (ForgeConstants.IMG_PWBG_WU, false, false), - NYX_B (ForgeConstants.IMG_NYX_B, false, false), - NYX_G (ForgeConstants.IMG_NYX_G, false, false), - NYX_M (ForgeConstants.IMG_NYX_M, false, false), - NYX_R (ForgeConstants.IMG_NYX_R, false, false), - NYX_U (ForgeConstants.IMG_NYX_U, false, false), - NYX_W (ForgeConstants.IMG_NYX_W, false, false), - NYX_C (ForgeConstants.IMG_NYX_C, false, false), + CARDBG_A(ForgeConstants.IMG_CARDBG_A, false, false), + CARDBG_B(ForgeConstants.IMG_CARDBG_B, false, false), + CARDBG_BG(ForgeConstants.IMG_CARDBG_BG, false, false), + CARDBG_BR(ForgeConstants.IMG_CARDBG_BR, false, false), + CARDBG_C(ForgeConstants.IMG_CARDBG_C, false, false), + CARDBG_G(ForgeConstants.IMG_CARDBG_G, false, false), + CARDBG_L(ForgeConstants.IMG_CARDBG_L, false, false), + CARDBG_M(ForgeConstants.IMG_CARDBG_M, false, false), + CARDBG_R(ForgeConstants.IMG_CARDBG_R, false, false), + CARDBG_RG(ForgeConstants.IMG_CARDBG_RG, false, false), + CARDBG_U(ForgeConstants.IMG_CARDBG_U, false, false), + CARDBG_UB(ForgeConstants.IMG_CARDBG_UB, false, false), + CARDBG_UG(ForgeConstants.IMG_CARDBG_UG, false, false), + CARDBG_UR(ForgeConstants.IMG_CARDBG_UR, false, false), + CARDBG_V(ForgeConstants.IMG_CARDBG_V, false, false), + CARDBG_W(ForgeConstants.IMG_CARDBG_W, false, false), + CARDBG_WB(ForgeConstants.IMG_CARDBG_WB, false, false), + CARDBG_WG(ForgeConstants.IMG_CARDBG_WG, false, false), + CARDBG_WR(ForgeConstants.IMG_CARDBG_WR, false, false), + CARDBG_WU(ForgeConstants.IMG_CARDBG_WU, false, false), + PWBG_B(ForgeConstants.IMG_PWBG_B, false, false), + PWBG_BG(ForgeConstants.IMG_PWBG_BG, false, false), + PWBG_BR(ForgeConstants.IMG_PWBG_BR, false, false), + PWBG_C(ForgeConstants.IMG_PWBG_C, false, false), + PWBG_G(ForgeConstants.IMG_PWBG_G, false, false), + PWBG_M(ForgeConstants.IMG_PWBG_M, false, false), + PWBG_R(ForgeConstants.IMG_PWBG_R, false, false), + PWBG_RG(ForgeConstants.IMG_PWBG_RG, false, false), + PWBG_U(ForgeConstants.IMG_PWBG_U, false, false), + PWBG_UB(ForgeConstants.IMG_PWBG_UB, false, false), + PWBG_UG(ForgeConstants.IMG_PWBG_UG, false, false), + PWBG_UR(ForgeConstants.IMG_PWBG_UR, false, false), + PWBG_W(ForgeConstants.IMG_PWBG_W, false, false), + PWBG_WB(ForgeConstants.IMG_PWBG_WB, false, false), + PWBG_WG(ForgeConstants.IMG_PWBG_WG, false, false), + PWBG_WR(ForgeConstants.IMG_PWBG_WR, false, false), + PWBG_WU(ForgeConstants.IMG_PWBG_WU, false, false), + NYX_B(ForgeConstants.IMG_NYX_B, false, false), + NYX_G(ForgeConstants.IMG_NYX_G, false, false), + NYX_M(ForgeConstants.IMG_NYX_M, false, false), + NYX_R(ForgeConstants.IMG_NYX_R, false, false), + NYX_U(ForgeConstants.IMG_NYX_U, false, false), + NYX_W(ForgeConstants.IMG_NYX_W, false, false), + NYX_C(ForgeConstants.IMG_NYX_C, false, false), GENERIC_PLANE("", false, true); @@ -97,6 +97,7 @@ public enum FSkinTexture implements FImage { repeat = repeat0; isPlanechaseBG = isPlanechaseBG0; } + public static List getValues() { if (planechaseString == null) { planechaseString = new ArrayList<>(); @@ -114,13 +115,13 @@ public enum FSkinTexture implements FImage { public void load() { load(""); } + public boolean load(String planeName) { if (hasError) return false; if (!planeName.isEmpty()) { texture = null; //reset - this.filename = planeName.replace(" ", "_").replace("'", "") - .replace("-", "").replace("!", "").replace(":", "") + ".jpg"; + this.filename = ImageFetcher.getPlanechaseFilename(planeName); } FileHandle preferredFile = isPlanechaseBG ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename); if (preferredFile.exists()) { @@ -128,8 +129,7 @@ public enum FSkinTexture implements FImage { texture = Forge.getAssets().getTexture(preferredFile, false); if (texture != null) isloaded = true; - } - catch (final Exception e) { + } catch (final Exception e) { System.err.println("Failed to load skin file: " + preferredFile); e.printStackTrace(); isloaded = false; @@ -139,14 +139,14 @@ public enum FSkinTexture implements FImage { if (texture == null) { //use default file if can't use preferred file FileHandle defaultFile = FSkin.getDefaultSkinFile(filename); - if(isPlanechaseBG) { + if (isPlanechaseBG) { ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); fetcher.fetchImage("PLANECHASEBG:" + planeName, () -> { hasError = false; load(); }); defaultFile = FSkin.getSkinFile(ForgeConstants.MATCH_BG_FILE); - if(!defaultFile.exists()) + if (!defaultFile.exists()) defaultFile = FSkin.getDefaultSkinFile(ForgeConstants.MATCH_BG_FILE); } @@ -154,16 +154,14 @@ public enum FSkinTexture implements FImage { try { texture = Forge.getAssets().getTexture(defaultFile); isloaded = true; - } - catch (final Exception e) { + } catch (final Exception e) { System.err.println("Failed to load skin file: " + defaultFile); e.printStackTrace(); isloaded = false; hasError = true; return false; } - } - else { + } else { System.err.println("Failed to load skin file: " + defaultFile); isloaded = false; hasError = true; diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 3098205bdc8..654ebf2eb3d 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -33,7 +33,8 @@ public abstract class ImageFetcher { langCodeMap.put("ru-RU", "ru"); langCodeMap.put("zh-CN", "zhs"); langCodeMap.put("zh-HK", "zht"); - }; + } + private HashMap> currentFetches = new HashMap<>(); private HashMap tokenImages; @@ -49,7 +50,7 @@ public abstract class ImageFetcher { if (!c.getEdition().equalsIgnoreCase(pc.getEdition())) { CardEdition ed = data.getEditions().get(pc.getEdition()); if (ed != null) { - String setCode =ed.getScryfallCode(); + String setCode = ed.getScryfallCode(); String langCode = ed.getCardsLangCode(); downloadUrls.add(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, face, setCode, langCode, useArtCrop)); } @@ -57,7 +58,7 @@ public abstract class ImageFetcher { } else {// original from set CardEdition ed = data.getEditions().get(pc.getEdition()); if (ed != null) { - String setCode =ed.getScryfallCode(); + String setCode = ed.getScryfallCode(); String langCode = ed.getCardsLangCode(); downloadUrls.add(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, face, setCode, langCode, useArtCrop)); } @@ -81,6 +82,11 @@ public abstract class ImageFetcher { return null; } + public static String getPlanechaseFilename(final String cardName) { + return cardName.replace(" ", "_").replace("'", "") + .replace("-", "").replace("!", "").replace(":", "") + ".jpg"; + } + public void fetchImage(final String imageKey, final Callback callback) { FThreads.assertExecutedByEdt(true); @@ -93,20 +99,20 @@ public abstract class ImageFetcher { // Fake card (like the ante prompt) trying to be "fetched" if (imageKey.length() < 2) return; - if (imageKey.startsWith(ImageKeys.BOOSTER_PREFIX)) - { + if (imageKey.startsWith(ImageKeys.BOOSTER_PREFIX)) { final ArrayList downloadUrls = new ArrayList<>(); final String filename = imageKey.substring(ImageKeys.BOOSTER_PREFIX.length()); - downloadUrls.add("https://downloads.cardforge.org/images/products/boosters/"+ filename); - System.out.println("Fetching from "+downloadUrls); + // TODO Update image server or alternative hosting + downloadUrls.add("https://downloads.cardforge.org/images/products/boosters/" + filename); + System.out.println("Fetching from " + downloadUrls); FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_BOOSTER_PICS_DIR); File destFile = new File(ForgeConstants.CACHE_BOOSTER_PICS_DIR, filename); - System.out.println("Destination File "+ destFile.getAbsolutePath()+" exists: " + destFile.exists()); - if(destFile.exists()) + System.out.println("Destination File " + destFile.getAbsolutePath() + " exists: " + destFile.exists()); + if (destFile.exists()) return; - setupObserver(destFile.getAbsolutePath(),callback,downloadUrls); + setupObserver(destFile.getAbsolutePath(), callback, downloadUrls); return; } if (imageKey.equalsIgnoreCase("t:null")) @@ -115,8 +121,8 @@ public abstract class ImageFetcher { //planechaseBG file... final ArrayList downloadUrls = new ArrayList<>(); if (imageKey.startsWith("PLANECHASEBG:")) { - final String filename = imageKey.substring("PLANECHASEBG:".length()); - PaperCard pc = StaticData.instance().getVariantCards().getCard(filename); + final String cardName = imageKey.substring("PLANECHASEBG:".length()); + PaperCard pc = StaticData.instance().getVariantCards().getCard(cardName); if (pc != null) { CardEdition ed = StaticData.instance().getEditions().get(pc.getEdition()); if (ed != null) { @@ -124,8 +130,7 @@ public abstract class ImageFetcher { String langCode = ed.getCardsLangCode(); downloadUrls.add("PLANECHASEBG:" + ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, "", setCode, langCode, true)); FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_PLANECHASE_PICS_DIR); - File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, filename.replace(" ", "_").replace("'", "") - .replace("-", "").replace("!", "").replace(":", "") + ".jpg"); + File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, getPlanechaseFilename(cardName)); if (destFile.exists()) return; @@ -283,7 +288,8 @@ public abstract class ImageFetcher { // Load the paper token from filename + edition CardEdition edition = StaticData.instance().getEditions().get(setCode); - if (edition == null || edition.getType() == CardEdition.Type.CUSTOM_SET) return; //Custom set token, skip fetching. + if (edition == null || edition.getType() == CardEdition.Type.CUSTOM_SET) + return; //Custom set token, skip fetching. //PaperToken pt = StaticData.instance().getAllTokens().getToken(tokenName, setCode); Collection allTokens = edition.getTokens().get(tokenName); @@ -300,9 +306,9 @@ public abstract class ImageFetcher { // Ideally we would have some mapping for generating card to determine which art indexed/collector number to try to fetch // Token art we're downloading and which location we're storing it in. // Once we're pulling from PaperTokens this section will change a bit - Iterator it = allTokens.iterator(); + Iterator it = allTokens.iterator(); CardEdition.EditionEntry tis; - while(it.hasNext()) { + while (it.hasNext()) { tis = it.next(); String tokenCode = edition.getTokensCode(); String langCode = edition.getCardsLangCode(); @@ -336,6 +342,7 @@ public abstract class ImageFetcher { setupObserver(destFile.getAbsolutePath(), callback, downloadUrls); } + private void setupObserver(final String destPath, final Callback callback, final ArrayList downloadUrls) { // Note: No synchronization is needed here because this is executed on // EDT thread (see assert on top) and so is the notification of observers. From cfcbbb5c21cb53f49ef91fce1a4eea63a826ef19 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Fri, 25 Jul 2025 09:56:51 +0800 Subject: [PATCH 173/183] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 10be641e343..7a961bedb93 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ⚔️ Forge: The Magic: The Gathering Rules Engine +# ⚔️ Forge: The Magic: The Gathering Rules Engine Join the **Forge community** on [Discord](https://discord.gg/HcPJNyD66a)! @@ -47,11 +47,13 @@ Embark on a thrilling single-player journey where you can: - Challenge diverse AI opponents. - Collect cards and items to boost your abilities. -![Adventure Mode](https://downloads.cardforge.org/images/site/adventure-mode.png "Adventure Mode") +Shandalar World ### 🔍 Quest Modes Engage in focused gameplay without the overworld exploration—perfect for quick sessions! +Quest Duels + ### 🤖 AI Formats Test your skills against AI in multiple formats: - **Sealed** @@ -61,6 +63,8 @@ Test your skills against AI in multiple formats: For comprehensive gameplay instructions, visit our [Gameplay Guide](https://github.com/Card-Forge/forge/wiki/Gameplay-Guide). +Sealed + --- ## 💬 Support & Community From de4dcb19cfe120506ed4e833da509be7bdbbd5bb Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 25 Jul 2025 04:54:46 +0100 Subject: [PATCH 174/183] Quick cleanup: 2025-07-24 --- forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt | 2 +- forge-gui/res/cardsfolder/upcoming/aunt_may.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt | 2 +- forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt | 2 +- forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt | 2 +- forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kapow.txt | 2 +- forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt | 2 +- forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/taxi_driver.txt | 2 +- .../res/cardsfolder/upcoming/tombstone_career_criminal.txt | 2 +- forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/venom_blast.txt | 2 +- forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt | 2 +- forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt | 2 +- forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt | 2 +- 17 files changed, 21 insertions(+), 21 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt index 59db5293d54..e4e9b4f1053 100644 --- a/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt +++ b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Artifact Creature Robot Villain PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) -SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ DBPutCounter +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target an opponent controls | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 Oracle:When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/cardsfolder/upcoming/aunt_may.txt b/forge-gui/res/cardsfolder/upcoming/aunt_may.txt index 006edacdbf7..a8551a3ecb4 100644 --- a/forge-gui/res/cardsfolder/upcoming/aunt_may.txt +++ b/forge-gui/res/cardsfolder/upcoming/aunt_may.txt @@ -2,9 +2,9 @@ Name:Aunt May ManaCost:W Types:Legendary Creature Human Citizen PT:0/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature you control enters, you gain 1 life. If it’s a Spider, put a +1/+1 counter on it. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature you control enters, you gain 1 life. If it's a Spider, put a +1/+1 counter on it. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy.Spider | CounterType$ P1P1 | CounterNum$ 1 +SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy.Spider | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$LifeGain|Counters DeckHints:Type$Spider Oracle:Whenever another creature you control enters, you gain 1 life. If it's a Spider, put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt b/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt index efdc7f76610..cd88936d722 100644 --- a/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt +++ b/forge-gui/res/cardsfolder/upcoming/beetle_legacy_criminal.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Legendary Creature Human Rogue Villain PT:3/3 K:Flying -A:AB$ PutCounter | Cost$ 1 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature. It gains flying until end of turn. Activate only as a sorcery. +A:AB$ PutCounter | Cost$ 1 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature. It gains flying until end of turn. Activate only as a sorcery. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Flying Oracle:Flying\n{1}{U}, Exile this card from your graveyard: Put a +1/+1 counter on target creature. It gains flying until end of turn. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt b/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt index 9ca22b03561..dde474ca669 100644 --- a/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt +++ b/forge-gui/res/cardsfolder/upcoming/daily_bugle_reporters.txt @@ -4,7 +4,7 @@ Types:Creature Human Citizen PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When this creature enters, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ DBPutCounter,DBReturn -SVar:DBPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Puff Piece — Put a +1/+1 counter on each of up to two target creatures. +SVar:DBPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Puff Piece — Put a +1/+1 counter on each of up to two target creatures. SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouOwn+cmcLE2 | SpellDescription$ Investigative Journalism — Return target creature card with mana value 2 or less from your graveyard to your hand. DeckHas:Ability$Counters Oracle:When this creature enters, choose one —\n• Puff Piece — Put a +1/+1 counter on each of up to two target creatures.\n• Investigative Journalism — Return target creature card with mana value 2 or less from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt b/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt index 716a010cacb..362b954401e 100644 --- a/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt +++ b/forge-gui/res/cardsfolder/upcoming/grow_extra_arms.txt @@ -2,6 +2,6 @@ Name:Grow Extra Arms ManaCost:1 G Types:Instant S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | ValidTarget$ Spider | Description$ This spell costs {1} less to cast if it targets a Spider. -A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. DeckHints:Type$Spider Oracle:This spell costs {1} less to cast if it targets a Spider.\nTarget creature gets +4/+4 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt b/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt index 46ecf3cb706..af98cdfe83d 100644 --- a/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt +++ b/forge-gui/res/cardsfolder/upcoming/guy_in_the_chair.txt @@ -3,5 +3,5 @@ ManaCost:2 G Types:Creature Human Advisor PT:2/3 A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -A:AB$ PutCounter | PrecostDesc$ Web Support — | Cost$ 2 G T | ValidTgts$ Spider | TgtPrompt$ Select target Spider | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target Spider. Activate only as a sorcery. +A:AB$ PutCounter | PrecostDesc$ Web Support — | Cost$ 2 G T | ValidTgts$ Spider | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target Spider. Activate only as a sorcery. Oracle:{T}: Add one mana of any color.\nWeb Support — {2}{G}, {T}: Put a +1/+1 counter on target Spider. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/kapow.txt b/forge-gui/res/cardsfolder/upcoming/kapow.txt index 89c25211d74..a9824e1d890 100644 --- a/forge-gui/res/cardsfolder/upcoming/kapow.txt +++ b/forge-gui/res/cardsfolder/upcoming/kapow.txt @@ -2,5 +2,5 @@ Name:Kapow! ManaCost:2 G Types:Sorcery A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBFight | SpellDescription$ Put a +1/+1 counter on target creature you control. It fights target creature an opponent controls. (Each deals damage equal to its power to the other.) -SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls Oracle:Put a +1/+1 counter on target creature you control. It fights target creature an opponent controls. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt b/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt index c826b440954..81922361370 100644 --- a/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt +++ b/forge-gui/res/cardsfolder/upcoming/mechanical_mobster.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Human Robot Villain PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature enters, exile up to one target card from a graveyard. Target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBConnive | TgtPrompt$ Select target card in a graveyard to exile +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBConnive | TgtPrompt$ Select up to one target card in a graveyard SVar:DBConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control Oracle:When this creature enters, exile up to one target card from a graveyard. Target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt b/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt index 5488255b066..081aa692cca 100644 --- a/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt +++ b/forge-gui/res/cardsfolder/upcoming/shocker_unshakable.txt @@ -2,9 +2,9 @@ Name:Shocker, Unshakable ManaCost:4 R R Types:Legendary Creature Human Rogue Villain PT:5/5 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ First Strike| Condition$ PlayerTurn | Description$ During your turn, NICKNAME has first strike. +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ First Strike | Condition$ PlayerTurn | Description$ During your turn, NICKNAME has first strike. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Vibro-Shock Gauntlets — When NICKNAME enters, he deals 2 damage to target creature and 2 damage to that creature's controller. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | DamageMap$ True | SubAbility$ DBDamage +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | NumDmg$ 2 | DamageMap$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve Oracle:During your turn, Shocker has first strike.\nVibro-Shock Gauntlets — When Shocker enters, he deals 2 damage to target creature and 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt b/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt index ef991888a02..e9c82d77279 100644 --- a/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt +++ b/forge-gui/res/cardsfolder/upcoming/spider_man_2099.txt @@ -6,7 +6,7 @@ K:Double Strike K:Vigilance S:Mode$ CantBeCast | ValidCard$ Card.Self | EffectZone$ All | Caster$ Player.Active | CheckSVar$ Z | SVarCompare$ LE3 | Description$ You can't cast CARDNAME during your first, second, or third turns of the game. SVar:Z:Count$YourTurns -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ Y | SVarCompare$ EQ1 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your end step, if you’ve played a land or cast a spell this turn from anywhere other than your hand, CARDNAME deals damage equal to his power to any target. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ Y | SVarCompare$ EQ1 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your end step, if you've played a land or cast a spell this turn from anywhere other than your hand, CARDNAME deals damage equal to his power to any target. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X | AILogic$ PowerDmg SVar:X:Count$CardPower T:Mode$ LandPlayed | Origin$ Exile,Library,Graveyard | ValidCard$ Land.YouCtrl | Execute$ StoreVar | Static$ True @@ -15,4 +15,4 @@ T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigReset | Static$ True SVar:TrigReset:DB$ StoreSVar | SVar$ LandsPlayedFromNotHand | Type$ Number | Expression$ 0 SVar:Y:Count$ThisTurnCast_Card.YouCtrl+!wasCastFromYourHand/Plus.LandsPlayedFromNotHand SVar:LandsPlayedFromNotHand:Number$0 -Oracle:From the Future — You can’t cast Spider-Man 2099 during your first, second, or third turns of the game.\nDouble strike, vigilance\nAt the beginning of your end step, if you’ve played a land or cast a spell this turn from anywhere other than your hand, Spider-Man 2099 deals damage equal to his power to any target. +Oracle:From the Future — You can't cast Spider-Man 2099 during your first, second, or third turns of the game.\nDouble strike, vigilance\nAt the beginning of your end step, if you've played a land or cast a spell this turn from anywhere other than your hand, Spider-Man 2099 deals damage equal to his power to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt b/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt index 63190fc66d0..8076c295206 100644 --- a/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt +++ b/forge-gui/res/cardsfolder/upcoming/taxi_driver.txt @@ -2,5 +2,5 @@ Name:Taxi Driver ManaCost:1 R Types:Creature Human Pilot PT:3/1 -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. +A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. Oracle:{1}, {T}: Target creature gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt b/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt index b21be92ce28..3e4d20c4111 100644 --- a/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt +++ b/forge-gui/res/cardsfolder/upcoming/tombstone_career_criminal.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Legendary Creature Human Villain PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME enters, return target Villain card from your graveyard to your hand. -SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Villain.YouOwn | TgtPrompt$ Select target Villain card in your graveyard +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Villain.YouOwn | TgtPrompt$ Select target Villain card in your graveyard S:Mode$ ReduceCost | ValidCard$ Villain | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Villain spells you cast cost {1} less to cast. Oracle:When Tombstone enters, return target Villain card from your graveyard to your hand.\nVillain spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt b/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt index 92f48ff79b7..8388775fb38 100644 --- a/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt +++ b/forge-gui/res/cardsfolder/upcoming/unstable_experiment.txt @@ -1,6 +1,6 @@ Name:Unstable Experiment ManaCost:1 U Types:Instant -A:SP$ Draw | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBConnive | SpellDescription$ Target player draws a card, then up to one target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) -SVar:DBConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ 1 +A:SP$ Draw | ValidTgts$ Player | SubAbility$ DBConnive | SpellDescription$ Target player draws a card, then up to one target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:DBConnive:DB$ Connive | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to one target creature you control | TargetMin$ 0 | TargetMax$ 1 Oracle:Target player draws a card, then up to one target creature you control connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/venom_blast.txt b/forge-gui/res/cardsfolder/upcoming/venom_blast.txt index ab1c7d6a1b0..af3011c4560 100644 --- a/forge-gui/res/cardsfolder/upcoming/venom_blast.txt +++ b/forge-gui/res/cardsfolder/upcoming/venom_blast.txt @@ -2,6 +2,6 @@ Name:Venom Blast ManaCost:2 G G Types:Instant A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBDamage | SpellDescription$ Put two +1/+1 counters on target creature you control. It deals damage equal to its power to up to one other target creature. -SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TargetUnique$ True | TargetMin$ 0 | TargetMax$ 1 | NumDmg$ X | DamageSource$ ParentTarget | AILogic$ PowerDmg +SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TargetUnique$ True | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target creature | NumDmg$ X | DamageSource$ ParentTarget | AILogic$ PowerDmg SVar:X:ParentTargeted$CardPower Oracle:Put two +1/+1 counters on target creature you control. It deals damage equal to its power to up to one other target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt b/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt index bc54902b9b9..72d4a2f90b6 100644 --- a/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt +++ b/forge-gui/res/cardsfolder/upcoming/venom_evil_unleashed.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Legendary Creature Symbiote Villain PT:4/5 K:Deathtouch -A:AB$ PutCounter | Cost$ 2 B ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 2 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery. +A:AB$ PutCounter | Cost$ 2 B ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 2 | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Deathtouch Oracle:Deathtouch\n{2}{B}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt b/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt index 335234d0da7..c0ceb2c2b13 100644 --- a/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt +++ b/forge-gui/res/cardsfolder/upcoming/venoms_hunger.txt @@ -2,7 +2,7 @@ Name:Venom's Hunger ManaCost:4 B Types:Sorcery S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Villain.YouCtrl | Description$ This spell costs {2} less to cast if you control a Villain. -A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBLifeGain | SpellDescription$ Destroy target creature. You gain 2 life. +A:SP$ Destroy | ValidTgts$ Creature | SubAbility$ DBLifeGain | SpellDescription$ Destroy target creature. You gain 2 life. SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ 2 DeckHas:Ability$LifeGain DeckHints:Type$Villain diff --git a/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt b/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt index f6a332548d3..65b255a3f89 100644 --- a/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt +++ b/forge-gui/res/cardsfolder/upcoming/wild_pack_squad.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human Mercenary PT:2/2 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, up to one target creature gains first strike and vigilance until end of turn. -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target creature | KW$ First Strike & Vigilance +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target creature | KW$ First Strike & Vigilance SVar:PlayMain1:TRUE Oracle:At the beginning of combat on your turn, up to one target creature gains first strike and vigilance until end of turn. From 0d0fdd3c0b964e5977a07c22004ac379fc860fe9 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 25 Jul 2025 04:05:30 +0000 Subject: [PATCH 175/183] Update samis_curiosity.txt --- forge-gui/res/cardsfolder/s/samis_curiosity.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/samis_curiosity.txt b/forge-gui/res/cardsfolder/s/samis_curiosity.txt index 2ff4f175bfe..a712f793a85 100644 --- a/forge-gui/res/cardsfolder/s/samis_curiosity.txt +++ b/forge-gui/res/cardsfolder/s/samis_curiosity.txt @@ -1,6 +1,6 @@ Name:Sami's Curiosity ManaCost:G -Types:Instant +Types:Sorcery A:SP$ GainLife | LifeAmount$ 2 | SubAbility$ DBToken | SpellDescription$ You gain 2 life. Create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_lander_sac_search | TokenOwner$ You Oracle:You gain 2 life. Create a Lander token. (It's an artifact with "{2}, {T}, Sacrifice this token: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.") From af4a6de809c3f24c17e38b6527e8ee6e6a061c4b Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 25 Jul 2025 07:02:57 +0200 Subject: [PATCH 176/183] Refactor Offering (#8199) --- .../src/main/java/forge/game/GameActionUtil.java | 4 ++-- forge-game/src/main/java/forge/game/card/Card.java | 8 ++++---- .../src/main/java/forge/game/card/CardUtil.java | 10 +--------- .../main/java/forge/game/cost/CostAdjustment.java | 2 +- .../src/main/java/forge/game/keyword/Keyword.java | 14 -------------- .../res/cardsfolder/b/blast_furnace_hellkite.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_akki.txt | 2 +- .../res/cardsfolder/p/patron_of_the_kitsune.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_moon.txt | 2 +- .../res/cardsfolder/p/patron_of_the_nezumi.txt | 2 +- .../res/cardsfolder/p/patron_of_the_orochi.txt | 2 +- 11 files changed, 14 insertions(+), 36 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 73b4651689c..01cb02ea4ce 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -495,8 +495,8 @@ public final class GameActionUtil { String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); costs.add(new OptionalCostValue(OptionalCost.Flash, cost)); - } else if (keyword.endsWith(" offering")) { - final String type = keyword.split(" ")[0]; + } else if (keyword.startsWith("Offering")) { + final String type = keyword.split(":")[1]; final Cost cost = new Cost("Sac<1/" + type + ">", false); costs.add(new OptionalCostValue(OptionalCost.Offering, cost)); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 9749305e646..73cb4c124c9 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2726,13 +2726,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr sbLong.append(onlyMana? "" : ".").append(extra); sbLong.append(!complex ? " (" + (inst.getReminderText()) + ")" : ""); sbLong.append("\r\n"); - } else if (keyword.endsWith(" offering")) { - String offeringType = keyword.split(" ")[0]; + } else if (keyword.startsWith("Offering")) { + String type = keyword.split(":")[1]; if (sb.length() != 0) { sb.append("\r\n"); } - sbLong.append(keyword); - sbLong.append(" (").append(Keyword.getInstance("Offering:" + offeringType).getReminderText()).append(")"); + sbLong.append(type).append(" offering"); + sbLong.append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") || keyword.startsWith("Evoke") diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 7a9566f1026..6b15b6df13b 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -59,11 +59,8 @@ public final class CardUtil { "Fortify", "Transfigure", "Champion", "Evoke", "Prowl", "Freerunning", "Reinforce", "Unearth", "Level up", "Miracle", "Overload", "Cleave", "Scavenge", "Encore", "Bestow", "Outlast", "Dash", "Surge", "Emerge", "Hexproof:", - "Bands with other", "Landwalk", + "Bands with other", "Landwalk", "Offering", "etbCounter", "Reflect", "Ward").build(); - /** List of keyword endings of keywords that could be modified by text changes. */ - public static final ImmutableList modifiableKeywordEndings = ImmutableList.builder().add( - "cycling", "offering").build(); public static boolean isKeywordModifiable(final String kw) { for (final String modKw : modifiableKeywords) { @@ -71,11 +68,6 @@ public final class CardUtil { return true; } } - for (final String end : modifiableKeywordEndings) { - if (kw.endsWith(end)) { - return true; - } - } return false; } diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 2813dd4803c..ed0a6bda460 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -360,7 +360,7 @@ public class CostAdjustment { String offeringType = ""; for (KeywordInterface inst : sa.getHostCard().getKeywords(Keyword.OFFERING)) { final String kw = inst.getOriginal(); - offeringType = kw.split(" ")[0]; + offeringType = kw.split(":")[1]; break; } diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index d4fae8aae7c..9880c30b38b 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -253,20 +253,6 @@ public enum Keyword { details = ""; } - if (keyword == Keyword.UNDEFINED) { - //check for special keywords that have a prefix before the keyword enum name - int idx = k.indexOf(' '); - String enumName = k.replace(" ", "_").toUpperCase(Locale.ROOT); - String firstWord = idx == -1 ? enumName : enumName.substring(0, idx); - if (idx != -1) { - idx = k.indexOf(' ', idx + 1); - String secondWord = idx == -1 ? enumName.substring(firstWord.length() + 1) : enumName.substring(firstWord.length() + 1, idx); - if (secondWord.equalsIgnoreCase("OFFERING")) { - keyword = Keyword.OFFERING; - details = firstWord; - } - } - } KeywordInstance inst; try { inst = keyword.type.getConstructor().newInstance(); diff --git a/forge-gui/res/cardsfolder/b/blast_furnace_hellkite.txt b/forge-gui/res/cardsfolder/b/blast_furnace_hellkite.txt index 14acb981072..b4a1951e697 100644 --- a/forge-gui/res/cardsfolder/b/blast_furnace_hellkite.txt +++ b/forge-gui/res/cardsfolder/b/blast_furnace_hellkite.txt @@ -2,7 +2,7 @@ Name:Blast-Furnace Hellkite ManaCost:7 R R Types:Creature Dragon PT:5/5 -K:Artifact offering +K:Offering:Artifact K:Flying K:Double Strike S:Mode$ Continuous | Affected$ Creature.attacking Opponent | AddKeyword$ Double Strike | Description$ Creatures attacking your opponents have double strike. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt b/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt index 498fa26f045..7391d383e83 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt @@ -2,7 +2,7 @@ Name:Patron of the Akki ManaCost:4 R R Types:Legendary Creature Spirit PT:5/5 -K:Goblin offering +K:Offering:Goblin T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, creatures you control get +2/+0 until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +2 AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt b/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt index 908a5ba781e..bb976591943 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt @@ -2,7 +2,7 @@ Name:Patron of the Kitsune ManaCost:4 W W Types:Legendary Creature Spirit PT:5/6 -K:Fox offering +K:Offering:Fox T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ PatronLife | OptionalDecider$ You | TriggerDescription$ Whenever a creature attacks, you gain 1 life. SVar:PatronLife:DB$ GainLife | LifeAmount$ 1 AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt b/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt index 4125d1b57f1..4487555e47f 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt @@ -2,7 +2,7 @@ Name:Patron of the Moon ManaCost:5 U U Types:Legendary Creature Spirit PT:5/4 -K:Moonfolk offering +K:Offering:Moonfolk K:Flying A:AB$ ChangeZone | Cost$ 1 | ChangeNum$ 2 | Origin$ Hand | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.YouCtrl | SpellDescription$ Put up to two land cards from your hand onto the battlefield tapped. AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt b/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt index ac26af8c747..0e8a09d400d 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt @@ -2,7 +2,7 @@ Name:Patron of the Nezumi ManaCost:5 B B Types:Legendary Creature Spirit PT:6/6 -K:Rat offering +K:Offering:Rat T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Card.OppOwn | Execute$ TrigLoseLife | TriggerDescription$ Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredCardOwner | LifeAmount$ 1 AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt b/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt index d0f25207880..3ee142e83fb 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt @@ -2,7 +2,7 @@ Name:Patron of the Orochi ManaCost:6 G G Types:Legendary Creature Spirit PT:7/7 -K:Snake offering +K:Offering:Snake A:AB$ UntapAll | Cost$ T | ValidCards$ Forest,Creature.Green | ActivationLimit$ 1 | SpellDescription$ Untap all Forests and all green creatures. Activate only once each turn. AI:RemoveDeck:All Oracle:Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.)\n{T}: Untap all Forests and all green creatures. Activate only once each turn. From e86f4e80cb7f38c6ed3157b668dc232c3662c585 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 25 Jul 2025 06:06:08 +0100 Subject: [PATCH 177/183] Spectacular Spider-Man: fixing typos --- forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt b/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt index 07caebb9f28..63409d99196 100644 --- a/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt +++ b/forge-gui/res/cardsfolder/upcoming/spectacular_spider_man.txt @@ -5,4 +5,4 @@ PT:3/2 K:Flash A:AB$ Pump | Cost$ 1 | KW$ Flying | Defined$ Self | SpellDescription$ CARDNAME gains flying until end of turn. A:AB$ PumpAll | Cost$ 1 Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Indestructible & Hexproof | SpellDescription$ Creatures you control gain hexproof and indestructible until end of turn. -Oracle:Flash\n{1}: Spectacular Spider-Man gains flying until end of turn.\n{1}, Sacrifice Spectaculer Spider-Man: Creatures you control gain hexproof and indescructible until end of turn. +Oracle:Flash\n{1}: Spectacular Spider-Man gains flying until end of turn.\n{1}, Sacrifice Spectacular Spider-Man: Creatures you control gain hexproof and indestructible until end of turn. From ad0c81e984d8f2d301cfdf7c1ab9812742f513fc Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Fri, 25 Jul 2025 09:25:14 +0200 Subject: [PATCH 178/183] Update alchemax_slayer_bots.txt (#8198) * Update alchemax_slayer_bots.txt * Update TypeLists.txt --- forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt | 2 +- forge-gui/res/lists/TypeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt index e4e9b4f1053..e9bf160b435 100644 --- a/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt +++ b/forge-gui/res/cardsfolder/upcoming/alchemax_slayer_bots.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Artifact Creature Robot Villain PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) -SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target an opponent controls | SubAbility$ DBPutCounter +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 Oracle:When this creature enters, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index b525d7f8140..f9c3bb33af2 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -223,6 +223,7 @@ Pangolin:Pangolins Peasant:Peasants Pegasus:Pegasi Pentavite:Pentavites +Performer:Performers Pest:Pests Phelddagrif:Phelddagrifs Phoenix:Phoenixes From 9d1b935643a9eaa52fd575a4c2312b12292c38b4 Mon Sep 17 00:00:00 2001 From: Eradev Date: Fri, 25 Jul 2025 04:06:40 -0400 Subject: [PATCH 179/183] Advanced filtering using the search box (#8077) * Allow search by type and cmc * Allow colon and added aliases to cmc * Support negate * Extract parser function into its own file * Support for "!" * Colors test * Color search * Oracle text * Numeric p/t search * Set search + fixes * Typo * Rarity check * Loyalty * Cleanup * Case ignore for kw * Support for "or" * Rename method * Support parentheses * Add cases for l * Cleanup * Use PaperCardPredicates.printedInSet * Fix in set to remove conjured cards * Use func * Remove redundant check --- .../src/main/java/forge/card/CardRarity.java | 1 - .../src/main/java/forge/card/CardRules.java | 2 +- .../java/forge/card/CardRulesPredicates.java | 65 ++- .../java/forge/item/PaperCardPredicates.java | 49 +- .../itemmanager/AdvancedSearchParser.java | 511 ++++++++++++++++++ .../java/forge/itemmanager/SFilterUtil.java | 260 +++++++-- .../advancedsearchparsers/InParser.java | 38 ++ .../advancedsearchparsers/RarityParser.java | 195 +++++++ 8 files changed, 1074 insertions(+), 47 deletions(-) create mode 100644 forge-gui/src/main/java/forge/itemmanager/AdvancedSearchParser.java create mode 100644 forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/InParser.java create mode 100644 forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/RarityParser.java diff --git a/forge-core/src/main/java/forge/card/CardRarity.java b/forge-core/src/main/java/forge/card/CardRarity.java index c6663162bf3..65ed1a7dae1 100644 --- a/forge-core/src/main/java/forge/card/CardRarity.java +++ b/forge-core/src/main/java/forge/card/CardRarity.java @@ -55,5 +55,4 @@ public enum CardRarity { } return Unknown; } - } diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index e1c99fbe57c..f1a891e1511 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -814,7 +814,7 @@ public final class CardRules implements ICardCharacteristics { public boolean hasStartOfKeyword(final String k, ICardFace cf) { for (final String inst : cf.getKeywords()) { final String[] parts = inst.split(":"); - if (parts[0].equals(k)) { + if ((parts[0]).equalsIgnoreCase(k)) { return true; } } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index 5156ae5b057..dd3f8f6ad6b 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -63,7 +63,14 @@ public final class CardRulesPredicates { return new LeafNumber(LeafNumber.CardField.TOUGHNESS, op, what); } - // P/T + public static Predicate pt(final ComparableOp op, final int what) { + return new LeafNumber(LeafNumber.CardField.PT, op, what); + } + + public static Predicate loyalty(final ComparableOp op, final int what) { + return new LeafNumber(LeafNumber.CardField.LOYALTY, op, what); + } + /** * Rules. * @@ -248,6 +255,18 @@ public final class CardRulesPredicates { return new LeafColor(LeafColor.ColorOperator.CountColorsGreaterOrEqual, cntColors); } + public static Predicate hasMoreCntColors(final byte cntColors) { + return new LeafColor(LeafColor.ColorOperator.CountColorsGreater, cntColors); + } + + public static Predicate hasAtMostCntColors(final byte cntColors) { + return new LeafColor(LeafColor.ColorOperator.CountColorsSmallerOrEqual, cntColors); + } + + public static Predicate hasLessCntColors(final byte cntColors) { + return new LeafColor(LeafColor.ColorOperator.CountColorsSmaller, cntColors); + } + public static Predicate hasColorIdentity(final int colormask) { return rules -> rules.getColorIdentity().hasNoColorsExcept(colormask); } @@ -355,7 +374,15 @@ public final class CardRulesPredicates { private static class LeafColor implements Predicate { public enum ColorOperator { - CountColors, CountColorsGreaterOrEqual, HasAnyOf, HasAllOf, Equals, CanCast + CountColors, + CountColorsGreaterOrEqual, + CountColorsGreater, + CountColorsSmallerOrEqual, + CountColorsSmaller, + HasAnyOf, + HasAllOf, + Equals, + CanCast } private final LeafColor.ColorOperator op; @@ -371,17 +398,24 @@ public final class CardRulesPredicates { if (null == subject) { return false; } + ColorSet cardColor = subject.getColor(); switch (this.op) { case CountColors: - return subject.getColor().countColors() == this.color; + return cardColor.countColors() == this.color; case CountColorsGreaterOrEqual: - return subject.getColor().countColors() >= this.color; + return cardColor.countColors() >= this.color; + case CountColorsGreater: + return cardColor.countColors() > this.color; + case CountColorsSmallerOrEqual: + return cardColor.countColors() <= this.color; + case CountColorsSmaller: + return cardColor.countColors() < this.color; case Equals: - return subject.getColor().isEqual(this.color); + return cardColor.isEqual(this.color); case HasAllOf: - return subject.getColor().hasAllColors(this.color); + return cardColor.hasAllColors(this.color); case HasAnyOf: - return subject.getColor().hasAnyColor(this.color); + return cardColor.hasAnyColor(this.color); case CanCast: return subject.canCastWithAvailable(this.color); default: @@ -392,7 +426,7 @@ public final class CardRulesPredicates { public static class LeafNumber implements Predicate { public enum CardField { - CMC, GENERIC_COST, POWER, TOUGHNESS + CMC, GENERIC_COST, POWER, TOUGHNESS, PT, LOYALTY } private final LeafNumber.CardField field; @@ -413,12 +447,27 @@ public final class CardRulesPredicates { return this.op(card.getManaCost().getCMC(), this.operand); case GENERIC_COST: return this.op(card.getManaCost().getGenericCost(), this.operand); + case LOYALTY: + String sLoyalty = card.getInitialLoyalty(); + if (StringUtils.isBlank(sLoyalty) || !sLoyalty.matches("\\d+")) { + return false; + } + try { + value = Integer.parseInt(sLoyalty) ; + } + catch (NumberFormatException ignored) { + return false; + } + return this.op(value, this.operand); case POWER: value = card.getIntPower(); return value != Integer.MAX_VALUE && this.op(value, this.operand); case TOUGHNESS: value = card.getIntToughness(); return value != Integer.MAX_VALUE && this.op(value, this.operand); + case PT: + value = card.getIntPower() + card.getIntToughness(); + return value != Integer.MAX_VALUE && this.op(value, this.operand); default: return false; } diff --git a/forge-core/src/main/java/forge/item/PaperCardPredicates.java b/forge-core/src/main/java/forge/item/PaperCardPredicates.java index 2bc72a6b38b..c7c17012417 100644 --- a/forge-core/src/main/java/forge/item/PaperCardPredicates.java +++ b/forge-core/src/main/java/forge/item/PaperCardPredicates.java @@ -4,12 +4,15 @@ import com.google.common.collect.Lists; import forge.StaticData; import forge.card.*; +import forge.card.CardEdition.EditionEntry; import forge.util.PredicateString; import org.apache.commons.lang3.StringUtils; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.TreeSet; import java.util.function.Predicate; /** @@ -35,6 +38,10 @@ public abstract class PaperCardPredicates { return new PredicateSets(Lists.newArrayList(value), true); } + public static Predicate printedWithRarity(final CardRarity rarity) { + return new PredicatePrintedWithRarity(rarity); + } + public static Predicate name(final String what) { return new PredicateName(what); } @@ -43,8 +50,25 @@ public abstract class PaperCardPredicates { return new PredicateNames(what); } - private static final class PredicateColor implements Predicate { + private static final class PredicatePrintedWithRarity implements Predicate { + private final CardRarity matchingRarity; + @Override + public boolean test(final PaperCard card) { + return StaticData.instance().getEditions().stream() + .anyMatch(ce -> { + List entries = ce.getCardInSet(card.getName()); + return entries != null && entries.stream() + .anyMatch(ee -> ee.rarity() == matchingRarity); + }); + } + + private PredicatePrintedWithRarity(final CardRarity rarity) { + this.matchingRarity = rarity; + } + } + + private static final class PredicateColor implements Predicate { private final byte operand; private PredicateColor(final byte color) { @@ -67,7 +91,6 @@ public abstract class PaperCardPredicates { } return false; } - } private static final class PredicateRarity implements Predicate { @@ -75,11 +98,24 @@ public abstract class PaperCardPredicates { @Override public boolean test(final PaperCard card) { - return (card.getRarity() == this.operand); + return card.getRarity() == this.operand; } - private PredicateRarity(final CardRarity type) { - this.operand = type; + private PredicateRarity(final CardRarity rarity) { + this.operand = rarity; + } + } + + public static final class PredicateRarities implements Predicate { + private final HashSet operand; + + @Override + public boolean test(final PaperCard card) { + return this.operand.contains(card.getRarity()); + } + + public PredicateRarities(CardRarity... rarities) { + this.operand = new HashSet<>(Arrays.asList(rarities)); } } @@ -94,7 +130,8 @@ public abstract class PaperCardPredicates { } private PredicateSets(final List wantSets, final boolean shouldContain) { - this.sets = new HashSet<>(wantSets); + this.sets = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + this.sets.addAll(wantSets); this.mustContain = shouldContain; } } diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearchParser.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearchParser.java new file mode 100644 index 00000000000..7543e4df80d --- /dev/null +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearchParser.java @@ -0,0 +1,511 @@ +package forge.itemmanager; + +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.CardRulesPredicates.LeafNumber; +import forge.card.MagicColor; +import forge.item.PaperCard; +import forge.item.PaperCardPredicates; +import forge.itemmanager.advancedsearchparsers.InParser; +import forge.itemmanager.advancedsearchparsers.RarityParser; +import forge.util.ComparableOp; +import forge.util.PredicateString.StringOp; + +import java.util.function.Predicate; + +public abstract class AdvancedSearchParser { + + public static Predicate parseAdvancedRulesToken(String token) { + boolean negated = false; + if (token.startsWith("-")) { + token = token.substring(1).trim(); + negated = true; + } + + String[] operators = {"!=", "<=", ">=", "=", "<", ">", ":", "!"}; + int index = -1; + String opUsed = null; + for (String op : operators) { + int idx = token.indexOf(op); + if (idx >= 0) { + index = idx; + opUsed = op; + break; + } + } + if (index < 0) { + return null; + } + + ComparableOp op = getComparableOp(opUsed); + if (op == null) { + return null; + } + + String key = token.substring(0, index).trim().toLowerCase(); + String valueStr = token.substring(index + opUsed.length()).trim().toLowerCase(); + boolean creatureOnly = false; + + Predicate predicate = null; + switch (key) { + case "o": + case "oracle": + switch (opUsed) { + case ":": + case "=": + predicate = CardRulesPredicates.rules(StringOp.CONTAINS_IC, valueStr); + break; + } + break; + + case "power": + case "pow": + if (valueStr.matches("\\d+")) { + try { + int power = Integer.parseInt(valueStr); + creatureOnly = true; + predicate = CardRulesPredicates.power(op, power); + } + catch (NumberFormatException ignored) {} + } else { + switch(valueStr) { + case "toughness": + case "tou": + creatureOnly = true; + predicate = c -> { + int toughness = c.getIntToughness(); + return new LeafNumber(LeafNumber.CardField.POWER, op, toughness).test(c); + }; + break; + } + } + break; + + case "toughness": + case "tou": + if (valueStr.matches("\\d+")) { + try { + int toughness = Integer.parseInt(valueStr); + creatureOnly = true; + predicate = CardRulesPredicates.toughness(op, toughness); + } + catch (NumberFormatException ignored) {} + } else { + switch(valueStr) { + case "power": + case "pow": + creatureOnly = true; + predicate = c -> { + int power = c.getIntPower(); + return new LeafNumber(LeafNumber.CardField.TOUGHNESS, op, power).test(c); + }; + break; + } + } + break; + + case "pt": + case "powtou": + if (valueStr.matches("\\d+")) { + try { + int power = Integer.parseInt(valueStr); + creatureOnly = true; + predicate = CardRulesPredicates.pt(op, power); + } + catch (NumberFormatException ignored) {} + } + break; + + case "loy": + case "loyalty": + if (valueStr.matches("\\d+")) { + try { + int loyalty = Integer.parseInt(valueStr); + predicate = CardRulesPredicates.loyalty(op, loyalty); + } + catch (NumberFormatException ignored) {} + } + break; + + case "cmc": + case "mv": + case "manavalue": + try { + int cmcValue = Integer.parseInt(valueStr); + predicate = CardRulesPredicates.cmc(op, cmcValue); + } + catch (NumberFormatException ignored) {} + break; + + case "t": + case "type": + switch (opUsed) { + case ":": + case "=": + predicate = CardRulesPredicates.joinedType(StringOp.CONTAINS_IC, valueStr); + break; + + case "!=": + predicate = CardRulesPredicates.joinedType(StringOp.CONTAINS_IC, valueStr).negate(); + break; + } + break; + + case "kw": + case "keyword": + switch (opUsed) { + case ":": + case "=": + predicate = CardRulesPredicates.hasKeyword(valueStr); + break; + + case "!=": + predicate = CardRulesPredicates.hasKeyword(valueStr).negate(); + break; + } + break; + + case "c": + case "color": + if (valueStr.matches("\\d+")) { + try { + byte colorCnt = Byte.parseByte(valueStr); + + switch (opUsed) { + case ":": + case "=": + predicate = CardRulesPredicates.hasCntColors(colorCnt); + break; + + case "!": + case "!=": + predicate = CardRulesPredicates.hasCntColors(colorCnt).negate(); + break; + + case ">=": + predicate = CardRulesPredicates.hasAtLeastCntColors(colorCnt); + break; + + case ">": + predicate = CardRulesPredicates.hasMoreCntColors(colorCnt); + break; + + case "<=": + predicate = CardRulesPredicates.hasAtMostCntColors(colorCnt); + break; + + case "<": + predicate = CardRulesPredicates.hasLessCntColors(colorCnt); + break; + } + } + catch (NumberFormatException ignored) {} + } else { + switch(valueStr) { + case "c": + case "colorless": + switch (opUsed) { + case ":": + case "=": + case "<=": + predicate = CardRulesPredicates.IS_COLORLESS; + break; + + case "!=": + case ">": + predicate = CardRulesPredicates.IS_COLORLESS.negate(); + break; + } + break; + + case "m": + case "multi": + case "multicolor": + switch (opUsed) { + case "!": + case ":": + case "=": + case ">=": + case ">": + predicate = CardRulesPredicates.IS_MULTICOLOR; + break; + + case "!=": + predicate = CardRulesPredicates.IS_MONOCOLOR; + break; + + case "<": + predicate = CardRulesPredicates.hasAtMostCntColors((byte)1); + break; + } + break; + + default: + byte givenMask = getColorMaskFromString(valueStr); + switch (opUsed) { + case ":": + case ">=": + predicate = card -> { + byte cardMask = card.getColor().getColor(); + + return (cardMask & givenMask) == givenMask; + }; + break; + + case "!": + case "=": + predicate = card -> card.getColor().getColor() == givenMask; + break; + + case "!=": + predicate = card -> card.getColor().getColor() != givenMask; + break; + + case ">": + predicate = card -> { + byte cardMask = card.getColor().getColor(); + return (cardMask & givenMask) == givenMask && (cardMask & ~givenMask) != 0; + }; + break; + + case "<=": + predicate = card -> { + byte cardMask = card.getColor().getColor(); + return (cardMask & ~givenMask) == 0; + }; + break; + + case "<": + predicate = card -> { + byte cardMask = card.getColor().getColor(); + return (cardMask & ~givenMask) == 0 && cardMask != givenMask; + }; + break; + } + } + } + break; + + case "name": + switch(opUsed) { + case "!": + predicate = CardRulesPredicates.name(StringOp.EQUALS_IC, valueStr); + break; + + case "!=": + predicate = CardRulesPredicates.name(StringOp.EQUALS_IC, valueStr).negate(); + break; + + case "=": + case ":": + predicate = CardRulesPredicates.name(StringOp.CONTAINS_IC, valueStr); + break; + } + break; + } + + if (predicate == null) { + return null; + } + + if (negated) { + predicate = predicate.negate(); + } + + if (creatureOnly) { + predicate = CardRulesPredicates.IS_CREATURE.and(predicate); + } + + return predicate; + } + + public static Predicate parseAdvancedPaperCardToken(String token) { + boolean negated = false; + if (token.startsWith("-")) { + token = token.substring(1).trim(); + negated = true; + } + + String[] operators = {"!=", "<=", ">=", "=", "<", ">", ":", "!"}; + int index = -1; + String opUsed = null; + for (String op : operators) { + int idx = token.indexOf(op); + if (idx >= 0) { + index = idx; + opUsed = op; + break; + } + } + if (index < 0) { + return null; + } + + String key = token.substring(0, index).trim().toLowerCase(); + String valueStr = token.substring(index + opUsed.length()).trim().toLowerCase(); + + Predicate predicate = null; + switch (key) { + case "set": + case "s": + case "edition": + case "e": + switch (opUsed) { + case ":": + case "=": + predicate = PaperCardPredicates.printedInSet(valueStr); + break; + + case "!=": + predicate = PaperCardPredicates.printedInSet(valueStr).negate(); + break; + } + break; + + case "in": + switch (opUsed) { + case ":": + case "=": + predicate = InParser.handle(valueStr); + break; + + case "!=": + predicate = InParser.handle(valueStr).negate(); + break; + } + break; + + case "r": + case "rarity": + switch (opUsed) { + case "!": + case ":": + case "=": + predicate = RarityParser.handleExact(valueStr); + break; + + case "!=": + predicate = RarityParser.handleExact(valueStr); + if (predicate != null) { + predicate = predicate.negate(); + } + break; + + case ">": + predicate = RarityParser.handleGreater(valueStr); + break; + + case ">=": + predicate = RarityParser.handleGreaterOrEqual(valueStr); + break; + + case "<": + predicate = RarityParser.handleLess(valueStr); + break; + + case "<=": + predicate = RarityParser.handleLessOrEqual(valueStr); + break; + } + break; + } + + if (predicate == null) { + return null; + } + + if (negated) { + predicate = predicate.negate(); + } + + return predicate; + } + + private static ComparableOp getComparableOp(String opUsed) { + ComparableOp op = null; + switch (opUsed) { + case "!": + case ":": + case "=": op = ComparableOp.EQUALS; break; + case "!=": op = ComparableOp.NOT_EQUALS; break; + case ">=": op = ComparableOp.GT_OR_EQUAL; break; + case ">": op = ComparableOp.GREATER_THAN; break; + case "<=": op = ComparableOp.LT_OR_EQUAL; break; + case "<": op = ComparableOp.LESS_THAN; break; + } + return op; + } + + private static byte getColorMaskFromString(String valueStr) { + valueStr = valueStr.toLowerCase(); + + switch (valueStr) { + case "white": return MagicColor.WHITE; + case "blue": return MagicColor.BLUE; + case "black": return MagicColor.BLACK; + case "red": return MagicColor.RED; + case "green": return MagicColor.GREEN; + + // Ravnica guilds + Strixhaven colleges + case "azorius": return MagicColor.WHITE | MagicColor.BLUE; + case "dimir": return MagicColor.BLUE | MagicColor.BLACK; + case "rakdos": return MagicColor.BLACK | MagicColor.RED; + case "gruul": return MagicColor.RED | MagicColor.GREEN; + case "selesnya": return MagicColor.WHITE | MagicColor.GREEN; + case "silverquill": + case "orzhov": return MagicColor.WHITE | MagicColor.BLACK; + case "prismari": + case "izzet": return MagicColor.BLUE | MagicColor.RED; + case "witherbloom": + case "golgari": return MagicColor.BLACK | MagicColor.GREEN; + case "lorehold": + case "boros": return MagicColor.WHITE | MagicColor.RED; + case "quandrix": + case "simic": return MagicColor.BLUE | MagicColor.GREEN; + + // Alara Shards + New Capenna Families + case "brokers": + case "bant": return MagicColor.WHITE | MagicColor.BLUE | MagicColor.GREEN; + case "obscura": + case "esper": return MagicColor.WHITE | MagicColor.BLUE | MagicColor.BLACK; + case "maestros": + case "grixis": return MagicColor.BLUE | MagicColor.BLACK | MagicColor.RED; + case "riveteers": + case "jund": return MagicColor.BLACK | MagicColor.RED | MagicColor.GREEN; + case "cabaretti": + case "naya": return MagicColor.WHITE | MagicColor.RED | MagicColor.GREEN; + + // Tarkir Clans + Ikoria Triomes + case "indatha": + case "abzan": return MagicColor.WHITE | MagicColor.BLACK | MagicColor.GREEN; + case "raugrin": + case "jeskai": return MagicColor.WHITE | MagicColor.BLUE | MagicColor.RED; + case "zagoth": + case "sultai": return MagicColor.BLUE | MagicColor.BLACK | MagicColor.GREEN; + case "savai": + case "mardu": return MagicColor.WHITE | MagicColor.BLACK | MagicColor.RED; + case "ketria": + case "temur": return MagicColor.BLUE | MagicColor.RED | MagicColor.GREEN; + + // Four-color Identities + case "chaos": return MagicColor.BLACK | MagicColor.GREEN | MagicColor.RED | MagicColor.BLUE; + case "aggression": return MagicColor.BLACK | MagicColor.GREEN | MagicColor.RED | MagicColor.WHITE; + case "altruism": return MagicColor.GREEN | MagicColor.RED | MagicColor.BLUE | MagicColor.WHITE; + case "growth": return MagicColor.BLACK | MagicColor.GREEN | MagicColor.BLUE | MagicColor.WHITE; + case "artifice": return MagicColor.BLACK | MagicColor.RED | MagicColor.BLUE | MagicColor.WHITE; + + case "all": return MagicColor.ALL_COLORS; + + default: + byte mask = 0; + for (char c : valueStr.toCharArray()) { + byte color = MagicColor.fromName(c); + if (color == 0) { + continue; + } + mask |= color; + } + return mask; + } + } +} diff --git a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java index 496884ef97e..74ec44eeb4c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java @@ -34,7 +34,6 @@ import forge.util.PredicateString.StringOp; * (S at beginning of class name denotes a static factory.) */ public class SFilterUtil { - /** * builds a string search filter */ @@ -45,37 +44,143 @@ public class SFilterUtil { return x -> true; } - if (BooleanExpression.isExpression(text)) { - BooleanExpression expression = new BooleanExpression(text, inName, inType, inText, inCost); - - try { - Predicate filter = expression.evaluate(); - if (filter != null) { - return PaperCardPredicates.fromRules(invert ? filter.negate() : filter); + try { + List tokens = tokenize(text); + tokens = insertImplicitAndTokens(tokens); + ExpressionParser parser = new ExpressionParser(tokens, inName, inType, inText, inCost); + Predicate predicate = parser.parse(); + if (invert) { + predicate = predicate.negate(); + } + return predicate; + } catch (Exception e) { + e.printStackTrace(); + return x -> false; + } + } + + private static List tokenize(String text) { + List tokens = new ArrayList<>(); + StringBuilder current = new StringBuilder(); + boolean inQuotes = false; + boolean escapeNext = false; + + for (int i = 0; i < text.length(); i++) { + char ch = text.charAt(i); + + if (escapeNext) { + current.append(ch); + escapeNext = false; + continue; + } + + if (ch == '\\') { + escapeNext = true; + continue; + } + + if (ch == '"') { + inQuotes = !inQuotes; + continue; + } + + if (!inQuotes && (ch == '(' || ch == ')' || ch == ' ')) { + if (current.length() > 0) { + tokens.add(current.toString()); + current = new StringBuilder(); } + if (ch != ' ') { + tokens.add(String.valueOf(ch)); + } + continue; } - catch (Exception ignored) { - ignored.printStackTrace(); - //Continue with standard filtering if the expression is not valid. + + current.append(ch); + } + + if (current.length() > 0) { + tokens.add(current.toString()); + } + + return tokens; + } + + private static List insertImplicitAndTokens(List tokens) { + if (tokens.isEmpty()) { + return tokens; + } + + List result = new ArrayList<>(); + result.add(tokens.get(0)); + + for (int i = 1; i < tokens.size(); i++) { + String prev = tokens.get(i - 1); + String current = tokens.get(i); + + if (!prev.equals("(") && + !prev.equalsIgnoreCase("or") && + !prev.equalsIgnoreCase("and") && + !current.equals(")") && + !current.equalsIgnoreCase("or") && + !current.equalsIgnoreCase("and") && + !current.equalsIgnoreCase("not")) { + result.add("and"); + } + result.add(current); + } + + return result; + } + private static Predicate buildPredicateFromTokens(String segment, boolean inName, boolean inType, boolean inText, boolean inCost) { + List tokens = getSplitText(segment); + List> advancedCardRulesPredicates = new ArrayList<>(); + List> advancedPaperCardPredicates = new ArrayList<>(); + List regularTokens = new ArrayList<>(); + + for (String token : tokens) { + Predicate advCardRules = AdvancedSearchParser.parseAdvancedRulesToken(token); + Predicate advPaperCard = AdvancedSearchParser.parseAdvancedPaperCardToken(token); + + if (advCardRules != null) { + advancedCardRulesPredicates.add(advCardRules); + } + + if (advPaperCard != null) { + advancedPaperCardPredicates.add(advPaperCard); + } + + if (advCardRules == null && advPaperCard == null) { + regularTokens.add(token); } } - List splitText = getSplitText(text); - List> terms = new ArrayList<>(); - for (String s : splitText) { - List> subands = new ArrayList<>(); - - if (inName) { subands.add(CardRulesPredicates.name(StringOp.CONTAINS_IC, s)); } - if (inType) { subands.add(CardRulesPredicates.joinedType(StringOp.CONTAINS_IC, s)); } - if (inText) { subands.add(CardRulesPredicates.rules(StringOp.CONTAINS_IC, s)); } - if (inCost) { subands.add(CardRulesPredicates.cost(StringOp.CONTAINS_IC, s)); } - - terms.add(IterableUtil.or(subands)); - } Predicate textFilter; - textFilter = invert ? IterableUtil.or(terms).negate() : IterableUtil.and(terms); + if (advancedCardRulesPredicates.isEmpty()) { + if (BooleanExpression.isExpression(segment)) { + BooleanExpression expression = new BooleanExpression(segment, inName, inType, inText, inCost); + + try { + Predicate filter = expression.evaluate(); + if (filter != null) { + textFilter = filter; + } else { + textFilter = buildRegularTextPredicate(regularTokens, inName, inType, inText, inCost); + } + } + catch (Exception e) { + e.printStackTrace(); + textFilter = buildRegularTextPredicate(regularTokens, inName, inType, inText, inCost); + } + } else { + textFilter = buildRegularTextPredicate(regularTokens, inName, inType, inText, inCost); + } + } else { + Predicate advancedCardRulesPredicate = IterableUtil.and(advancedCardRulesPredicates); + Predicate regularPredicate = buildRegularTextPredicate(regularTokens, inName, inType, inText, inCost); + textFilter = advancedCardRulesPredicate.and(regularPredicate); + } - return PaperCardPredicates.fromRules(textFilter); + return PaperCardPredicates.fromRules(textFilter).and(IterableUtil.and(advancedPaperCardPredicates)); } private static List getSplitText(String text) { @@ -86,7 +191,7 @@ public class SFilterUtil { char ch = text.charAt(i); switch (ch) { case ' ': - if (!inQuotes) { //if not in quotes, end current entry + if (!inQuotes) { // If not in quotes, end current entry if (entry.length() > 0) { splitText.add(entry.toString()); entry = new StringBuilder(); @@ -96,27 +201,46 @@ public class SFilterUtil { break; case '"': inQuotes = !inQuotes; - continue; //don't append quotation character itself + continue; // Don't append quotation character itself case '\\': if (i < text.length() - 1 && text.charAt(i + 1) == '"') { - ch = '"'; //allow appending escaped quotation character - i++; //prevent changing inQuotes for that character + ch = '"'; // Allow appending escaped quotation character + i++; // Prevent changing inQuotes for that character } break; case ',': - if (!inQuotes) { //ignore commas outside quotes + if (!inQuotes) { // Ignore commas outside quotes continue; } break; } entry.append(ch); } - if (entry.length() > 0) { + if (!entry.isEmpty()) { splitText.add(entry.toString()); } return splitText; } + private static Predicate buildRegularTextPredicate(List tokens, boolean inName, boolean inType, boolean inText, boolean inCost) { + if (tokens.isEmpty()) { + return x -> true; + } + + List> terms = new ArrayList<>(); + for (String s : tokens) { + List> subands = new ArrayList<>(); + + if (inName) { subands.add(CardRulesPredicates.name(StringOp.CONTAINS_IC, s)); } + if (inType) { subands.add(CardRulesPredicates.joinedType(StringOp.CONTAINS_IC, s)); } + if (inText) { subands.add(CardRulesPredicates.rules(StringOp.CONTAINS_IC, s)); } + if (inCost) { subands.add(CardRulesPredicates.cost(StringOp.CONTAINS_IC, s)); } + + terms.add(IterableUtil.or(subands)); + } + return IterableUtil.and(terms); + } + public static Predicate buildItemTextFilter(String text) { if (text.trim().isEmpty()) { return x -> true; @@ -125,6 +249,80 @@ public class SFilterUtil { return new ItemTextPredicate<>(text); } + private static class ExpressionParser { + private final List tokens; + private int index; + private final boolean inName; + private final boolean inType; + private final boolean inText; + private final boolean inCost; + + public ExpressionParser(List tokens, boolean inName, boolean inType, boolean inText, boolean inCost) { + this.tokens = tokens; + this.index = 0; + this.inName = inName; + this.inType = inType; + this.inText = inText; + this.inCost = inCost; + } + + public Predicate parse() { + return parseOr(); + } + + private Predicate parseOr() { + Predicate left = parseAnd(); + while (index < tokens.size() && tokens.get(index).equalsIgnoreCase("or")) { + index++; + Predicate right = parseAnd(); + left = left.or(right); + } + return left; + } + + private Predicate parseAnd() { + Predicate left = parseNot(); + while (index < tokens.size() && tokens.get(index).equalsIgnoreCase("and")) { + index++; + Predicate right = parseNot(); + left = left.and(right); + } + return left; + } + + private Predicate parseNot() { + if (index < tokens.size() && tokens.get(index).equalsIgnoreCase("not")) { + index++; + return parseNot().negate(); + } + return parsePrimary(); + } + + private Predicate parsePrimary() { + if (index < tokens.size() && tokens.get(index).equals("(")) { + index++; + Predicate expr = parseOr(); + if (index >= tokens.size() || !tokens.get(index).equals(")")) { + throw new RuntimeException("Mismatched parentheses"); + } + index++; + return expr; + } else if (index < tokens.size()) { + String token = tokens.get(index); + index++; + return buildPredicateFromToken(token); + } else { + throw new RuntimeException("Unexpected end of expression"); + } + } + + private Predicate buildPredicateFromToken(String token) { + List tokenList = new ArrayList<>(); + tokenList.add(token); + return buildPredicateFromTokens(String.join(" ", tokenList), inName, inType, inText, inCost); + } + } + private static class ItemTextPredicate implements Predicate { private final List splitText; diff --git a/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/InParser.java b/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/InParser.java new file mode 100644 index 00000000000..68cefb982da --- /dev/null +++ b/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/InParser.java @@ -0,0 +1,38 @@ +package forge.itemmanager.advancedsearchparsers; + +import java.util.function.Predicate; + +import forge.StaticData; +import forge.card.CardEdition; +import forge.card.CardRarity; +import forge.item.PaperCard; +import forge.item.PaperCardPredicates; + +public abstract class InParser { + /** + * Handles both if a card was printed in a set, or in a rarity. + * @param tokenValue Token value + * @return Predicate + */ + public static Predicate handle(String tokenValue) { + Predicate predicate = null; + CardRarity rarity = RarityParser.ParseRarityFromStr(tokenValue); + + if (rarity == null) { + // Not a rarity. Assume it is a set + predicate = c -> { + CardEdition e = StaticData.instance().getEditions().get(tokenValue); + + if (e == null) { + return false; + } + + return e.isCardObtainable(c.getName()); + }; + } else { + predicate = PaperCardPredicates.printedWithRarity(rarity); + } + + return predicate; + } +} diff --git a/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/RarityParser.java b/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/RarityParser.java new file mode 100644 index 00000000000..9b46977a92d --- /dev/null +++ b/forge-gui/src/main/java/forge/itemmanager/advancedsearchparsers/RarityParser.java @@ -0,0 +1,195 @@ +package forge.itemmanager.advancedsearchparsers; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Predicate; + +import forge.card.CardRarity; +import forge.item.PaperCard; +import forge.item.PaperCardPredicates; +import forge.util.ComparableOp; + +public abstract class RarityParser { + private static final Map RARITY_RANK; + static { + RARITY_RANK = new HashMap<>(); + RARITY_RANK.put(CardRarity.BasicLand, 0); + RARITY_RANK.put(CardRarity.Common, 1); + RARITY_RANK.put(CardRarity.Uncommon, 2); + RARITY_RANK.put(CardRarity.Rare, 3); + RARITY_RANK.put(CardRarity.MythicRare, 4); + } + + /** + * Handles exact rarity check of a card + * @param tokenValue Token value + * @return Predicate or null + */ + public static Predicate handleExact(String tokenValue) { + Predicate predicate = null; + CardRarity rarity = ParseRarityFromStr(tokenValue); + + if (rarity == null) { + return null; + } + + if (rarity.equals(CardRarity.Special)) { + predicate = PaperCardPredicates.IS_SPECIAL; + } else { + predicate = new PredicateRarityCheck(ComparableOp.EQUALS, rarity); + } + + return predicate; + } + + /** + * Handles greater than rarity check of a card + * @param tokenValue Token value + * @return Predicate or null + */ + public static Predicate handleGreater(String tokenValue) { + Predicate predicate = null; + CardRarity rarity = ParseRarityFromStr(tokenValue); + + if (rarity == null || rarity.equals(CardRarity.Special)) { + return null; + } + + if (rarity.equals(CardRarity.MythicRare)) { + predicate = x -> false; + } else { + predicate = new PredicateRarityCheck(ComparableOp.GREATER_THAN, rarity); + } + + return predicate; + } + + /** + * Handles greater or equal than rarity check of a card + * @param tokenValue Token value + * @return Predicate or null + */ + public static Predicate handleGreaterOrEqual(String tokenValue) { + CardRarity rarity = ParseRarityFromStr(tokenValue); + + if (rarity == null || rarity.equals(CardRarity.Special)) { + return null; + } + + return new PredicateRarityCheck(ComparableOp.GT_OR_EQUAL, rarity); + } + + /** + * Handles less than rarity check of a card + * @param tokenValue Token value + * @return Predicate or null + */ + public static Predicate handleLess(String tokenValue) { + Predicate predicate = null; + CardRarity rarity = ParseRarityFromStr(tokenValue); + + if (rarity == null || rarity.equals(CardRarity.Special)) { + return null; + } + + if (rarity.equals(CardRarity.BasicLand)) { + predicate = x -> false; + } else { + predicate = new PredicateRarityCheck(ComparableOp.LESS_THAN, rarity); + } + + return predicate; + } + + /** + * Handles less or equal than rarity check of a card + * @param tokenValue Token value + * @return Predicate or null + */ + public static Predicate handleLessOrEqual(String tokenValue) { + CardRarity rarity = ParseRarityFromStr(tokenValue); + + if (rarity == null || rarity.equals(CardRarity.Special)) { + return null; + } + + return new PredicateRarityCheck(ComparableOp.LT_OR_EQUAL, rarity); + } + + public static CardRarity ParseRarityFromStr(String input) { + CardRarity value = null; + + switch(input) { + case "l": + case "land": + value = CardRarity.BasicLand; + break; + + case "c": + case "common": + value = CardRarity.Common; + break; + + case "u": + case "uncommon": + value = CardRarity.Uncommon; + break; + + case "r": + case "rare": + value = CardRarity.Rare; + break; + + case "m": + case "mythic": + value = CardRarity.MythicRare; + break; + + case "s": + case "special": + value = CardRarity.Special; + break; + } + + return value; + } + + private static final class PredicateRarityCheck implements Predicate { + private final ComparableOp op; + private final CardRarity rarity; + + @Override + public boolean test(final PaperCard card) { + return doCheck(RARITY_RANK.get(card.getRarity()), RARITY_RANK.get(rarity)); + } + + private PredicateRarityCheck(final ComparableOp op, final CardRarity rarity) { + this.op = op; + this.rarity = rarity; + + } + + private boolean doCheck(final Integer op1, final Integer op2) { + if (op1 == null || op2 == null) { + return false; + } + + switch (this.op) { + case EQUALS: + return op1 == op2; + case GREATER_THAN: + return op1 > op2; + case GT_OR_EQUAL: + return op1 >= op2; + case LESS_THAN: + return op1 < op2; + case LT_OR_EQUAL: + return op1 <= op2; + case NOT_EQUALS: + return op1 != op2; + default: + return false; + } + } + } +} From 79845eff1d46a1a3cd2e0b1706b668dcd23e3bd2 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 25 Jul 2025 14:24:24 +0200 Subject: [PATCH 180/183] Update mystic_decree.txt update Islandwalk to Landwalk:Island --- forge-gui/res/cardsfolder/m/mystic_decree.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/mystic_decree.txt b/forge-gui/res/cardsfolder/m/mystic_decree.txt index 9206e91c256..cc87838ac42 100644 --- a/forge-gui/res/cardsfolder/m/mystic_decree.txt +++ b/forge-gui/res/cardsfolder/m/mystic_decree.txt @@ -1,7 +1,7 @@ Name:Mystic Decree ManaCost:2 U U Types:World Enchantment -S:Mode$ Continuous | Affected$ Creature | RemoveKeyword$ Flying & Islandwalk | Description$ All creatures lose flying and islandwalk. +S:Mode$ Continuous | Affected$ Creature | RemoveKeyword$ Flying & Landwalk:Island | Description$ All creatures lose flying and islandwalk. SVar:NonStackingEffect:True AI:RemoveDeck:Random Oracle:All creatures lose flying and islandwalk. From ab2b06500b21a826a385cf8b37a75a2d1750f097 Mon Sep 17 00:00:00 2001 From: Matthew Scott Krafczyk Date: Fri, 25 Jul 2025 09:07:19 -0500 Subject: [PATCH 181/183] Better Games In Match Selection (#8098) * Add GamesInMatch combo box selection to booster draft page Also updated combo box default to be seeded with the stored preferences * Working comboboxes for desktop version * Working linked buttons on Mobile * Add binder classes for preferences and other Model components * Move to pref binders for mobile GUI --- .../main/java/forge/gui/SwingPrefBinders.java | 26 +++++++++ .../main/java/forge/screens/home/CLobby.java | 1 + .../main/java/forge/screens/home/VLobby.java | 20 +++++-- .../home/sanctioned/CSubmenuDraft.java | 8 ++- .../home/sanctioned/VSubmenuDraft.java | 31 +++++++++- .../screens/constructed/LobbyScreen.java | 10 +++- .../screens/limited/LoadDraftScreen.java | 26 ++++++++- .../screens/limited/LoadSealedScreen.java | 26 ++++++++- .../src/forge/util/GuiPrefBinders.java | 23 ++++++++ .../main/java/forge/model/FPrefsBinder.java | 56 +++++++++++++++++++ .../main/java/forge/model/ModelBinder.java | 10 ++++ 11 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/gui/SwingPrefBinders.java create mode 100644 forge-gui-mobile/src/forge/util/GuiPrefBinders.java create mode 100644 forge-gui/src/main/java/forge/model/FPrefsBinder.java create mode 100644 forge-gui/src/main/java/forge/model/ModelBinder.java diff --git a/forge-gui-desktop/src/main/java/forge/gui/SwingPrefBinders.java b/forge-gui-desktop/src/main/java/forge/gui/SwingPrefBinders.java new file mode 100644 index 00000000000..6a3df000df7 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/gui/SwingPrefBinders.java @@ -0,0 +1,26 @@ +package forge.gui; + +import javax.swing.*; +import java.awt.event.ItemEvent; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FPrefsBinder; + +public class SwingPrefBinders { + public static final class ComboBox extends FPrefsBinder, String> { + public ComboBox(ForgePreferences.FPref key, JComboBox box) { + super( + key, + box, + b -> (String) b.getSelectedItem(), + (b, s) -> b.setSelectedItem(s), + s -> s, + s -> s); + + box.addItemListener(e -> { + if (e.getStateChange() == ItemEvent.SELECTED) { + this.save(); + } + }); + } + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java index a637bf4c303..d255c9a4910 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java @@ -54,6 +54,7 @@ public class CLobby { // General updates when switching back to this view view.getBtnStart().requestFocusInWindow(); }); + view.getGamesInMatchBinder().load(); } public void initialize() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index ee4852447d4..a7093b3d3ae 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -34,6 +34,7 @@ import forge.gamemodes.match.LobbySlotType; import forge.gamemodes.net.event.UpdateLobbyPlayerEvent; import forge.gui.CardDetailPanel; import forge.gui.GuiBase; +import forge.gui.SwingPrefBinders; import forge.gui.interfaces.ILobbyView; import forge.gui.util.SOptionPane; import forge.interfaces.IPlayerChangeListener; @@ -74,7 +75,9 @@ public class VLobby implements ILobbyView { private final StartButton btnStart = new StartButton(); private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); - private final JComboBox gamesInMatch = new JComboBox(new String[] {"1","3","5"}); + private final JComboBox gamesInMatch = new JComboBox(new String[] {"1","3","5"}); + private final SwingPrefBinders.ComboBox gamesInMatchBinder = + new SwingPrefBinders.ComboBox(FPref.UI_MATCHES_PER_GAME, gamesInMatch); private final JPanel gamesInMatchFrame = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); private final JPanel constructedFrame = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); // Main content frame @@ -182,17 +185,19 @@ public class VLobby implements ILobbyView { btnStart.addActionListener(arg0 -> { Runnable startGame = lobby.startGame(); if (startGame != null) { - if (!gamesInMatch.getSelectedItem().equals(FPref.UI_MATCHES_PER_GAME)) { - FModel.getPreferences().setPref(FPref.UI_MATCHES_PER_GAME, (String) gamesInMatch.getSelectedItem()); - } startGame.run(); } }); } + String defaultGamesInMatch = FModel.getPreferences().getPref(FPref.UI_MATCHES_PER_GAME); + if (defaultGamesInMatch == null || defaultGamesInMatch.isEmpty()) { + defaultGamesInMatch = "3"; + } + gamesInMatchFrame.add(newLabel(localizer.getMessage("lblGamesInMatch")), "w 150px!, h 30px!"); gamesInMatchFrame.add(gamesInMatch, "w 50px!, h 30px!"); gamesInMatchFrame.setOpaque(false); - gamesInMatch.setSelectedItem("3"); + pnlStart.add(gamesInMatchFrame); } @@ -855,6 +860,11 @@ public class VLobby implements ILobbyView { return nonRandomAiAvatars; } + /** Return the gamesInMatchBinder */ + public SwingPrefBinders.ComboBox getGamesInMatchBinder() { + return gamesInMatchBinder; + } + /** Populate vanguard lists. */ private void populateVanguardLists() { humanListData.add("Use deck's default avatar (random if unavailable)"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index d7e6e587cec..fca5a6aa053 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -97,12 +97,15 @@ public enum CSubmenuDraft implements ICDoc { view.getBtnBuildDeck().requestFocusInWindow(); } }); + + view.getGamesInMatchBinder().load(); } private void startGame(final GameType gameType) { final Localizer localizer = Localizer.getInstance(); - final boolean gauntlet = VSubmenuDraft.SINGLETON_INSTANCE.isGauntlet(); - final DeckProxy humanDeck = VSubmenuDraft.SINGLETON_INSTANCE.getLstDecks().getSelectedItem(); + final VSubmenuDraft view = VSubmenuDraft.SINGLETON_INSTANCE; + final boolean gauntlet = view.isGauntlet(); + final DeckProxy humanDeck = view.getLstDecks().getSelectedItem(); if (humanDeck == null) { FOptionPane.showErrorDialog(localizer.getMessage("lblNoDeckSelected"), localizer.getMessage("lblNoDeck")); @@ -245,5 +248,4 @@ public enum CSubmenuDraft implements ICDoc { combo.addItem("5"); } } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java index 907fd74edb7..d32b2637d60 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java @@ -13,6 +13,7 @@ import forge.game.GameType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; +import forge.gui.SwingPrefBinders; import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.CDeckEditorUI; @@ -26,6 +27,8 @@ import forge.toolbox.FLabel; import forge.toolbox.FRadioButton; import forge.toolbox.FSkin; import forge.toolbox.JXButtonPanel; +import forge.localinstance.properties.ForgePreferences.FPref; +import forge.model.FModel; import forge.util.Localizer; import net.miginfocom.swing.MigLayout; @@ -57,6 +60,11 @@ public enum VSubmenuDraft implements IVSubmenu { private final JComboBox cbOpponent = new JComboBox<>(); + private final JComboBox gamesInMatch = new JComboBox(new String[] {"1","3","5"}); + private final SwingPrefBinders.ComboBox gamesInMatchBinder = + new SwingPrefBinders.ComboBox(FPref.UI_MATCHES_PER_GAME, gamesInMatch); + private final JPanel gamesInMatchFrame = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); + private final JLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) .text(localizer.getMessage("lblBuildorselectadeck")).build(); @@ -73,6 +81,10 @@ public enum VSubmenuDraft implements IVSubmenu { .text(localizer.getMessage("lblDraftText3")) .fontSize(12).build(); + private final FLabel lblGamesInMatch = new FLabel.Builder() + .text(localizer.getMessage("lblGamesInMatch")) + .fontSize(12).build(); + private final FLabel btnBuildDeck = new FLabel.ButtonBuilder().text(localizer.getMessage("lblNewBoosterDraftGame")).fontSize(16).build(); /** @@ -91,10 +103,22 @@ public enum VSubmenuDraft implements IVSubmenu { radSingle.setSelected(true); grpPanel.add(cbOpponent, "w 200px!, h 30px!"); - pnlStart.setLayout(new MigLayout("insets 0, gap 0, wrap 2")); + pnlStart.setLayout(new MigLayout("insets 0, gap 0", + "[grow][pref!]", + "[pref!][grow,fill][pref!]")); pnlStart.setOpaque(false); - pnlStart.add(grpPanel, "gapright 20"); - pnlStart.add(btnStart); + pnlStart.add(grpPanel, "cell 0 0 1 3, growy, gapright 20"); + + String defaultGamesInMatch = FModel.getPreferences().getPref(FPref.UI_MATCHES_PER_GAME); + if (defaultGamesInMatch == null || defaultGamesInMatch.isEmpty()) { + defaultGamesInMatch = "3"; + } + gamesInMatchFrame.add(lblGamesInMatch, "w 150px!, h 30px!"); + gamesInMatchFrame.add(gamesInMatch, "w 50px!, h 30px!"); + gamesInMatchFrame.setOpaque(false); + pnlStart.add(gamesInMatchFrame, "cell 1 0, alignx center, aligny top"); + + pnlStart.add(btnStart, "cell 1 2, alignx center, aligny bottom"); } /* (non-Javadoc) @@ -147,6 +171,7 @@ public enum VSubmenuDraft implements IVSubmenu { public JRadioButton getRadSingle() { return radSingle; } public JRadioButton getRadMultiple() { return radMultiple; } public JRadioButton getRadAll() { return radAll; } + public SwingPrefBinders.ComboBox getGamesInMatchBinder() { return gamesInMatchBinder; } //========== Overridden from IVDoc diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index a2b361f5a5c..c1e187aee64 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -51,6 +51,7 @@ import forge.toolbox.FScrollPane; import forge.util.MyRandom; import forge.util.TextUtil; import forge.util.Utils; +import forge.util.GuiPrefBinders; public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { private static final ForgePreferences prefs = FModel.getPreferences(); @@ -72,6 +73,8 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { // Max games in a match frame and variables private final FLabel lblGamesInMatch = new FLabel.Builder().text(Forge.getLocalizer().getMessage("lblMatch") + ":").font(VARIANTS_FONT).build(); private final FComboBox cbGamesInMatch = new FComboBox<>(); + private final GuiPrefBinders.ComboBox cbGamesInMatchBinder = + new GuiPrefBinders.ComboBox(FPref.UI_MATCHES_PER_GAME, cbGamesInMatch); private final List playerPanels = new ArrayList<>(MAX_PLAYERS); private final FScrollPane playersScroll = new FScrollPane() { @@ -133,8 +136,6 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { cbGamesInMatch.addItem("1"); cbGamesInMatch.addItem("3"); cbGamesInMatch.addItem("5"); - cbGamesInMatch.setSelectedItem(FModel.getPreferences().getPref((FPref.UI_MATCHES_PER_GAME))); - cbGamesInMatch.setChangedHandler(event -> FModel.getPreferences().setPref(FPref.UI_MATCHES_PER_GAME, cbGamesInMatch.getSelectedItem())); add(lblVariants); add(cbVariants); @@ -588,6 +589,11 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { } } + @Override + public void onActivate() { + cbGamesInMatchBinder.load(); + } + @Override public void update(final boolean fullUpdate) { int playerCount = lobby.getNumberOfSlots(); diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java index b4bf46ab85e..712377114a2 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java @@ -20,6 +20,7 @@ import forge.gamemodes.match.HostedMatch; import forge.gui.FThreads; import forge.gui.GuiBase; import forge.gui.util.SGuiChoose; +import forge.util.GuiPrefBinders; import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.filters.ItemFilter; @@ -32,6 +33,7 @@ import forge.screens.home.LoadGameMenu; import forge.toolbox.FComboBox; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; +import forge.util.Utils; public class LoadDraftScreen extends LaunchScreen { private final DeckManager lstDecks = add(new DeckManager(GameType.Draft)); @@ -44,6 +46,12 @@ public class LoadDraftScreen extends LaunchScreen { private final FLabel lblMode = add(new FLabel.Builder().text(Forge.getLocalizer().getMessage("lblMode")).font(GAME_MODE_FONT).build()); private final FComboBox cbMode = add(new FComboBox<>()); + // Max games in a match frame and variables + private final FLabel lblGamesInMatch = add(new FLabel.Builder().text(Forge.getLocalizer().getMessage("lblMatch") + ":").font(GAME_MODE_FONT).build()); + private final FComboBox cbGamesInMatch = add(new FComboBox<>()); + private final GuiPrefBinders.ComboBox cbGamesInMatchBinder = new GuiPrefBinders.ComboBox( + FPref.UI_MATCHES_PER_GAME, cbGamesInMatch); + public LoadDraftScreen() { super(null, LoadGameMenu.getMenu()); @@ -53,12 +61,18 @@ public class LoadDraftScreen extends LaunchScreen { lstDecks.setup(ItemManagerConfig.DRAFT_DECKS); lstDecks.setItemActivateHandler(event -> editSelectedDeck()); + + cbGamesInMatch.setFont(GAME_MODE_FONT); + cbGamesInMatch.addItem("1"); + cbGamesInMatch.addItem("3"); + cbGamesInMatch.addItem("5"); } @Override public void onActivate() { lstDecks.setPool(DeckProxy.getAllDraftDecks()); lstDecks.setSelectedString(DeckPreferences.getDraftDeck()); + cbGamesInMatchBinder.load(); } private void editSelectedDeck() { @@ -78,8 +92,16 @@ public class LoadDraftScreen extends LaunchScreen { float listHeight = height - labelHeight - y - FDeckChooser.PADDING; float comboBoxHeight = cbMode.getHeight(); - lblMode.setBounds(x, y, lblMode.getAutoSizeBounds().width + FDeckChooser.PADDING / 2, comboBoxHeight); - cbMode.setBounds(x + lblMode.getWidth(), y, w - lblMode.getWidth(), comboBoxHeight); + float x2 = x; + float w1 = lblMode.getAutoSizeBounds().width; + float w2 = lblGamesInMatch.getAutoSizeBounds().width; + lblMode.setBounds(x2, y, w1 + FDeckChooser.PADDING / 2, comboBoxHeight); + x2 += lblMode.getWidth(); + cbMode.setBounds(x2, y, w - x2 - w2 - Utils.AVG_FINGER_WIDTH, comboBoxHeight); + x2 += cbMode.getWidth(); + lblGamesInMatch.setBounds(x2, y, w2 + FDeckChooser.PADDING / 2, comboBoxHeight); + x2 += lblGamesInMatch.getWidth(); + cbGamesInMatch.setBounds(x2, y, Utils.AVG_FINGER_WIDTH, comboBoxHeight); y += comboBoxHeight + FDeckChooser.PADDING; lstDecks.setBounds(x, y, w, listHeight); y += listHeight + FDeckChooser.PADDING; diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java index 27a4f1f176e..87f618ecd4d 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java @@ -20,6 +20,7 @@ import forge.gamemodes.match.HostedMatch; import forge.gui.FThreads; import forge.gui.GuiBase; import forge.gui.util.SGuiChoose; +import forge.util.GuiPrefBinders; import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.filters.ItemFilter; @@ -32,6 +33,7 @@ import forge.screens.home.LoadGameMenu; import forge.toolbox.FComboBox; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; +import forge.util.Utils; public class LoadSealedScreen extends LaunchScreen { private final DeckManager lstDecks = add(new DeckManager(GameType.Draft)); @@ -44,6 +46,12 @@ public class LoadSealedScreen extends LaunchScreen { private final FLabel lblMode = add(new FLabel.Builder().text(Forge.getLocalizer().getMessage("lblMode")).font(GAME_MODE_FONT).build()); private final FComboBox cbMode = add(new FComboBox<>()); + // Max games in a match frame and variables + private final FLabel lblGamesInMatch = add(new FLabel.Builder().text(Forge.getLocalizer().getMessage("lblMatch") + ":").font(GAME_MODE_FONT).build()); + private final FComboBox cbGamesInMatch = add(new FComboBox<>()); + private final GuiPrefBinders.ComboBox cbGamesInMatchBinder = new GuiPrefBinders.ComboBox( + FPref.UI_MATCHES_PER_GAME, cbGamesInMatch); + public LoadSealedScreen() { super(null, LoadGameMenu.getMenu()); @@ -53,12 +61,18 @@ public class LoadSealedScreen extends LaunchScreen { lstDecks.setup(ItemManagerConfig.SEALED_DECKS); lstDecks.setItemActivateHandler(event -> editSelectedDeck()); + + cbGamesInMatch.setFont(GAME_MODE_FONT); + cbGamesInMatch.addItem("1"); + cbGamesInMatch.addItem("3"); + cbGamesInMatch.addItem("5"); } @Override public void onActivate() { lstDecks.setPool(DeckProxy.getAllSealedDecks()); lstDecks.setSelectedString(DeckPreferences.getSealedDeck()); + cbGamesInMatchBinder.load(); } private void editSelectedDeck() { @@ -78,8 +92,16 @@ public class LoadSealedScreen extends LaunchScreen { float listHeight = height - labelHeight - y - FDeckChooser.PADDING; float comboBoxHeight = cbMode.getHeight(); - lblMode.setBounds(x, y, lblMode.getAutoSizeBounds().width + FDeckChooser.PADDING / 2, comboBoxHeight); - cbMode.setBounds(x + lblMode.getWidth(), y, w - lblMode.getWidth(), comboBoxHeight); + float x2 = x; + float w1 = lblMode.getAutoSizeBounds().width; + float w2 = lblGamesInMatch.getAutoSizeBounds().width; + lblMode.setBounds(x2, y, w1 + FDeckChooser.PADDING / 2, comboBoxHeight); + x2 += lblMode.getWidth(); + cbMode.setBounds(x2, y, w - x2 - w2 - Utils.AVG_FINGER_WIDTH, comboBoxHeight); + x2 += cbMode.getWidth(); + lblGamesInMatch.setBounds(x2, y, w2 + FDeckChooser.PADDING / 2, comboBoxHeight); + x2 += lblGamesInMatch.getWidth(); + cbGamesInMatch.setBounds(x2, y, Utils.AVG_FINGER_WIDTH, comboBoxHeight); y += comboBoxHeight + FDeckChooser.PADDING; lstDecks.setBounds(x, y, w, listHeight); y += listHeight + FDeckChooser.PADDING; diff --git a/forge-gui-mobile/src/forge/util/GuiPrefBinders.java b/forge-gui-mobile/src/forge/util/GuiPrefBinders.java new file mode 100644 index 00000000000..20e4c456ff9 --- /dev/null +++ b/forge-gui-mobile/src/forge/util/GuiPrefBinders.java @@ -0,0 +1,23 @@ +package forge.util; + +import forge.toolbox.FComboBox; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FPrefsBinder; + +public class GuiPrefBinders { + public static final class ComboBox extends FPrefsBinder, String> { + public ComboBox(ForgePreferences.FPref key, FComboBox box) { + super( + key, + box, + b -> (String) b.getSelectedItem(), + (b, s) -> b.setSelectedItem(s), + s -> s, + s -> s); + + box.setChangedHandler(e -> { + this.save(); + }); + } + } +} diff --git a/forge-gui/src/main/java/forge/model/FPrefsBinder.java b/forge-gui/src/main/java/forge/model/FPrefsBinder.java new file mode 100644 index 00000000000..2aa23be6afb --- /dev/null +++ b/forge-gui/src/main/java/forge/model/FPrefsBinder.java @@ -0,0 +1,56 @@ +package forge.model; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +import forge.localinstance.properties.ForgePreferences; + +/** + * Binds any GUI component to a Forge preference key + */ + +public class FPrefsBinder implements ModelBinder { + private final ForgePreferences.FPref prefKey; + private final C component; + + /** Extracts a value from the component */ + private final Function extractor; + + /** Pushes a value back into the component */ + private final BiConsumer applier; + + /** conversions between pref store value and component value */ + private final Function toString; + private final Function fromString; + + public FPrefsBinder(ForgePreferences.FPref prefKey, + C component, + Function extractor, + BiConsumer applier, + Function toString, + Function fromString) { + this.prefKey = prefKey; + this.component = component; + this.extractor = extractor; + this.applier = applier; + this.toString = toString; + this.fromString = fromString; + } + + public void load() { + ForgePreferences prefs = FModel.getPreferences(); + String prefValue = prefs.getPref(prefKey); + if (prefValue != null) { + V value = fromString.apply(prefValue); + applier.accept(component, value); + } + } + + public void save() { + ForgePreferences prefs = FModel.getPreferences(); + V value = extractor.apply(component); + String prefValue = toString.apply(value); + prefs.setPref(prefKey, prefValue); + prefs.save(); + } +} diff --git a/forge-gui/src/main/java/forge/model/ModelBinder.java b/forge-gui/src/main/java/forge/model/ModelBinder.java new file mode 100644 index 00000000000..2d81c45d5ca --- /dev/null +++ b/forge-gui/src/main/java/forge/model/ModelBinder.java @@ -0,0 +1,10 @@ +package forge.model; + +/** + * Binds any GUI component to a Forge preference key + */ + +public interface ModelBinder { + public void load(); + public void save(); +} From eb70e21f3dcbd8ca5456b1f58523e3389ad9f9ea Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 25 Jul 2025 14:11:59 +0000 Subject: [PATCH 182/183] Update merieke_ri_berit.txt --- forge-gui/res/cardsfolder/m/merieke_ri_berit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/merieke_ri_berit.txt b/forge-gui/res/cardsfolder/m/merieke_ri_berit.txt index 2a76af7b2c8..0eaac6e193a 100644 --- a/forge-gui/res/cardsfolder/m/merieke_ri_berit.txt +++ b/forge-gui/res/cardsfolder/m/merieke_ri_berit.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human PT:1/1 R:Event$ Untap | ValidCard$ Card.Self | ValidStepTurnToController$ You | Layer$ CantHappen | Description$ CARDNAME doesn't untap during your untap step. A:AB$ GainControl | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay,LoseControl | SubAbility$ DBEffect | SpellDescription$ Gain control of target creature for as long as you control CARDNAME. When CARDNAME leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated. -SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget,Self | ExileOnMoved$ Battlefield | Triggers$ LeavesPlay,Untap | Duration$ Permanent | ConditionPresent$ Card.StrictlySelf +SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget | ExileOnMoved$ Battlefield | Triggers$ LeavesPlay,Untap | Duration$ Permanent | ConditionPresent$ Card.StrictlySelf SVar:LeavesPlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.EffectSource | OneOff$ True | Execute$ DBDestroy | TriggerDescription$ When EFFECTSOURCE leaves the battlefield, or becomes untapped, destroy that creature. It can't be regenerated. SVar:Untap:Mode$ Untaps | ValidCard$ Card.EffectSource | Execute$ DBDestroy | Secondary$ True | OneOff$ True | TriggerDescription$ When EFFECTSOURCE leaves the battlefield, or becomes untapped, destroy that creature. It can't be regenerated. SVar:DBDestroy:DB$ Destroy | Defined$ RememberedLKI | NoRegen$ True From 89b9c050a8f856122ed98672694e77ba39d8f8f3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 25 Jul 2025 22:41:31 +0800 Subject: [PATCH 183/183] try to fix dispose to clear more resource --- forge-gui-mobile/src/forge/assets/Assets.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/Assets.java b/forge-gui-mobile/src/forge/assets/Assets.java index 680c025846c..65852e50749 100644 --- a/forge-gui-mobile/src/forge/assets/Assets.java +++ b/forge-gui-mobile/src/forge/assets/Assets.java @@ -80,41 +80,63 @@ public class Assets implements Disposable { bitmapFont.dispose(); counterFonts.clear(); } + } catch (Exception ignored) {} + try { if (fallback_skins != null) { for (Texture texture : fallback_skins.values()) texture.dispose(); fallback_skins.clear(); } + } catch (Exception ignored) {} + try { if (tmxMap != null) { for (Texture texture : tmxMap.values()) texture.dispose(); tmxMap.clear(); } + } catch (Exception ignored) {} + try { if (defaultImage != null) defaultImage.dispose(); + } catch (Exception ignored) {} + try { if (dummy != null) dummy.dispose(); + } catch (Exception ignored) {} + try { if (textrafonts != null) { for (Font f : textrafonts.values()) f.dispose(); } + } catch (Exception ignored) {} + if (cardArtCache != null) cardArtCache.clear(); + if (avatarImages != null) avatarImages.clear(); + if (manaImages != null) manaImages.clear(); + if (symbolLookup != null) symbolLookup.clear(); + if (images != null) images.clear(); + if (avatars != null) avatars.clear(); + if (sleeves != null) sleeves.clear(); + if (cracks != null) cracks.clear(); + if (borders != null) borders.clear(); + if (deckbox != null) deckbox.clear(); + if (cursor != null) cursor.clear(); + if (fonts != null) fonts.clear(); + try { if (manager != null) manager.dispose(); - } catch (Exception e) { - //e.printStackTrace(); - } + } catch (Exception ignored) {} } public MemoryTrackingAssetManager manager() {
  • xjqDp8*(me3ex4?u4+ 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