From 22c889d1e08f88a461d55dd80a1fc51e8f6b6682 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 11 Jun 2022 11:29:43 +0200 Subject: [PATCH] Remove InternalETB and replace with UpdateResult --- .../src/main/java/forge/ai/SpellApiToAi.java | 1 - .../forge/ai/ability/CanPlayAsDrawbackAi.java | 35 ------------------- .../src/main/java/forge/game/GameAction.java | 2 +- .../main/java/forge/game/GameActionUtil.java | 3 +- .../java/forge/game/ability/AbilityUtils.java | 14 ++++---- .../main/java/forge/game/ability/ApiType.java | 1 - .../ability/effects/ETBReplacementEffect.java | 32 ----------------- .../java/forge/game/card/CardFactoryUtil.java | 24 +++---------- .../forge/game/replacement/ReplaceMoved.java | 2 +- .../game/replacement/ReplacementHandler.java | 5 +-- .../res/cardsfolder/b/boreal_outrider.txt | 5 ++- .../res/cardsfolder/b/brimstone_vandal.txt | 5 ++- .../res/cardsfolder/c/celestus_sanctifier.txt | 5 ++- .../res/cardsfolder/c/component_collector.txt | 5 ++- .../res/cardsfolder/f/firmament_sage.txt | 5 ++- .../res/cardsfolder/g/gavony_dawnguard.txt | 5 ++- ...n_god_of_winter_kaldring_the_rimestaff.txt | 6 ++-- .../cardsfolder/m/moritte_of_the_frost.txt | 5 ++- .../res/cardsfolder/m/mystic_reflection.txt | 5 ++- .../cardsfolder/o/obsessive_astronomer.txt | 5 ++- forge-gui/res/cardsfolder/s/semesters_end.txt | 10 +++--- forge-gui/res/cardsfolder/s/spark_double.txt | 10 +++--- forge-gui/res/cardsfolder/s/storyweave.txt | 3 +- .../res/cardsfolder/s/sunrise_cavalier.txt | 5 ++- .../res/cardsfolder/s/sunstreak_phoenix.txt | 5 ++- .../res/cardsfolder/t/teferis_time_twist.txt | 5 ++- forge-gui/res/cardsfolder/t/the_celestus.txt | 5 ++- .../res/cardsfolder/upcoming/master_chef.txt | 7 ++-- .../cardsfolder/v/vadrik_astral_archmage.txt | 5 ++- 29 files changed, 61 insertions(+), 164 deletions(-) delete mode 100644 forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java delete mode 100644 forge-game/src/main/java/forge/game/ability/effects/ETBReplacementEffect.java diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 2d72ac56d1c..28d0ced5046 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -185,7 +185,6 @@ public enum SpellApiToAi { .put(ApiType.WinsGame, GameWinAi.class) .put(ApiType.DamageResolve, AlwaysPlayAi.class) - .put(ApiType.InternalEtbReplacement, CanPlayAsDrawbackAi.class) .put(ApiType.InternalLegendaryRule, LegendaryRuleAi.class) .put(ApiType.InternalIgnoreEffect, CannotPlayAi.class) .build()); diff --git a/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java b/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java deleted file mode 100644 index 2e303b29776..00000000000 --- a/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java +++ /dev/null @@ -1,35 +0,0 @@ -package forge.ai.ability; - -import forge.ai.SpellAbilityAi; -import forge.game.player.Player; -import forge.game.spellability.SpellAbility; - -public class CanPlayAsDrawbackAi extends SpellAbilityAi { - - /* (non-Javadoc) - * @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility) - */ - @Override - protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - return false; - } - - /** - *

- * copySpellTriggerAI. - *

- * @param sa - * a {@link forge.game.spellability.SpellAbility} object. - * @param mandatory - * a boolean. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. - * - * @return a boolean. - */ - @Override - protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { - return false; - } - -} diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 919e35d914f..dfda9c27aa6 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -365,7 +365,7 @@ public class GameAction { } ReplacementResult repres = game.getReplacementHandler().run(ReplacementType.Moved, repParams); - if (repres != ReplacementResult.NotReplaced) { + if (repres != ReplacementResult.NotReplaced && repres != ReplacementResult.Updated) { // reset failed manifested Cards back to original if (c.isManifested() && !c.isInPlay()) { c.forceTurnFaceUp(); diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 3f563ff302a..addc8e311c9 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -677,13 +677,12 @@ public final class GameActionUtil { if (!StringUtils.isNumeric(amount)) { sa.setSVar(amount, sourceCard.getSVar(amount)); } - CardFactoryUtil.setupETBReplacementAbility(sa); String desc = "It enters the battlefield with "; desc += Lang.nounWithNumeral(amount, CounterType.getType(counter).getName() + " counter"); desc += " on it."; - String repeffstr = "Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | Description$ " + desc; + String repeffstr = "Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplacementResult$ Updated | Description$ " + desc; ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); re.setLayer(ReplacementLayer.Other); 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 1f748ff53b2..5461441ab2d 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -55,6 +55,7 @@ import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.player.PlayerPredicates; +import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilitySub; import forge.game.spellability.LandAbility; import forge.game.spellability.OptionalCost; @@ -217,10 +218,15 @@ public class AbilityUtils { else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) { final SpellAbility root = ((SpellAbility)sa).getRootAbility(); AbilityKey type = AbilityKey.fromString(defined.substring(8)); + // for Moved Effects, if it wants to know the affected Card, it might need to return the LKI + // or otherwise the timestamp does match + if (type == AbilityKey.Card && root.isReplacementAbility() && root.getReplacementEffect().getMode() == ReplacementType.Moved) { + type = AbilityKey.CardLKI; + } final Object crd = root.getReplacingObject(type); if (crd instanceof Card) { - c = game.getCardState((Card) crd); + c = (Card) crd; } else if (crd instanceof Iterable) { cards.addAll(Iterables.filter((Iterable) crd, Card.class)); } @@ -1415,11 +1421,7 @@ public class AbilityUtils { // Needed - Equip an untapped creature with Sword of the Paruns then cast Deadshot on it. Should deal 2 more damage. game.getAction().checkStaticAbilities(); // this will refresh continuous abilities for players and permanents. - if (sa.isReplacementAbility() && abSub.getApi() == ApiType.InternalEtbReplacement) { - game.getTriggerHandler().resetActiveTriggers(false); - } else { - game.getTriggerHandler().resetActiveTriggers(); - } + game.getTriggerHandler().resetActiveTriggers(!sa.isReplacementAbility()); AbilityUtils.resolveApiAbility(abSub, game); } diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index f09b5b5fffa..9016ad5f03b 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -189,7 +189,6 @@ public enum ApiType { DamageResolve (DamageResolveEffect.class), ChangeZoneResolve (ChangeZoneResolveEffect.class), - InternalEtbReplacement (ETBReplacementEffect.class), InternalLegendaryRule (CharmEffect.class), InternalIgnoreEffect (CharmEffect.class), UpdateRemember (UpdateRememberEffect.class); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ETBReplacementEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ETBReplacementEffect.java deleted file mode 100644 index 77241fecdac..00000000000 --- a/forge-game/src/main/java/forge/game/ability/effects/ETBReplacementEffect.java +++ /dev/null @@ -1,32 +0,0 @@ -package forge.game.ability.effects; - -import java.util.Map; - -import forge.game.Game; -import forge.game.ability.AbilityKey; -import forge.game.ability.SpellAbilityEffect; -import forge.game.card.Card; -import forge.game.spellability.SpellAbility; - -/** - * TODO: Write javadoc for this type. - * - */ -public class ETBReplacementEffect extends SpellAbilityEffect { - @Override - public void resolve(SpellAbility sa) { - final Game game = sa.getActivatingPlayer().getGame(); - final Card card = (Card) sa.getReplacingObject(AbilityKey.Card); - - Map params = AbilityKey.newMap(); - params.put(AbilityKey.CardLKI, sa.getReplacingObject(AbilityKey.CardLKI)); - params.put(AbilityKey.ReplacementEffect, sa.getReplacementEffect()); - params.put(AbilityKey.LastStateBattlefield, sa.getReplacingObject(AbilityKey.LastStateBattlefield)); - params.put(AbilityKey.LastStateGraveyard, sa.getReplacingObject(AbilityKey.LastStateGraveyard)); - - final SpellAbility root = sa.getRootAbility(); - SpellAbility cause = (SpellAbility) root.getReplacingObject(AbilityKey.Cause); - - game.getAction().moveToPlay(card, card.getController(), cause, params); - } -} \ No newline at end of file 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 1297012b5c7..00317836bd9 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -52,7 +52,6 @@ import forge.game.GameLogEntryType; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; -import forge.game.ability.ApiType; import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; @@ -651,14 +650,13 @@ public class CardFactoryUtil { final boolean intrinsic, final String valid, final String zone) { Card host = card.getCard(); String desc = repAb.getDescription(); - setupETBReplacementAbility(repAb); if (!intrinsic) { repAb.setIntrinsic(false); } StringBuilder repEffsb = new StringBuilder(); repEffsb.append("Event$ Moved | ValidCard$ ").append(valid); - repEffsb.append(" | Destination$ Battlefield | Description$ ").append(desc); + repEffsb.append(" | Destination$ Battlefield | ReplacementResult$ Updated | Description$ ").append(desc); if (optional) { repEffsb.append(" | Optional$ True"); } @@ -751,13 +749,12 @@ public class CardFactoryUtil { } SpellAbility sa = AbilityFactory.getAbility(abStr, card); - setupETBReplacementAbility(sa); if (!intrinsic) { sa.setIntrinsic(false); } String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield " - + "| Secondary$ True | Description$ " + desc + (!extraparams.equals("") ? " | " + extraparams : ""); + + "| Secondary$ True | ReplacementResult$ Updated | Description$ " + desc + (!extraparams.equals("") ? " | " + extraparams : ""); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card.getCard(), intrinsic, card); @@ -2055,7 +2052,7 @@ public class CardFactoryUtil { // Setup ETB replacement effects final String actualRep = "Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self |" - + " | Description$ Amplify " + amplifyMagnitude + " (" + + " | ReplacementResult$ Updated | Description$ Amplify " + amplifyMagnitude + " (" + inst.getReminderText() + ")"; final String abString = "DB$ Reveal | AnyNumber$ True | RevealValid$ " @@ -2075,7 +2072,6 @@ public class CardFactoryUtil { AbilitySub saCleanup = (AbilitySub) AbilityFactory.getAbility(dbClean, card); saPut.setSubAbility(saCleanup); - setupETBReplacementAbility(saCleanup); saReveal.setSubAbility(saPut); @@ -2168,13 +2164,12 @@ public class CardFactoryUtil { inst.addReplacement(re); } else if (keyword.equals("Daybound")) { - final String actualRep = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Night | Secondary$ True | Layer$ Transform | Description$ If it is night, this permanent enters the battlefield transformed."; + final String actualRep = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Night | Secondary$ True | Layer$ Transform | ReplacementResult$ Updated | Description$ If it is night, this permanent enters the battlefield transformed."; final String abTransform = "DB$ SetState | Defined$ ReplacedCard | Mode$ Transform | ETB$ True | Daybound$ True"; ReplacementEffect re = ReplacementHandler.parseReplacement(actualRep, host, intrinsic, card); SpellAbility saTransform = AbilityFactory.getAbility(abTransform, card); - setupETBReplacementAbility(saTransform); re.setOverridingAbility(saTransform); inst.addReplacement(re); @@ -2206,11 +2201,10 @@ public class CardFactoryUtil { AbilitySub cleanupSA = (AbilitySub) AbilityFactory.getAbility(cleanupStr, card); counterSA.setSubAbility(cleanupSA); - String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | Description$ Devour " + magnitude + " ("+ inst.getReminderText() + ")"; + String repeffstr = "Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Secondary$ True | ReplacementResult$ Updated | Description$ Devour " + magnitude + " ("+ inst.getReminderText() + ")"; ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card); - setupETBReplacementAbility(cleanupSA); re.setOverridingAbility(sacrificeSA); inst.addReplacement(re); @@ -3693,14 +3687,6 @@ public class CardFactoryUtil { return altCostSA; } - private static final Map emptyMap = Maps.newTreeMap(); - public static SpellAbility setupETBReplacementAbility(SpellAbility sa) { - AbilitySub as = new AbilitySub(ApiType.InternalEtbReplacement, sa.getHostCard(), null, emptyMap); - sa.appendSubAbility(as); - return as; - // ETBReplacementMove(sa.getHostCard(), null)); - } - public static void setupAdventureAbility(Card card) { if (card.getCurrentStateName() != CardStateName.Adventure) { return; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index ce068800cca..e370ca9635e 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -96,7 +96,7 @@ public class ReplaceMoved extends ReplacementEffect { @Override public void setReplacingObjects(Map runParams, SpellAbility sa) { sa.setReplacingObject(AbilityKey.Card, runParams.get(AbilityKey.Affected)); - sa.setReplacingObjectsFrom(runParams, AbilityKey.CardLKI, AbilityKey.Cause, AbilityKey.LastStateBattlefield, AbilityKey.LastStateGraveyard); + sa.setReplacingObjectsFrom(runParams, AbilityKey.NewCard, AbilityKey.CardLKI, AbilityKey.Cause, AbilityKey.LastStateBattlefield, AbilityKey.LastStateGraveyard); } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index 1e72eb846ca..7ce788fd936 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -211,6 +211,7 @@ public class ReplacementHandler { re.setHostCard(affectedCard); } runParams.put(AbilityKey.Affected, affectedCard); + runParams.put(AbilityKey.NewCard, CardUtil.getLKICopy(affectedLKI)); } game.getAction().checkStaticAbilities(false); } @@ -418,8 +419,8 @@ public class ReplacementHandler { } } - if ("Replaced".equals(replacementEffect.getParam("ReplacementResult"))) { - return ReplacementResult.Replaced; // Event is replaced without SA. + if (replacementEffect.hasParam("ReplacementResult")) { + return ReplacementResult.valueOf(replacementEffect.getParam("ReplacementResult")); // Event is replaced without SA. } // if the spellability is a replace effect then its some new logic diff --git a/forge-gui/res/cardsfolder/b/boreal_outrider.txt b/forge-gui/res/cardsfolder/b/boreal_outrider.txt index 6f454e1f28e..21b4c26cc2f 100644 --- a/forge-gui/res/cardsfolder/b/boreal_outrider.txt +++ b/forge-gui/res/cardsfolder/b/boreal_outrider.txt @@ -4,9 +4,8 @@ Types:Snow Creature Elf Warrior PT:3/2 T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | SnowSpentForCardsColor$ True | TriggerDescription$ Whenever you cast a creature spell, if {S} of any of that spell's colors was spent to cast it, that creature enters the battlefield with an additional +1/+1 counter on it. ({S} is mana from a snow source.) SVar:TrigEffect:DB$ Effect | RememberObjects$ TriggeredCard | ReplacementEffects$ ETBCreat -SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ That creature enters the battlefield with an additional +1/+1 counter on it. -SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ That creature enters the battlefield with an additional +1/+1 counter on it. +SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile DeckHints:Type$Snow DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/b/brimstone_vandal.txt b/forge-gui/res/cardsfolder/b/brimstone_vandal.txt index 22dca698de2..37cf7d81cd7 100644 --- a/forge-gui/res/cardsfolder/b/brimstone_vandal.txt +++ b/forge-gui/res/cardsfolder/b/brimstone_vandal.txt @@ -3,9 +3,8 @@ ManaCost:2 R Types:Creature Devil PT:2/3 K:Menace -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, CARDNAME deals 1 damage to each opponent. SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nIf it's neither day nor night, it becomes day as Brimstone Vandal enters the battlefield.\nWhenever day becomes night or night becomes day, Brimstone Vandal deals 1 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/c/celestus_sanctifier.txt b/forge-gui/res/cardsfolder/c/celestus_sanctifier.txt index a37a6bd9326..fde2f4559e5 100644 --- a/forge-gui/res/cardsfolder/c/celestus_sanctifier.txt +++ b/forge-gui/res/cardsfolder/c/celestus_sanctifier.txt @@ -2,9 +2,8 @@ Name:Celestus Sanctifier ManaCost:2 W Types:Creature Human Cleric PT:3/2 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ DBDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top two cards of your library. Put one of them into your graveyard. SVar:DBDig:DB$ Dig | DigNum$ 2 | DestinationZone$ Graveyard | LibraryPosition2$ 0 DeckHas:Ability$Graveyard diff --git a/forge-gui/res/cardsfolder/c/component_collector.txt b/forge-gui/res/cardsfolder/c/component_collector.txt index 5a61b3861e4..1122ebc3a4c 100644 --- a/forge-gui/res/cardsfolder/c/component_collector.txt +++ b/forge-gui/res/cardsfolder/c/component_collector.txt @@ -2,9 +2,8 @@ Name:Component Collector ManaCost:2 U Types:Creature Homunculus PT:1/4 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigTapOrUntap | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you may tap or untap target nonland permanent. SVar:TrigTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent Oracle:If it's neither day nor night, it becomes day as Component Collector enters the battlefield.\nWhenever day becomes night or night becomes day, you may tap or untap target nonland permanent. diff --git a/forge-gui/res/cardsfolder/f/firmament_sage.txt b/forge-gui/res/cardsfolder/f/firmament_sage.txt index 6e2a28fd737..41d58f743f9 100644 --- a/forge-gui/res/cardsfolder/f/firmament_sage.txt +++ b/forge-gui/res/cardsfolder/f/firmament_sage.txt @@ -2,9 +2,8 @@ Name:Firmament Sage ManaCost:3 U Types:Creature Human Wizard PT:2/3 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ DBDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 Oracle:If it's neither day nor night, it becomes day as Firmament Sage enters the battlefield.\nWhenever day becomes night or night becomes day, draw a card. diff --git a/forge-gui/res/cardsfolder/g/gavony_dawnguard.txt b/forge-gui/res/cardsfolder/g/gavony_dawnguard.txt index aecacd39f08..3a94aca6777 100644 --- a/forge-gui/res/cardsfolder/g/gavony_dawnguard.txt +++ b/forge-gui/res/cardsfolder/g/gavony_dawnguard.txt @@ -3,9 +3,8 @@ ManaCost:1 W W Types:Creature Human Soldier PT:3/3 K:Ward:1 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order. SVar:TrigDig:DB$ Dig | ForceRevealToController$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.cmcLE3 Oracle:Ward {1}\nIf it's neither day nor night, it becomes day as Gavony Dawnguard enters the battlefield.\nWhenever day becomes night or night becomes day, look at the top four cards of your library. You may reveal a creature card with mana value 3 or less from among them and put it into your hand. Put the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/j/jorn_god_of_winter_kaldring_the_rimestaff.txt b/forge-gui/res/cardsfolder/j/jorn_god_of_winter_kaldring_the_rimestaff.txt index 87e0e523f17..456d500e1d0 100644 --- a/forge-gui/res/cardsfolder/j/jorn_god_of_winter_kaldring_the_rimestaff.txt +++ b/forge-gui/res/cardsfolder/j/jorn_god_of_winter_kaldring_the_rimestaff.txt @@ -18,9 +18,7 @@ Types:Legendary Snow Artifact A:AB$ Effect | Cost$ T | TgtZone$ Graveyard | ValidTgts$ Permanent.Snow+YouCtrl | TgtPrompt$ Choose target snow permanent card in your graveyard | StaticAbilities$ STPlay | RememberObjects$ Targeted | ForgetOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped. SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play target snow permanent card from your graveyard this turn. SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget | ForgetOnMoved$ Stack | ReplacementEffects$ ETBCreat -SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBTap | Description$ If you do, it enters the battlefield tapped. -SVar:DBTap:DB$ Tap | Defined$ ReplacedCard | ETB$ True | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBTap | ReplacementResult$ Updated | Description$ If you do, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | Defined$ ReplacedCard | ETB$ True | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:STTapped:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME enters the battlefield tapped. Oracle:{T}: You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt b/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt index 78665d3e564..e54cafb56e6 100644 --- a/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt +++ b/forge-gui/res/cardsfolder/m/moritte_of_the_frost.txt @@ -6,9 +6,8 @@ K:Changeling K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling. SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Moritte of the Frost Effect | ReplacementEffects$ ETBCreat -SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ If it's a creature, it enters with two additional +1/+1 counters on it. -SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ If it's a creature, it enters with two additional +1/+1 counters on it. +SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile DeckHas:Ability$Counters Oracle:Changeling (This card is every creature type.)\nYou may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling. diff --git a/forge-gui/res/cardsfolder/m/mystic_reflection.txt b/forge-gui/res/cardsfolder/m/mystic_reflection.txt index 70e09cf7f73..3ae4e1e2627 100644 --- a/forge-gui/res/cardsfolder/m/mystic_reflection.txt +++ b/forge-gui/res/cardsfolder/m/mystic_reflection.txt @@ -2,9 +2,8 @@ Name:Mystic Reflection ManaCost:1 U Types:Instant A:SP$ Effect | ValidTgts$ Creature.nonLegendary | TgtPrompt$ Choose target nonlegendary creature | RememberObjects$ Targeted | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove | SpellDescription$ Choose target nonlegendary creature. The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature. -SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature,Planeswalker | ReplaceWith$ EnterAsCopy | Description$ The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature. -SVar:EnterAsCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ ReplacedCard | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBImprint +SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature,Planeswalker | ReplaceWith$ EnterAsCopy | ReplacementResult$ Updated | Description$ The next time one or more creatures or planeswalkers enter the battlefield this turn, they enter as copies of the chosen creature. +SVar:EnterAsCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ ReplacedCard | SubAbility$ DBImprint SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self diff --git a/forge-gui/res/cardsfolder/o/obsessive_astronomer.txt b/forge-gui/res/cardsfolder/o/obsessive_astronomer.txt index f52bba4274f..db1433a96c6 100644 --- a/forge-gui/res/cardsfolder/o/obsessive_astronomer.txt +++ b/forge-gui/res/cardsfolder/o/obsessive_astronomer.txt @@ -2,9 +2,8 @@ Name:Obsessive Astronomer ManaCost:1 R Types:Creature Human Wizard PT:2/2 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, discard up to two cards, then draw that many cards. SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ Y | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/s/semesters_end.txt b/forge-gui/res/cardsfolder/s/semesters_end.txt index 5b004bcd9d3..1828d5bd732 100644 --- a/forge-gui/res/cardsfolder/s/semesters_end.txt +++ b/forge-gui/res/cardsfolder/s/semesters_end.txt @@ -5,12 +5,10 @@ A:SP$ ChangeZone | Cost$ 3 W | ValidTgts$ Creature.YouCtrl,Planeswalker.YouCtrl SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ RememberedLKI | TriggerDescription$ Return each of them to the battlefield under its owner's control. Each of them enters the battlefield with an additional +1/+1 counter on it if it's a creature and an additional loyalty counter on it if it's a planeswalker. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | AnimateSubAbility$ DBConditionEffect -SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Remembered | Name$ Semester's End Effect | ReplacementEffects$ ETBCreat,ETBPlans -SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ It enters with an additional +1/+1 counter on it if it's a creature. -SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield -SVar:ETBPlans:Event$ Moved | ValidCard$ Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutLOYALTY | Description$ It enters with an additional loyalty counter on it if it's a planeswalker. -SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Remembered | Name$ Semester's End Effect | ReplacementEffects$ ETBCreatPlans +SVar:ETBCreatPlans:Event$ Moved | ValidCard$ Creature.IsRemembered,Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ It enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker. +SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedNewCard.Creature | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBPutLOYALTY +SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedNewCard.Planeswalker | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:X:Count$Valid Permanent.YouCtrl DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/s/spark_double.txt b/forge-gui/res/cardsfolder/s/spark_double.txt index 5ed7145ef7b..bf475c23325 100644 --- a/forge-gui/res/cardsfolder/s/spark_double.txt +++ b/forge-gui/res/cardsfolder/s/spark_double.txt @@ -4,12 +4,10 @@ Types:Creature Illusion PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature.Other+YouCtrl,Planeswalker.Other+YouCtrl | NonLegendary$ True | SubAbility$ DBConditionEffect | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of a creature or planeswalker you control, except it enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker, and it isn't legendary if that permanent is legendary. -SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Spark Double Effect | ReplacementEffects$ ETBCreat,ETBPlans -SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | Description$ It enters with an additional +1/+1 counter on it if it's a creature. -SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield -SVar:ETBPlans:Event$ Moved | ValidCard$ Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutLOYALTY | Description$ It enters with an additional loyalty counter on it if it's a planeswalker. -SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Spark Double Effect | ReplacementEffects$ ETBCreatPlans +SVar:ETBCreatPlans:Event$ Moved | ValidCard$ Creature.IsRemembered,Planeswalker.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ It enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker. +SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedNewCard.Creature | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SubAbility$ DBPutLOYALTY +SVar:DBPutLOYALTY:DB$ PutCounter | Defined$ ReplacedNewCard.Planeswalker | CounterType$ LOYALTY | ETB$ True | CounterNum$ 1 | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile DeckHas:Ability$Counters SVar:NeedsToPlayVar:Z GE1 diff --git a/forge-gui/res/cardsfolder/s/storyweave.txt b/forge-gui/res/cardsfolder/s/storyweave.txt index 79636cd8574..16ba45fe97b 100644 --- a/forge-gui/res/cardsfolder/s/storyweave.txt +++ b/forge-gui/res/cardsfolder/s/storyweave.txt @@ -6,8 +6,7 @@ SVar:P1P1:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select targe SVar:Lore:DB$ PutCounter | ValidTgts$ Saga.YouCtrl | TgtPrompt$ Select target Saga you control | CounterType$ LORE | CounterNum$ 2 | SubAbility$ DBEffect | SpellDescription$ Put two lore counters on target Saga you control. The next time one or more enchantment creatures enter the battlefield under your control this turn, each enters with two additional +1/+1 counters on it. SVar:DBEffect:DB$ Effect | ReplacementEffects$ ReplaceETB | Triggers$ TrigRemove SVar:ReplaceETB:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature.Enchantment | ReplaceWith$ DBPutP1P1 -SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBImprint +SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ DBImprint SVar:DBImprint:DB$ Pump | ImprintCards$ ReplacedCard SVar:TrigRemove:Mode$ ChangesZoneAll | CheckSVar$ Z | Execute$ ExileSelf | Static$ True SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self diff --git a/forge-gui/res/cardsfolder/s/sunrise_cavalier.txt b/forge-gui/res/cardsfolder/s/sunrise_cavalier.txt index 14ce6446a77..bd2918f4184 100644 --- a/forge-gui/res/cardsfolder/s/sunrise_cavalier.txt +++ b/forge-gui/res/cardsfolder/s/sunrise_cavalier.txt @@ -4,9 +4,8 @@ Types:Creature Human Knight PT:3/3 K:Trample K:Haste -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, put a +1/+1 counter on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/s/sunstreak_phoenix.txt b/forge-gui/res/cardsfolder/s/sunstreak_phoenix.txt index 43c0591b279..d6238cf91d4 100644 --- a/forge-gui/res/cardsfolder/s/sunstreak_phoenix.txt +++ b/forge-gui/res/cardsfolder/s/sunstreak_phoenix.txt @@ -3,9 +3,8 @@ ManaCost:2 R R Types:Creature Phoenix PT:4/2 K:Flying -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day T:Mode$ DayTimeChanges | Execute$ TrigReturn | TriggerZones$ Graveyard | TriggerDescription$ Whenever day becomes night or night becomes day, you may pay {1}{R}. If you do, return CARDNAME from your graveyard to the battlefield tapped. SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 R | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True DeckHas:Ability$Graveyard diff --git a/forge-gui/res/cardsfolder/t/teferis_time_twist.txt b/forge-gui/res/cardsfolder/t/teferis_time_twist.txt index d0168259415..66e97bfc4a1 100644 --- a/forge-gui/res/cardsfolder/t/teferis_time_twist.txt +++ b/forge-gui/res/cardsfolder/t/teferis_time_twist.txt @@ -5,9 +5,8 @@ A:SP$ ChangeZone | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target perma SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | Triggers$ ReturnEOT | ReplacementEffects$ EntersAsCreature | SubAbility$ DBCleanup | SpellDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. SVar:ReturnEOT:Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ RememberedLKI -SVar:EntersAsCreature:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ PutP1P1 | Secondary$ True -SVar:PutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | SubAbility$ ToBattlefield -SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:EntersAsCreature:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ PutP1P1 | Secondary$ True | ReplacementResult$ Updated +SVar:PutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/t/the_celestus.txt b/forge-gui/res/cardsfolder/t/the_celestus.txt index bcb87a0b289..bd1d2460da1 100644 --- a/forge-gui/res/cardsfolder/t/the_celestus.txt +++ b/forge-gui/res/cardsfolder/t/the_celestus.txt @@ -1,9 +1,8 @@ Name:The Celestus ManaCost:3 Types:Legendary Artifact -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. A:AB$ DayTime | Cost$ 3 T | Value$ Switch | SorcerySpeed$ True | SpellDescription$ If it's night, it becomes day. Otherwise, it becomes night. Activate only as a sorcery. T:Mode$ DayTimeChanges | Execute$ DBGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, you gain 1 life. You may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/master_chef.txt b/forge-gui/res/cardsfolder/upcoming/master_chef.txt index 85438fe5eb4..272815e24fe 100644 --- a/forge-gui/res/cardsfolder/upcoming/master_chef.txt +++ b/forge-gui/res/cardsfolder/upcoming/master_chef.txt @@ -2,10 +2,9 @@ Name:Master Chef ManaCost:2 G Types:Legendary Enchantment Background S:Mode$ Continuous | Affected$ Creature.IsCommander+YouOwn | AddReplacementEffects$ This & Other | Description$ Commander creatures you own have "This creature enters the battlefield with an additional +1/+1 counter on it" and "Other creatures you control enter with an additional +1/+1 counter on them." -SVar:This:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ ExtraCounter | Description$ This creature enters the battlefield with an additional +1/+1 counter on it. -SVar:Other:Event$ Moved | ValidCard$ Creature.Other+YouCtrl | Destination$ Battlefield | ReplaceWith$ ExtraCounter | Description$ Other creatures you control enter with an additional +1/+1 counter on them. -SVar:ExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +SVar:This:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ ExtraCounter | ReplacementResult$ Updated | Description$ This creature enters the battlefield with an additional +1/+1 counter on it. +SVar:Other:Event$ Moved | ValidCard$ Creature.Other+YouCtrl | Destination$ Battlefield | ReplaceWith$ ExtraCounter | ReplacementResult$ Updated | Description$ Other creatures you control enter with an additional +1/+1 counter on them. +SVar:ExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 AI:RemoveDeck:NonCommander DeckHas:Ability$Counters Oracle:Commander creatures you own have "This creature enters the battlefield with an additional +1/+1 counter on it" and "Other creatures you control enter with an additional +1/+1 counter on them." diff --git a/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt b/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt index ef8e41c14b3..8b88309d004 100644 --- a/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt +++ b/forge-gui/res/cardsfolder/v/vadrik_astral_archmage.txt @@ -2,9 +2,8 @@ Name:Vadrik, Astral Archmage ManaCost:1 U R Types:Legendary Creature Human Wizard PT:1/2 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. -SVar:DoDay:DB$ DayTime | Value$ Day | SubAbility$ ETB -SVar:ETB:DB$ InternalEtbReplacement +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | DayTime$ Neither | ReplaceWith$ DoDay | ReplacementResult$ Updated | Description$ If it's neither day nor night, it becomes day as CARDNAME enters the battlefield. +SVar:DoDay:DB$ DayTime | Value$ Day S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ X | Description$ Instant and sorcery spells you cast cost {X} less to cast, where X is NICKNAME's power. SVar:X:Count$CardPower T:Mode$ DayTimeChanges | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever day becomes night or night becomes day, put a +1/+1 counter on NICKNAME.