From 1716da35d3391759d08626105735dae5eb84a2c1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 May 2022 23:05:22 -0400 Subject: [PATCH 01/11] seize_the_spotlight.txt --- .../cardsfolder/upcoming/seize_the_spotlight.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/seize_the_spotlight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seize_the_spotlight.txt b/forge-gui/res/cardsfolder/upcoming/seize_the_spotlight.txt new file mode 100644 index 00000000000..21387f311f2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seize_the_spotlight.txt @@ -0,0 +1,14 @@ +Name:Seize the Spotlight +ManaCost:2 R +Types:Sorcery +A:SP$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChoice | SubAbility$ DBFame | ClearRememberedBeforeLoop$ True | SpellDescription$ Each opponent chooses fame or fortune. For each player who chose fame, gain control of a creature that player controls until end of turn. Untap those creatures and they gain haste until end of turn. For each player who chose fortune, you draw a card and create a Treasure token. +SVar:DBChoice:DB$ GenericChoice | Defined$ Player.IsRemembered | Choices$ Fame,Fortune | ShowChoice$ True +SVar:Fame:DB$ Pump | Defined$ Player.IsRemembered | NoteCards$ Self | NoteCardsFor$ Fame | SpellDescription$ Fame +SVar:Fortune:DB$ Pump | Defined$ Player.IsRemembered | NoteCards$ Self | NoteCardsFor$ Fortune | SpellDescription$ Fortune +SVar:DBFame:DB$ RepeatEach | RepeatPlayers$ Player.NotedForFame | RepeatSubAbility$ GainControl | SubAbility$ DBFortune | ClearRememberedBeforeLoop$ True +SVar:GainControl:DB$ GainControl | Choices$ Creature.RememberedPlayerCtrl | LoseControl$ EOT | Untap$ True | AddKWs$ Haste +SVar:DBFortune:DB$ RepeatEach | RepeatPlayers$ Player.NotedForFortune | RepeatSubAbility$ DBDraw | ClearRememberedBeforeLoop$ True +SVar:DBDraw:DB$ Draw | SubAbility$ DBTreasure +SVar:DBTreasure:DB$ Token | TokenScript$ c_a_treasure_sac +DeckHas:Ability$Token|Sacrifice & Types$Artifact|Treasure +Oracle:Each opponent chooses fame or fortune. For each player who chose fame, gain control of a creature that player controls until end of turn. Untap those creatures and they gain haste until end of turn. For each player who chose fortune, you draw a card and create a Treasure token. From 0cf08249efb5ee792094864c7503ca5fb91f1ffe Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 May 2022 23:06:19 -0400 Subject: [PATCH 02/11] ControlGainEffect add "Choices" --- .../ability/effects/ControlGainEffect.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 328158255d9..f3271686df4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -1,15 +1,19 @@ package forge.game.ability.effects; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import forge.GameCommand; import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.event.GameEventCardStatsChanged; @@ -17,6 +21,7 @@ import forge.game.event.GameEventCombatChanged; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class ControlGainEffect extends SpellAbilityEffect { @@ -102,6 +107,7 @@ public class ControlGainEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { Card source = sa.getHostCard(); + final Player activator = sa.getActivatingPlayer(); final boolean bUntap = sa.hasParam("Untap"); final boolean bTapOnLose = sa.hasParam("TapOnLose"); @@ -112,13 +118,24 @@ public class ControlGainEffect extends SpellAbilityEffect { final List controllers = getDefinedPlayersOrTargeted(sa, "NewController"); - final Player newController = controllers.isEmpty() ? sa.getActivatingPlayer() : controllers.get(0); + final Player newController = controllers.isEmpty() ? activator : controllers.get(0); final Game game = newController.getGame(); - CardCollectionView tgtCards = getDefinedCards(sa); - + CardCollectionView tgtCards = null; if (sa.hasParam("ControlledByTarget")) { tgtCards = CardLists.filterControlledBy(tgtCards, getTargetPlayers(sa)); + } else if (sa.hasParam("Choices")) { + Player chooser = sa.hasParam("Chooser") ? AbilityUtils.getDefinedPlayers(source, + sa.getParam("Chooser"), sa).get(0) : activator; + CardCollectionView choices = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), + sa.getParam("Choices"), activator, source, sa); + if (!choices.isEmpty()) { + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : + Localizer.getInstance().getMessage("lblChooseaCard") +" "; + tgtCards = activator.getController().chooseCardsForEffect(choices, sa, title, 1, 1, false, null); + } + } else { + tgtCards = getDefinedCards(sa); } // in case source was LKI or still resolving From 923159bebb0fe7838cb920811b143f328e74663e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 May 2022 23:21:41 -0400 Subject: [PATCH 03/11] remove unused imports --- .../main/java/forge/game/ability/effects/ControlGainEffect.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index f3271686df4..e7f9435937c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -1,9 +1,7 @@ package forge.game.ability.effects; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import com.google.common.collect.Lists; From c3bcee0f8c9fb5069045bf1211205ee156b0bf2b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 May 2022 23:23:58 -0400 Subject: [PATCH 04/11] remove more unused imports --- .../java/forge/game/ability/effects/ControlGainEffect.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index e7f9435937c..17f24a84446 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -1,17 +1,12 @@ package forge.game.ability.effects; -import java.util.Arrays; -import java.util.List; - import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import forge.GameCommand; import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; -import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.event.GameEventCardStatsChanged; From bf80721f134bd226968df2ea87e602ef3a1b34e5 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 May 2022 23:29:51 -0400 Subject: [PATCH 05/11] guess some of those were needed --- .../java/forge/game/ability/effects/ControlGainEffect.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 17f24a84446..f9309c3a91a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -16,6 +16,9 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Localizer; +import java.util.Arrays; +import java.util.List; + public class ControlGainEffect extends SpellAbilityEffect { @Override From e403720ab98fc4ea2a58208303398c1ba116c93d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 22 May 2022 18:13:52 -0400 Subject: [PATCH 06/11] turf_war.txt and contested counter --- .../src/main/java/forge/game/card/CounterEnumType.java | 2 ++ forge-gui/res/cardsfolder/upcoming/turf_war.txt | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/turf_war.txt diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index 2f8c4590c5e..9958436edad 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -73,6 +73,8 @@ public enum CounterEnumType { COMPONENT("COMPN", 224, 160, 48), + CONTESTED("CONTES", 255, 76, 2), + CORPSE("CRPSE", 230, 186, 209), CORRUPTION("CRPTN", 210, 121, 210), diff --git a/forge-gui/res/cardsfolder/upcoming/turf_war.txt b/forge-gui/res/cardsfolder/upcoming/turf_war.txt new file mode 100644 index 00000000000..8487786dcb1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/turf_war.txt @@ -0,0 +1,9 @@ +Name:Turf War +ManaCost:4 R +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, for each player, put a contested counter on target land that player controls. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ CONTESTED | ValidTgts$ Land | TgtPrompt$ For each player, select a target land | TargetMin$ OneEach | TargetMax$ OneEach | TargetsWithDifferentControllers$ True +SVar:OneEach:PlayerCountPlayers$Amount +T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ Player.controlsLand+counters_GE1_CONTESTED | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ Whenever a creature deals combat damage to a player, if that player controls one or more lands with contested counters on them, that creature's controller gains control of one of those lands of their choice and untaps it. +SVar:TrigGainControl:DB$ GainControl | Choices$ Land.ControlledBy TriggeredTarget+counters_GE1_CONTESTED | Untap$ True | NewController$ TriggeredSourceController +Oracle:When Turf War enters the battlefield, for each player, put a contested counter on target land that player controls.\nWhenever a creature deals combat damage to a player, if that player controls one or more lands with contested counters on them, that creature's controller gains control of one of those lands of their choice and untaps it. From 1a9a6042f100dd0c2a5508296bf7ed20c0d951cb Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 May 2022 20:51:56 -0400 Subject: [PATCH 07/11] myrkul_lord_of_bones.txt --- .../cardsfolder/upcoming/myrkul_lord_of_bones.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/myrkul_lord_of_bones.txt diff --git a/forge-gui/res/cardsfolder/upcoming/myrkul_lord_of_bones.txt b/forge-gui/res/cardsfolder/upcoming/myrkul_lord_of_bones.txt new file mode 100644 index 00000000000..1729e5bfe7c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/myrkul_lord_of_bones.txt @@ -0,0 +1,14 @@ +Name:Myrkul, Lord of Bones +ManaCost:4 W B G +Types:Legendary Creature God +PT:7/5 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Indestructible | CheckSVar$ X | SVarCompare$ LEY | Description$ As long as your life total is less than or equal to half your starting life total, CARDNAME has indestructible. +SVar:X:Count$YourLifeTotal/Times.2 +SVar:Y:Count$YourStartingLife +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+Other+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever another nontoken creature you control dies, you may exile it. If you do, create a token that's a copy of that card, except it's an enchantment and loses all other card types. +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBCopy +SVar:DBCopy:DB$ CopyPermanent | Defined$ TriggeredCardLKICopy | AddTypes$ Enchantment | RemoveCardTypes$ True | ConditionDefined$ TriggeredNewCardLKICopy | ConditionPresent$ Card | ConditionCompare$ EQExiledCount | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:ExiledCount:Count$RememberedSize +DeckHas:Ability$Token +Oracle:As long as your life total is less than or equal to half your starting life total, Myrkul, Lord of Bones has indestructible.\nWhenever another nontoken creature you control dies, you may exile it. If you do, create a token that's a copy of that card, except it's an enchantment and loses all other card types. From 4abf6ed5f8fd451ac433245cefe33ffa16f7ed86 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 May 2022 20:53:38 -0400 Subject: [PATCH 08/11] jeleva_nephalias_scourge.txt NICKNAME and oracle matching --- forge-gui/res/cardsfolder/j/jeleva_nephalias_scourge.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/j/jeleva_nephalias_scourge.txt b/forge-gui/res/cardsfolder/j/jeleva_nephalias_scourge.txt index ac2eadcfe15..0ae54cf591b 100644 --- a/forge-gui/res/cardsfolder/j/jeleva_nephalias_scourge.txt +++ b/forge-gui/res/cardsfolder/j/jeleva_nephalias_scourge.txt @@ -3,10 +3,10 @@ ManaCost:1 U B R Types:Legendary Creature Vampire Wizard PT:1/3 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, each player exiles the top X cards of their library, where X is the amount of mana spent to cast Jeleva. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, each player exiles the top X cards of their library, where X is the amount of mana spent to cast NICKNAME. SVar:TrigExile:DB$ Dig | Defined$ Player | DigNum$ X | ChangeNum$ All | RememberChanged$ True | DestinationZone$ Exile SVar:X:Count$CastTotalManaSpent -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPlay | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may cast an instant or sorcery card exiled with it without paying its mana cost. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPlay | OptionalDecider$ You | TriggerDescription$ Whenever NICKNAME attacks, you may cast an instant or sorcery card from among cards exiled with NICKNAME without paying its mana cost. SVar:TrigPlay:DB$ Play | ValidZone$ Exile | Valid$ Instant.IsRemembered+ExiledWithSource,Sorcery.IsRemembered+ExiledWithSource | ValidSA$ Spell | Controller$ You | WithoutManaCost$ True | Amount$ 1 T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard From 2f923109d132c8c21567ecda3ae59733a6973024 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 May 2022 21:50:17 -0400 Subject: [PATCH 09/11] elminsters_simulacrum.txt --- .../res/cardsfolder/upcoming/elminsters_simulacrum.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/elminsters_simulacrum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elminsters_simulacrum.txt b/forge-gui/res/cardsfolder/upcoming/elminsters_simulacrum.txt new file mode 100644 index 00000000000..74d5efe223c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elminsters_simulacrum.txt @@ -0,0 +1,7 @@ +Name:Elminster's Simulacrum +ManaCost:4 U U +Types:Instant +A:SP$ CopyPermanent | ValidTgts$ Creature.OppCtrl | TgtPrompt$ For each opponent, select up to one target creature that they control | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | SpellDescription$ For each opponent, you create a token that's a copy of up to one target creature that player controls. +SVar:OneEach:PlayerCountOpponents$Amount +DeckHas:Ability$Token +Oracle:For each opponent, you create a token that's a copy of up to one target creature that player controls. From 9bb6cf853518f3679ace5f482423eb5f29d310db Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 May 2022 21:50:50 -0400 Subject: [PATCH 10/11] the_hippodrome.txt fix bad restriction --- forge-gui/res/cardsfolder/t/the_hippodrome.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/the_hippodrome.txt b/forge-gui/res/cardsfolder/t/the_hippodrome.txt index 98459b950fc..0170900bf88 100644 --- a/forge-gui/res/cardsfolder/t/the_hippodrome.txt +++ b/forge-gui/res/cardsfolder/t/the_hippodrome.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Plane Segovia S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddPower$ -5 | Description$ All Creatures get -5/-0. T:Mode$ PlanarDice | Result$ Chaos | OptionalDecider$ You | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you may destroy target creature if it's power is 0 or less. -SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionSVarCompare$ EQ1 | AITgts$ Creature.OpponentCtrl+powerLE0 +SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionSVarCompare$ EQ1 | AITgts$ Creature.OppCtrl+powerLE0 SVar:TgtPow:Targeted$Valid Creature.powerLE0 SVar:AIRollPlanarDieParams:Mode$ Always Oracle:All creatures get -5/-0.\nWhenever you roll {CHAOS}, you may destroy target creature if its power is 0 or less. From 691465120a9c4bbad9b3867eec21f60898985ca2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 May 2022 21:51:19 -0400 Subject: [PATCH 11/11] aerie_worshippers.txt tidy + AI --- forge-gui/res/cardsfolder/a/aerie_worshippers.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/aerie_worshippers.txt b/forge-gui/res/cardsfolder/a/aerie_worshippers.txt index 94c77bb23ce..152a5b92e51 100644 --- a/forge-gui/res/cardsfolder/a/aerie_worshippers.txt +++ b/forge-gui/res/cardsfolder/a/aerie_worshippers.txt @@ -2,6 +2,7 @@ Name:Aerie Worshippers ManaCost:3 U Types:Creature Human Cleric PT:2/4 -T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ GFGToken | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, you may pay {2}{U}. If you do, create a 2/2 blue Bird enchantment creature token with flying. -SVar:GFGToken:AB$ Token | Cost$ 2 U | TokenAmount$ 1 | TokenScript$ u_2_2_e_bird_flying | TokenOwner$ You +T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, you may pay {2}{U}. If you do, create a 2/2 blue Bird enchantment creature token with flying. +SVar:TrigToken:AB$ Token | Cost$ 2 U | TokenScript$ u_2_2_e_bird_flying +DeckHas:Ability$Token & Type$Bird|Enchantment Oracle:Inspired — Whenever Aerie Worshippers becomes untapped, you may pay {2}{U}. If you do, create a 2/2 blue Bird enchantment creature token with flying.