From b6b1ae852dc9914927e8a395c9c896fa98349ddd Mon Sep 17 00:00:00 2001 From: Alumi Date: Wed, 17 Mar 2021 05:43:32 +0000 Subject: [PATCH] Refactor skip phase/step using replacement effect. Also add Fasting. --- .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../ai/ability/ChooseGenericEffectAi.java | 4 +- .../forge/ai/ability/PermanentCreatureAi.java | 4 +- .../java/forge/ai/ability/SkipPhaseAi.java | 23 ++++ .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/AddTurnEffect.java | 1 + .../game/ability/effects/SkipPhaseEffect.java | 126 ++++++++++++++++++ .../game/ability/effects/SkipTurnEffect.java | 4 +- .../main/java/forge/game/phase/ExtraTurn.java | 16 +++ .../java/forge/game/phase/PhaseHandler.java | 48 +++---- .../main/java/forge/game/player/Player.java | 31 ----- .../game/replacement/ReplaceBeginPhase.java | 51 +++++++ .../game/replacement/ReplacementHandler.java | 13 ++ .../game/replacement/ReplacementType.java | 1 + forge-gui/res/cardsfolder/a/avizoa.txt | 4 +- .../res/cardsfolder/b/blinding_angel.txt | 4 +- .../res/cardsfolder/b/brine_elemental.txt | 5 +- .../res/cardsfolder/c/colfenors_plans.txt | 3 +- .../res/cardsfolder/d/damia_sage_of_stone.txt | 3 +- .../cardsfolder/d/dovin_architect_of_law.txt | 2 +- .../res/cardsfolder/d/dragon_appeasement.txt | 3 +- .../res/cardsfolder/e/elfhame_sanctuary.txt | 4 +- .../res/cardsfolder/e/empty_city_ruse.txt | 3 +- forge-gui/res/cardsfolder/e/eon_hub.txt | 3 +- forge-gui/res/cardsfolder/f/false_peace.txt | 3 +- forge-gui/res/cardsfolder/f/fasting.txt | 13 ++ forge-gui/res/cardsfolder/f/fatespinner.txt | 9 +- forge-gui/res/cardsfolder/f/fatigue.txt | 3 +- .../res/cardsfolder/g/gibbering_descent.txt | 3 +- .../res/cardsfolder/i/ivory_gargoyle.txt | 2 +- .../res/cardsfolder/m/molten_firebird.txt | 2 +- .../res/cardsfolder/m/moment_of_silence.txt | 3 +- forge-gui/res/cardsfolder/n/necropotence.txt | 2 +- .../res/cardsfolder/n/necropotence_avatar.txt | 3 +- .../res/cardsfolder/n/null_profusion.txt | 3 +- .../res/cardsfolder/p/psychic_possession.txt | 2 +- forge-gui/res/cardsfolder/r/recycle.txt | 3 +- .../res/cardsfolder/r/revenant_patriarch.txt | 4 +- forge-gui/res/cardsfolder/s/sands_of_time.txt | 3 +- .../res/cardsfolder/s/savor_the_moment.txt | 1 - .../s/shisato_whispering_hunter.txt | 4 +- .../cardsfolder/s/solitary_confinement.txt | 3 +- forge-gui/res/cardsfolder/s/stasis.txt | 3 +- .../res/cardsfolder/s/stonehorn_dignitary.txt | 4 +- .../cardsfolder/s/symbiotic_deployment.txt | 3 +- .../res/cardsfolder/t/taigam_sidisis_hand.txt | 3 +- forge-gui/res/cardsfolder/t/the_eon_fog.txt | 3 +- .../res/cardsfolder/y/yawgmoths_bargain.txt | 3 +- .../cardsfolder/y/yosei_the_morning_star.txt | 4 +- 49 files changed, 318 insertions(+), 129 deletions(-) create mode 100644 forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java create mode 100644 forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java create mode 100644 forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java create mode 100644 forge-gui/res/cardsfolder/f/fasting.txt diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 9a65948b86d..5f8aa04c2e1 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -152,6 +152,7 @@ public enum SpellApiToAi { .put(ApiType.SetLife, LifeSetAi.class) .put(ApiType.SetState, SetStateAi.class) .put(ApiType.Shuffle, ShuffleAi.class) + .put(ApiType.SkipPhase, SkipPhaseAi.class) .put(ApiType.SkipTurn, SkipTurnAi.class) .put(ApiType.StoreSVar, StoreSVarAi.class) .put(ApiType.Subgame, AlwaysPlayAi.class) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index c45a66bc32e..0287e539f96 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -159,10 +159,10 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { } } // FatespinnerSkipDraw,FatespinnerSkipMain,FatespinnerSkipCombat - if (player.hasKeyword("Skip your draw step.")) { + if (game.getReplacementHandler().wouldPhaseBeSkipped(player, "Draw")) { return skipDraw; } - if (player.hasKeyword("Skip your next combat phase.")) { + if (game.getReplacementHandler().wouldPhaseBeSkipped(player, "BeginCombat")) { return skipCombat; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 63290093230..2f094df70ee 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -59,7 +59,7 @@ public class PermanentCreatureAi extends PermanentAi { if (sa.isDash()) { //only checks that the dashed creature will attack if (ph.isPlayerTurn(ai) && ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - if (ai.hasKeyword("Skip your next combat phase.")) + if (game.getReplacementHandler().wouldPhaseBeSkipped(ai, "BeginCombat")) return false; if (ComputerUtilCost.canPayCost(sa.getHostCard().getSpellPermanent(), ai)) { //do not dash if creature can be played normally @@ -77,7 +77,7 @@ public class PermanentCreatureAi extends PermanentAi { // after attacking if (card.hasSVar("EndOfTurnLeavePlay") && (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || ai.hasKeyword("Skip your next combat phase."))) { + || game.getReplacementHandler().wouldPhaseBeSkipped(ai, "BeginCombat"))) { // AiPlayDecision.AnotherTime return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java b/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java new file mode 100644 index 00000000000..d72eedd0249 --- /dev/null +++ b/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java @@ -0,0 +1,23 @@ +package forge.ai.ability; + +import forge.ai.SpellAbilityAi; +import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; +import forge.game.spellability.SpellAbility; + +public class SkipPhaseAi extends SpellAbilityAi { + @Override + protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { + return true; + } + + @Override + protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { + return mandatory || canPlayAI(aiPlayer, sa); + } + + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + return true; + } +} 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 4b4e2b17045..a024cf88353 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -153,6 +153,7 @@ public enum ApiType { SetLife (LifeSetEffect.class), SetState (SetStateEffect.class), Shuffle (ShuffleEffect.class), + SkipPhase (SkipPhaseEffect.class), SkipTurn (SkipTurnEffect.class), StoreSVar (StoreSVarEffect.class), Subgame (SubgameEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java index 2d31436de09..b3df7038b16 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java @@ -57,6 +57,7 @@ public class AddTurnEffect extends SpellAbilityEffect { } if (sa.hasParam("SkipUntap")) { extra.setSkipUntap(true); + extra.setSkipUntapSA(sa); } if (sa.hasParam("NoSchemes")) { extra.setCantSetSchemesInMotion(true); diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java new file mode 100644 index 00000000000..c6e6839f157 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java @@ -0,0 +1,126 @@ +package forge.game.ability.effects; + +import java.util.List; + +import forge.GameCommand; +import forge.game.Game; +import forge.game.ability.AbilityFactory; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; +import forge.game.replacement.ReplacementLayer; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; + +public class SkipPhaseEffect extends SpellAbilityEffect { + + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + final String duration = sa.getParam("Duration"); + final String phase = sa.getParam("Phase"); + final String step = sa.getParam("Step"); + + List tgtPlayers = getTargetPlayers(sa); + for (final Player player : tgtPlayers) { + sb.append(player).append(" "); + sb.append("skips their "); + if (duration == null) { + sb.append("next "); + } + if (phase != null) { + sb.append(phase.toLowerCase()).append(" phase."); + } else { + sb.append(step.toLowerCase()).append(" step."); + } + } + + return sb.toString(); + } + + @Override + public void resolve(SpellAbility sa) { + final String duration = sa.getParam("Duration"); + final String phase = sa.getParam("Phase"); + final String step = sa.getParam("Step"); + + List tgtPlayers = getTargetPlayers(sa); + for (final Player player : tgtPlayers) { + createSkipPhaseEffect(sa, player, duration, phase, step); + } + } + + public static void createSkipPhaseEffect(SpellAbility sa, final Player player, + final String duration, final String phase, final String step) { + final Card hostCard = sa.getHostCard(); + final Game game = hostCard.getGame(); + final String name = hostCard.getName() + "'s Effect"; + final String image = hostCard.getImageKey(); + final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn"); + + final Card eff = createEffect(sa, player, name, image); + + final StringBuilder sb = new StringBuilder(); + sb.append("Event$ BeginPhase | ActiveZones$ Command | ValidPlayer$ You | Phase$ "); + sb.append(phase != null ? phase : step); + if (duration != null && !isNextThisTurn) { + sb.append(" | Skip$ True"); + } + sb.append("| Description$ Skip "); + if (duration == null || isNextThisTurn) { + sb.append("your next "); + } else { + sb.append("each "); + } + if (phase != null) { + sb.append(phase.toLowerCase()).append(" phase"); + } else { + sb.append(step.toLowerCase()).append(" step"); + } + if (duration == null) { + sb.append("."); + } else { + if (game.getPhaseHandler().getPlayerTurn().equals(player)) { + sb.append(" of this turn."); + } else { + sb.append(" of your next turn."); + } + } + + final String repeffstr = sb.toString(); + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); + // Set to layer to Control so it will be applied before "would begin your X phase/step" replacement effects + // (Any layer before Other is OK, since default layer is Other.) + re.setLayer(ReplacementLayer.Control); + if (duration == null || isNextThisTurn) { + String exilestr = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"; + SpellAbility exile = AbilityFactory.getAbility(exilestr, eff); + re.setOverridingAbility(exile); + } + if (duration != null) { + final GameCommand endEffect = new GameCommand() { + private static final long serialVersionUID = -5861759814760561373L; + + @Override + public void run() { + game.getAction().exile(eff, null); + } + }; + + if (duration.equals("EndOfTurn") || isNextThisTurn) { + game.getEndOfTurn().addUntil(endEffect); + } else if (duration.equals("UntilTheEndOfYourNextTurn")) { + game.getEndOfTurn().addUntilEnd(player, endEffect); + } + } + eff.addReplacementEffect(re); + eff.updateStateForView(); + + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff, sa); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java index f8c854c0993..41bb54b3110 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java @@ -54,7 +54,9 @@ public class SkipTurnEffect extends SpellAbilityEffect { calcTurn.setSubAbility((AbilitySub) AbilityFactory.getAbility(exile, eff)); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); - re.setLayer(ReplacementLayer.Other); + // Set to layer to Control so it will be applied before "would begin your turn" replacement effects + // (Any layer before Other is OK, since default layer is Other.) + re.setLayer(ReplacementLayer.Control); re.setOverridingAbility(calcTurn); eff.addReplacementEffect(re); eff.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java index 5d7a0d29c17..f35c82d7845 100644 --- a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java +++ b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.List; import forge.game.player.Player; +import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; /** @@ -38,6 +39,7 @@ public class ExtraTurn { private Player player = null; private List delTrig = Collections.synchronizedList(new ArrayList<>()); private boolean skipUntap = false; + private SpellAbility skipUntapSA; private boolean cantSetSchemesInMotion = false; /** * TODO: Write javadoc for Constructor. @@ -89,6 +91,20 @@ public class ExtraTurn { this.skipUntap = skipUntap; } + /** + * @return the skipUntapSA; + */ + public SpellAbility getSkipUntapSA() { + return skipUntapSA; + } + + /** + * @param skipUntapSA the skipUntapSA to set + */ + public void setSkipUntapSA(SpellAbility skipUntapSA) { + this.skipUntapSA = skipUntapSA; + } + /** * @return true if Schemes can't be played during the extra turn */ diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 7f3c7e8bc5b..65a82c5fbce 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -24,6 +24,7 @@ import com.google.common.collect.Multimap; import forge.card.mana.ManaCost; import forge.game.*; import forge.game.ability.AbilityKey; +import forge.game.ability.effects.SkipPhaseEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; @@ -166,6 +167,21 @@ public class PhaseHandler implements java.io.Serializable { turnEnded = PhaseType.isLast(phase, isTopsy); setPhase(PhaseType.getNext(phase, isTopsy)); } + + // Replacement effects + final Map repRunParams = AbilityKey.mapFromAffected(playerTurn); + repRunParams.put(AbilityKey.Phase, phase.nameForScripts); + ReplacementResult repres = game.getReplacementHandler().run(ReplacementType.BeginPhase, repRunParams); + if (repres != ReplacementResult.NotReplaced) { + // Currently there is no effect to skip entire beginning phase + // If in the future that kind of effect is added, need to handle it too. + // Handle skipping of entire combat phase + if (phase == PhaseType.COMBAT_BEGIN) { + setPhase(PhaseType.COMBAT_END); + } + advanceToNextPhase(); + return; + } } game.getStack().clearUndoStack(); //can't undo action from previous phase @@ -197,30 +213,19 @@ public class PhaseHandler implements java.io.Serializable { } private boolean isSkippingPhase(final PhaseType phase) { - // TODO: Refactor this method to replacement effect switch (phase) { - case UNTAP: - if (playerTurn.hasKeyword("Skip your next untap step.")) { - playerTurn.removeKeyword("Skip your next untap step.", false); // Skipping your "next" untap step is cumulative. - return true; - } - return playerTurn.hasKeyword("Skip the untap step of this turn.") || playerTurn.hasKeyword("Skip your untap step."); - - case UPKEEP: - return playerTurn.hasKeyword("Skip your upkeep step."); - case DRAW: - return playerTurn.isSkippingDraw() || turn == 1 && game.getPlayers().size() == 2; - - case MAIN1: - case MAIN2: - return playerTurn.isSkippingMain(); + return turn == 1 && game.getPlayers().size() == 2; case COMBAT_BEGIN: case COMBAT_DECLARE_ATTACKERS: return playerTurn.isSkippingCombat(); case COMBAT_DECLARE_BLOCKERS: + if (combat != null && combat.getAttackers().isEmpty()) { + endCombat(); + } + // Fall through case COMBAT_FIRST_STRIKE_DAMAGE: case COMBAT_DAMAGE: return !inCombat(); @@ -237,9 +242,6 @@ public class PhaseHandler implements java.io.Serializable { if (isSkippingPhase(phase)) { skipped = true; givePriorityToPlayer = false; - if (phase == PhaseType.COMBAT_DECLARE_ATTACKERS) { - playerTurn.removeKeyword("Skip your next combat phase."); - } } else { // Perform turn-based actions @@ -289,11 +291,6 @@ public class PhaseHandler implements java.io.Serializable { declareAttackersTurnBasedAction(); game.getStack().unfreezeStack(); - if (combat != null && combat.getAttackers().isEmpty() - && !game.getTriggerHandler().hasDelayedTriggers()) { - endCombat(); - } - if (combat != null) { for (Card c : combat.getAttackers()) { if (combat.getDefenderByAttacker(c) instanceof Player) { @@ -408,7 +405,6 @@ public class PhaseHandler implements java.io.Serializable { player.clearAssignedDamage(); } - playerTurn.removeKeyword("Skip all combat phases of this turn."); nUpkeepsThisTurn = 0; nMain1sThisTurn = 0; game.getStack().resetMaxDistinctSources(); @@ -861,7 +857,7 @@ public class PhaseHandler implements java.io.Serializable { game.getTriggerHandler().registerThisTurnDelayedTrigger(deltrig); } if (extraTurn.isSkipUntap()) { - nextPlayer.addKeyword("Skip the untap step of this turn."); + SkipPhaseEffect.createSkipPhaseEffect(extraTurn.getSkipUntapSA(), nextPlayer, null, null, "Untap"); } if (extraTurn.isCantSetSchemesInMotion()) { nextPlayer.addKeyword("Schemes can't be set in motion this turn."); 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 60a3ca5ab58..fed95cea50f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2698,28 +2698,9 @@ public class Player extends GameEntity implements Comparable { if (hasLost()) { return true; } - - if (hasKeyword("Skip your next combat phase.")) { - return true; - } - if (hasKeyword("Skip your combat phase.")) { - return true; - } - if (hasKeyword("Skip all combat phases of your next turn.")) { - replaceAllKeywordInstances("Skip all combat phases of your next turn.", - "Skip all combat phases of this turn."); - return true; - } - if (hasKeyword("Skip all combat phases of this turn.")) { - return true; - } return false; } - public boolean isSkippingMain() { - return hasKeyword("Skip your main phase."); - } - public int getStartingHandSize() { return startingHandSize; } @@ -2829,17 +2810,6 @@ public class Player extends GameEntity implements Comparable { } } - public boolean isSkippingDraw() { - if (hasKeyword("Skip your next draw step.")) { - removeKeyword("Skip your next draw step."); - return true; - } - if (hasKeyword("Skip your draw step.")) { - return true; - } - return false; - } - public CardCollectionView getInboundTokens() { return inboundTokens; } @@ -3393,7 +3363,6 @@ public class Player extends GameEntity implements Comparable { setLibrarySearched(0); setNumManaConversion(0); - removeKeyword("Skip the untap step of this turn."); removeKeyword("Schemes can't be set in motion this turn."); } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java new file mode 100644 index 00000000000..cbdefd22e25 --- /dev/null +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java @@ -0,0 +1,51 @@ +package forge.game.replacement; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +import java.util.Map; + +public class ReplaceBeginPhase extends ReplacementEffect { + + public ReplaceBeginPhase(final Map mapParams, final Card host, final boolean intrinsic) { + super(mapParams, host, intrinsic); + // set default layer to control + if (!mapParams.containsKey("Layer")) { + this.setLayer(ReplacementLayer.Control); + } + } + + @Override + public boolean canReplace(Map runParams) { + Player affected = (Player) runParams.get(AbilityKey.Affected); + if (!matchesValidParam("ValidPlayer", affected)) { + return false; + } + if (hasParam("Phase")) { + final String phase = getParam("Phase"); + final String currentPhase = (String) runParams.get(AbilityKey.Phase); + if (phase.equals("Combat") && currentPhase.equals("BeginCombat")) { + return true; + } + if (phase.equals("Main") && (currentPhase.equals("Main1") || currentPhase.equals("Main2"))) { + return true; + } + if (!phase.equals(currentPhase)) { + return false; + } + } + if (hasParam("Condition")) { + if (getParam("Condition").equals("Hellbent") && !affected.hasHellbent()) { + return false; + } + } + return true; + } + + @Override + public void setReplacingObjects(Map runParams, SpellAbility sa) { + sa.setReplacingObject(AbilityKey.Player, runParams.get(AbilityKey.Affected)); + } +} 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 a8f8f7c06ec..17cdddbc73b 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -420,4 +420,17 @@ public class ReplacementHandler { } return ret; } + + /** + * Helper function to check if a phase would be skipped for AI. + */ + public boolean wouldPhaseBeSkipped(final Player player, final String phase) { + final Map repParams = AbilityKey.mapFromAffected(player); + repParams.put(AbilityKey.Phase, phase); + List list = getReplacementList(ReplacementType.BeginPhase, repParams, ReplacementLayer.Control); + if (!list.isEmpty()) { + return false; + } + return true; + } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java index 43c603fc5b4..ae1ddcb2048 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -14,6 +14,7 @@ public enum ReplacementType { AddCounter(ReplaceAddCounter.class), AssignDealDamage(ReplaceAssignDealDamage.class), Attached(ReplaceAttached.class), + BeginPhase(ReplaceBeginPhase.class), BeginTurn(ReplaceBeginTurn.class), Counter(ReplaceCounter.class), CopySpell(ReplaceCopySpell.class), diff --git a/forge-gui/res/cardsfolder/a/avizoa.txt b/forge-gui/res/cardsfolder/a/avizoa.txt index 0ae4c8823a8..e4aeb81e2c6 100644 --- a/forge-gui/res/cardsfolder/a/avizoa.txt +++ b/forge-gui/res/cardsfolder/a/avizoa.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Creature Jellyfish PT:2/2 K:Flying -A:AB$ Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ CARDNAME gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. -SVar:DBSkipTurn:DB$ Pump | Defined$ You | KW$ Skip your next untap step. | Permanent$ True +A:AB$ Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | ActivationLimit$ 1 | SubAbility$ DBSkipPhase | SpellDescription$ CARDNAME gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. +SVar:DBSkipPhase:DB$ SkipPhase | Defined$ You | Step$ Untap AI:RemoveDeck:All Oracle:Flying\n{0}: Avizoa gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/b/blinding_angel.txt b/forge-gui/res/cardsfolder/b/blinding_angel.txt index 178a750c498..db6287ed101 100644 --- a/forge-gui/res/cardsfolder/b/blinding_angel.txt +++ b/forge-gui/res/cardsfolder/b/blinding_angel.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Creature Angel PT:2/4 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next combat phase. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredTarget | KW$ Skip your next combat phase. | Permanent$ True +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSkipCombat | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next combat phase. +SVar:TrigSkipCombat:DB$ SkipPhase | Defined$ TriggeredTarget | Phase$ Combat Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhenever Blinding Angel deals combat damage to a player, that player skips their next combat phase. diff --git a/forge-gui/res/cardsfolder/b/brine_elemental.txt b/forge-gui/res/cardsfolder/b/brine_elemental.txt index 3ee33d02e28..ccc76eff4af 100644 --- a/forge-gui/res/cardsfolder/b/brine_elemental.txt +++ b/forge-gui/res/cardsfolder/b/brine_elemental.txt @@ -3,7 +3,6 @@ ManaCost:4 U U Types:Creature Elemental PT:5/4 K:Morph:5 U U -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, each opponent skips their next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Player.Opponent | KW$ Skip your next untap step. | Permanent$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/brine_elemental.jpg +T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigSkipUntap | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, each opponent skips their next untap step. +SVar:TrigSkipUntap:DB$ SkipPhase | Defined$ Player.Opponent | Step$ Untap Oracle:Morph {5}{U}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Brine Elemental is turned face up, each opponent skips their next untap step. diff --git a/forge-gui/res/cardsfolder/c/colfenors_plans.txt b/forge-gui/res/cardsfolder/c/colfenors_plans.txt index 113c773e7bd..2eafce7f308 100644 --- a/forge-gui/res/cardsfolder/c/colfenors_plans.txt +++ b/forge-gui/res/cardsfolder/c/colfenors_plans.txt @@ -4,12 +4,11 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile the top seven cards of your library face down. You may look at the cards exiled with CARDNAME, and you may play lands and cast spells from among those cards. SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 7 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | ExileFaceDown$ True | NoReveal$ True S:Mode$ Continuous | Affected$ Card.IsRemembered+ExiledWithSource | AffectedZone$ Exile | MayPlay$ True | MayLookAt$ You | Description$ You may look at the cards exiled with CARDNAME, and you may play lands and cast spells from among those cards. -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ CantBeCast | ValidCard$ Card | Caster$ You | NumLimitEachTurn$ 1 | Description$ You can't cast more than one spell each turn. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/colfenors_plans.jpg Oracle:When Colfenor's Plans enters the battlefield, exile the top seven cards of your library face down.\nYou may look at the cards exiled with Colfenor's Plans, and you may play lands and cast spells from among those cards.\nSkip your draw step.\nYou can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt b/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt index f068862171e..2ed80e3353f 100644 --- a/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt +++ b/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt @@ -3,10 +3,9 @@ ManaCost:4 G U B Types:Legendary Creature Gorgon Wizard PT:4/4 K:Deathtouch -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ LT7 | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, if you have fewer than seven cards in hand, draw cards equal to the difference. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ Difference SVar:X:Count$InYourHand SVar:Difference:Number$7/Minus.X -SVar:Picture:http://www.wizards.com/global/images/magic/general/damia_sage_of_stone.jpg Oracle:Deathtouch\nSkip your draw step.\nAt the beginning of your upkeep, if you have fewer than seven cards in hand, draw cards equal to the difference. diff --git a/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt b/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt index 52810d3b167..227219ac320 100644 --- a/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt +++ b/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt @@ -7,5 +7,5 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Tap | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Choose target creature to tap. | Planeswalker$ True | SubAbility$ DovinPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. SVar:DovinPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. A:AB$ TapAll | Cost$ SubCounter<9/LOYALTY> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent | Planeswalker$ True | Ultimate$ True | SubAbility$ NoUntap | SpellDescription$ Tap all permanents target opponent controls. That player skips their next untap step. -SVar:NoUntap:DB$ Pump | Defined$ TargetedPlayer | IsCurse$ True | KW$ Skip your next untap step. | Permanent$ True +SVar:NoUntap:DB$ SkipPhase | Defined$ TargetedPlayer | Step$ Untap | IsCurse$ True Oracle:[+1]: You gain 2 life and draw a card.\n[−1]: Tap target creature. It doesn't untap during its controller's next untap step.\n[−9]: Tap all permanents target opponent controls. That player skips their next untap step. diff --git a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt index 4f070eee718..e240962b18e 100644 --- a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt +++ b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt @@ -1,9 +1,8 @@ Name:Dragon Appeasement ManaCost:3 B R G Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Sacrificed | ValidCard$ Creature.YouCtrl | Execute$ TrigDrawCard | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a creature, you may draw a card. SVar:TrigDrawCard:DB$Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_appeasement.jpg Oracle:Skip your draw step.\nWhenever you sacrifice a creature, you may draw a card. diff --git a/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt b/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt index daac07e28b8..10ea140bce1 100644 --- a/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt +++ b/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt @@ -3,8 +3,6 @@ ManaCost:1 G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may search your library for a basic land card, reveal that card, and put it into your hand. If you do, you skip your draw step this turn and shuffle your library. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SubAbility$ DBSkipDraw | ShuffleNonMandatory$ True -SVar:DBSkipDraw:DB$ Effect | Name$ Elfhame Sanctuary Effect | Defined$ You | StaticAbilities$ SkipDraw -SVar:SkipDraw:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | EffectZone$ Command | Description$ Skip your draw step. +SVar:DBSkipDraw:DB$ SkipPhase | Defined$ You | Step$ Draw | Duration$ EndOfTurn AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/elfhame_sanctuary.jpg Oracle:At the beginning of your upkeep, you may search your library for a basic land card, reveal that card, and put it into your hand. If you do, you skip your draw step this turn and shuffle your library. diff --git a/forge-gui/res/cardsfolder/e/empty_city_ruse.txt b/forge-gui/res/cardsfolder/e/empty_city_ruse.txt index bd8d1d749bd..76d3ed83cb5 100644 --- a/forge-gui/res/cardsfolder/e/empty_city_ruse.txt +++ b/forge-gui/res/cardsfolder/e/empty_city_ruse.txt @@ -1,7 +1,6 @@ Name:Empty City Ruse ManaCost:W Types:Sorcery -A:SP$ Pump | Cost$ W | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | KW$ Skip all combat phases of your next turn. | Permanent$ True | SpellDescription$ Target opponent skips all combat phases of their next turn. +A:SP$ SkipPhase | Cost$ W | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Phase$ Combat | Duration$ UntilTheEndOfYourNextTurn | SpellDescription$ Target opponent skips all combat phases of their next turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_city_ruse.jpg Oracle:Target opponent skips all combat phases of their next turn. diff --git a/forge-gui/res/cardsfolder/e/eon_hub.txt b/forge-gui/res/cardsfolder/e/eon_hub.txt index 191e96c7f6a..c4008c45149 100644 --- a/forge-gui/res/cardsfolder/e/eon_hub.txt +++ b/forge-gui/res/cardsfolder/e/eon_hub.txt @@ -1,8 +1,7 @@ Name:Eon Hub ManaCost:5 Types:Artifact -S:Mode$ Continuous | Affected$ Player | AddKeyword$ Skip your upkeep step. | Description$ Players skip their upkeep steps. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Upkeep | Skip$ True | Description$ Players skip their upkeep steps. SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/eon_hub.jpg Oracle:Players skip their upkeep steps. diff --git a/forge-gui/res/cardsfolder/f/false_peace.txt b/forge-gui/res/cardsfolder/f/false_peace.txt index 777b239894c..22f136ccf64 100644 --- a/forge-gui/res/cardsfolder/f/false_peace.txt +++ b/forge-gui/res/cardsfolder/f/false_peace.txt @@ -1,7 +1,6 @@ Name:False Peace ManaCost:W Types:Sorcery -A:SP$ Pump | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip all combat phases of your next turn. | Permanent$ True | SpellDescription$ Target player skips all combat phases of their next turn. +A:SP$ SkipPhase | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | Phase$ Combat | Duration$ UntilTheEndOfYourNextTurn | SpellDescription$ Target player skips all combat phases of their next turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/false_peace.jpg Oracle:Target player skips all combat phases of their next turn. diff --git a/forge-gui/res/cardsfolder/f/fasting.txt b/forge-gui/res/cardsfolder/f/fasting.txt new file mode 100644 index 00000000000..8cf23ad00e1 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/fasting.txt @@ -0,0 +1,13 @@ +Name:Fasting +ManaCost:W +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutHunger | TriggerDescription$ At the beginning of your upkeep, put a hunger counter on CARDNAME. Then destroy CARDNAME if it has five or more hunger counters on it. +SVar:TrigPutHunger:DB$ PutCounter | Defined$ Self | CounterType$ HUNGER | CounterNum$ 1 | SubAbility$ DBDestroyHunger +SVar:DBDestroyHunger:DB$ Destroy | Defined$ Self | ConditionDefined$ Self | ConditionPresent$ Card.counters_GE5_HUNGER +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Layer$ Other | Optional$ True | ReplaceWith$ DBGainLife | Description$ If you would begin your draw step, you may skip that step instead. If you do, you gain 2 life. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ DBDestroySelf | TriggerDescription$ When you draw a card, destroy CARDNAME. +SVar:DBDestroySelf:DB$ Destroy | Defined$ Self +AI:RemoveDeck:All +AI:RemoveDeck:Random +Oracle:At the beginning of your upkeep, put a hunger counter on Fasting. Then destroy Fasting if it has five or more hunger counters on it.\nIf you would begin your draw step, you may skip that step instead. If you do, you gain 2 life.\nWhen you draw a card, destroy Fasting. diff --git a/forge-gui/res/cardsfolder/f/fatespinner.txt b/forge-gui/res/cardsfolder/f/fatespinner.txt index b91f2dabd16..4c4b88aab27 100644 --- a/forge-gui/res/cardsfolder/f/fatespinner.txt +++ b/forge-gui/res/cardsfolder/f/fatespinner.txt @@ -3,9 +3,8 @@ ManaCost:1 U U Types:Creature Human Wizard PT:1/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | Execute$ TrigSkipPhase | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, that player chooses draw step, main phase, or combat phase. The player skips each instance of the chosen step or phase this turn. -SVar:TrigSkipPhase:DB$ GenericChoice | Defined$ TriggeredPlayer | Choices$ FatespinnerSkipDraw,FatespinnerSkipMain,FatespinnerSkipCombat | ShowChoice$ True | AILogic$ Random -SVar:FatespinnerSkipDraw:DB$ Pump | Defined$ TriggeredPlayer | KW$ Skip your draw step. | SpellDescription$ Draw step -SVar:FatespinnerSkipMain:DB$ Pump | Defined$ TriggeredPlayer | KW$ Skip your main phase. | SpellDescription$ Main phase -SVar:FatespinnerSkipCombat:DB$ Pump | Defined$ TriggeredPlayer | KW$ Skip your combat phase. | SpellDescription$ Combat phase -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatespinner.jpg +SVar:TrigSkipPhase:DB$ GenericChoice | Defined$ TriggeredPlayer | Choices$ FatespinnerSkipDraw,FatespinnerSkipMain,FatespinnerSkipCombat | ShowChoice$ ExceptSelf | AILogic$ Random +SVar:FatespinnerSkipDraw:DB$ SkipPhase | Defined$ TriggeredPlayer | Step$ Draw | Duration$ EndOfTurn | SpellDescription$ Draw step +SVar:FatespinnerSkipMain:DB$ SkipPhase | Defined$ TriggeredPlayer | Phase$ Main | Duration$ EndOfTurn | SpellDescription$ Main phase +SVar:FatespinnerSkipCombat:DB$ SkipPhase | Defined$ TriggeredPlayer | Phase$ Combat | Duration$ EndOfTurn | SpellDescription$ Combat phase Oracle:At the beginning of each opponent's upkeep, that player chooses draw step, main phase, or combat phase. The player skips each instance of the chosen step or phase this turn. diff --git a/forge-gui/res/cardsfolder/f/fatigue.txt b/forge-gui/res/cardsfolder/f/fatigue.txt index b25405d74d3..890d9ff3817 100644 --- a/forge-gui/res/cardsfolder/f/fatigue.txt +++ b/forge-gui/res/cardsfolder/f/fatigue.txt @@ -1,7 +1,6 @@ Name:Fatigue ManaCost:1 U Types:Sorcery -A:SP$ Pump | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip your next draw step. | Permanent$ True | SpellDescription$ Target player skips their next draw step. +A:SP$ SkipPhase | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | Step$ Draw | SpellDescription$ Target player skips their next draw step. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatigue.jpg Oracle:Target player skips their next draw step. diff --git a/forge-gui/res/cardsfolder/g/gibbering_descent.txt b/forge-gui/res/cardsfolder/g/gibbering_descent.txt index ad5049de72a..5a6efcab256 100644 --- a/forge-gui/res/cardsfolder/g/gibbering_descent.txt +++ b/forge-gui/res/cardsfolder/g/gibbering_descent.txt @@ -2,10 +2,9 @@ Name:Gibbering Descent ManaCost:4 B B Types:Enchantment K:Madness:2 B B -S:Mode$ Continuous | Affected$ You | Condition$ Hellbent | AddKeyword$ Skip your upkeep step. | Description$ Hellbent — Skip your upkeep step if you have no cards in hand. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Upkeep | Skip$ True | Condition$ Hellbent | Description$ Hellbent — Skip your upkeep step if you have no cards in hand. T:Mode$ Phase | Phase$ Upkeep | Execute$ TrigLoseLifeDiscard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player loses 1 life and discards a card. SVar:TrigLoseLifeDiscard:DB$LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/gibbering_descent.jpg Oracle:At the beginning of each player's upkeep, that player loses 1 life and discards a card.\nHellbent — Skip your upkeep step if you have no cards in hand.\nMadness {2}{B}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt b/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt index c0c77545eec..16d016ebebb 100644 --- a/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt +++ b/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt @@ -4,7 +4,7 @@ Types:Creature Gargoyle PT:2/2 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigSkipDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step. -SVar:TrigSkipDraw:DB$ Pump | Defined$ TriggeredCardController | KW$ Skip your next draw step. | Permanent$ True | SubAbility$ TrigDelay +SVar:TrigSkipDraw:DB$ SkipPhase | Defined$ TriggeredCardController | Step$ Draw | SubAbility$ TrigDelay SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredNewCardLKICopy | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Battlefield A:AB$ ChangeZone | Cost$ 4 W | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME. diff --git a/forge-gui/res/cardsfolder/m/molten_firebird.txt b/forge-gui/res/cardsfolder/m/molten_firebird.txt index ba7e8f7ac75..04170835df0 100644 --- a/forge-gui/res/cardsfolder/m/molten_firebird.txt +++ b/forge-gui/res/cardsfolder/m/molten_firebird.txt @@ -4,7 +4,7 @@ Types:Creature Phoenix PT:2/2 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigSkipDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step. -SVar:TrigSkipDraw:DB$ Pump | Defined$ TriggeredCardController | KW$ Skip your next draw step. | Permanent$ True | SubAbility$ TrigDelay +SVar:TrigSkipDraw:DB$ SkipPhase | Defined$ TriggeredCardController | Step$ Draw | SubAbility$ TrigDelay SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredNewCardLKICopy | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Battlefield A:AB$ ChangeZone | Cost$ 4 R | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME. diff --git a/forge-gui/res/cardsfolder/m/moment_of_silence.txt b/forge-gui/res/cardsfolder/m/moment_of_silence.txt index 7e08cd3cf09..62793280279 100644 --- a/forge-gui/res/cardsfolder/m/moment_of_silence.txt +++ b/forge-gui/res/cardsfolder/m/moment_of_silence.txt @@ -1,7 +1,6 @@ Name:Moment of Silence ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip your next combat phase. | SpellDescription$ Target player skips their next combat phase this turn. +A:SP$ SkipPhase | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | Phase$ Combat | Duration$ NextThisTurn | SpellDescription$ Target player skips their next combat phase this turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/moment_of_silence.jpg Oracle:Target player skips their next combat phase this turn. diff --git a/forge-gui/res/cardsfolder/n/necropotence.txt b/forge-gui/res/cardsfolder/n/necropotence.txt index e22a9175061..807f5badb50 100644 --- a/forge-gui/res/cardsfolder/n/necropotence.txt +++ b/forge-gui/res/cardsfolder/n/necropotence.txt @@ -1,7 +1,7 @@ Name:Necropotence ManaCost:B B B Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever you discard a card, exile that card from your graveyard. SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile A:AB$ ChangeZone | Cost$ PayLife<1> | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DelayedReturn | AILogic$ Necropotence | AILifeThreshold$ 1 | SpellDescription$ Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. diff --git a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt index b16c50e257c..d493cab0368 100644 --- a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt +++ b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt @@ -2,13 +2,12 @@ Name:Necropotence Avatar ManaCost:no cost Types:Vanguard HandLifeModifier:+0/+4 -S:Mode$ Continuous | Affected$ You | EffectZone$ Command | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Command | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ End Of Turn | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ Turns | SVarCompare$ GT1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if it's not the first turn of the game, put a death counter on Necropotence Avatar. You draw X cards and you lose X life, where X is the number of death counters on Necropotence Avatar. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ DEATH | CounterNum$ 1 | SubAbility$ TrigDraw SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ X | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X SVar:X:Count$CardCounters.DEATH SVar:Turns:Count$TotalTurns -SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Necropotence Avatar.full.jpg AI:RemoveDeck:All Oracle:Hand +0, life +4\nSkip your draw step.\nAt the beginning of your end step, if it's not the first turn of the game, put a death counter on Necropotence Avatar. You draw X cards and you lose X life, where X is the number of death counters on Necropotence Avatar. diff --git a/forge-gui/res/cardsfolder/n/null_profusion.txt b/forge-gui/res/cardsfolder/n/null_profusion.txt index 0c84047906b..f21ceab6871 100644 --- a/forge-gui/res/cardsfolder/n/null_profusion.txt +++ b/forge-gui/res/cardsfolder/n/null_profusion.txt @@ -1,11 +1,10 @@ Name:Null Profusion ManaCost:4 B B Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maximum hand size is 2. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/null_profusion.jpg Oracle:Skip your draw step.\nWhenever you play a card, draw a card.\nYour maximum hand size is two. diff --git a/forge-gui/res/cardsfolder/p/psychic_possession.txt b/forge-gui/res/cardsfolder/p/psychic_possession.txt index 5eff45f1e4d..230b3155477 100644 --- a/forge-gui/res/cardsfolder/p/psychic_possession.txt +++ b/forge-gui/res/cardsfolder/p/psychic_possession.txt @@ -3,7 +3,7 @@ ManaCost:2 U U Types:Enchantment Aura K:Enchant opponent A:SP$ Attach | Cost$ 2 U U | ValidTgts$ Opponent | AILogic$ Curse -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Drawn | ValidCard$ Card.OwnedBy Player.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever enchanted opponent draws a card, you may draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/r/recycle.txt b/forge-gui/res/cardsfolder/r/recycle.txt index c52f2afbce5..5004e27c63d 100644 --- a/forge-gui/res/cardsfolder/r/recycle.txt +++ b/forge-gui/res/cardsfolder/r/recycle.txt @@ -1,11 +1,10 @@ Name:Recycle ManaCost:4 G G Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maximum hand size is 2. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/recycle.jpg Oracle:Skip your draw step.\nWhenever you play a card, draw a card.\nYour maximum hand size is two. diff --git a/forge-gui/res/cardsfolder/r/revenant_patriarch.txt b/forge-gui/res/cardsfolder/r/revenant_patriarch.txt index 23d075aa2f2..34133cdacf1 100644 --- a/forge-gui/res/cardsfolder/r/revenant_patriarch.txt +++ b/forge-gui/res/cardsfolder/r/revenant_patriarch.txt @@ -2,8 +2,8 @@ Name:Revenant Patriarch ManaCost:4 B Types:Creature Spirit PT:4/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RevenantPump | TriggerDescription$ When CARDNAME enters the battlefield, if {W} was spent to cast it, target player skips their next combat phase. -SVar:RevenantPump:DB$ Pump | ValidTgts$ Player | KW$ Skip your next combat phase. | Permanent$ True | TgtPrompt$ Select target Player | IsCurse$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RevenantSkipCombat | TriggerDescription$ When CARDNAME enters the battlefield, if {W} was spent to cast it, target player skips their next combat phase. +SVar:RevenantSkipCombat:DB$ SkipPhase | ValidTgts$ Player | ConditionManaSpent$ W | Phase$ Combat | TgtPrompt$ Select target Player | IsCurse$ True K:CARDNAME can't block. SVar:ManaNeededToAvoidNegativeEffect:white AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/s/sands_of_time.txt b/forge-gui/res/cardsfolder/s/sands_of_time.txt index a09ef2bc3a3..6e4e6c59b3b 100644 --- a/forge-gui/res/cardsfolder/s/sands_of_time.txt +++ b/forge-gui/res/cardsfolder/s/sands_of_time.txt @@ -1,11 +1,10 @@ Name:Sands of Time ManaCost:4 Types:Artifact -S:Mode$ Continuous | Affected$ Player | AddKeyword$ Skip your untap step. | Description$ Each player skips their untap step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Untap | Skip$ True | Description$ Each player skips their untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSands | TriggerDescription$ At the beginning of each player's upkeep, that player simultaneously untaps each tapped artifact, creature, and land they control and taps each untapped artifact, creature, and land they control. SVar:TrigSands:DB$ UntapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.tapped,Creature.tapped,Land.tapped | RememberUntapped$ True | SubAbility$ DBTap SVar:DBTap:DB$ TapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.untapped+IsNotRemembered,Creature.untapped+IsNotRemembered,Land.untapped+IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sands_of_time.jpg Oracle:Each player skips their untap step.\nAt the beginning of each player's upkeep, that player simultaneously untaps each tapped artifact, creature, and land they control and taps each untapped artifact, creature, and land they control. diff --git a/forge-gui/res/cardsfolder/s/savor_the_moment.txt b/forge-gui/res/cardsfolder/s/savor_the_moment.txt index f43c7a09bec..df8980b8eca 100644 --- a/forge-gui/res/cardsfolder/s/savor_the_moment.txt +++ b/forge-gui/res/cardsfolder/s/savor_the_moment.txt @@ -2,5 +2,4 @@ Name:Savor the Moment ManaCost:1 U U Types:Sorcery A:SP$ AddTurn | Cost$ 1 U U | NumTurns$ 1 | SkipUntap$ True | SpellDescription$ Take an extra turn after this one. Skip the untap step of that turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/savor_the_moment.jpg Oracle:Take an extra turn after this one. Skip the untap step of that turn. diff --git a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt index 3dea951fcee..82312f3824d 100644 --- a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt +++ b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt @@ -4,8 +4,8 @@ Types:Legendary Creature Snake Warrior PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a Snake. SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Snake -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredTarget | KW$ Skip your next untap step. | Permanent$ True +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSkipPhase | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next untap step. +SVar:TrigSkipPhase:DB$ SkipPhase | Defined$ TriggeredTarget | Step$ Untap SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.Snake+YouCtrl+cmcLE2 DeckNeeds:Type$Snake diff --git a/forge-gui/res/cardsfolder/s/solitary_confinement.txt b/forge-gui/res/cardsfolder/s/solitary_confinement.txt index 997aae1ea80..a45e43f4307 100644 --- a/forge-gui/res/cardsfolder/s/solitary_confinement.txt +++ b/forge-gui/res/cardsfolder/s/solitary_confinement.txt @@ -2,9 +2,8 @@ Name:Solitary Confinement ManaCost:2 W Types:Enchantment K:UpkeepCost:Discard<1/Card> -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | AddKeyword$ Shroud | Description$ You have shroud. (You can't be the target of spells or abilities.) R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You | Description$ Prevent all damage that would be dealt to you. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/solitary_confinement.jpg Oracle:At the beginning of your upkeep, sacrifice Solitary Confinement unless you discard a card.\nSkip your draw step.\nYou have shroud. (You can't be the target of spells or abilities.)\nPrevent all damage that would be dealt to you. diff --git a/forge-gui/res/cardsfolder/s/stasis.txt b/forge-gui/res/cardsfolder/s/stasis.txt index 76b89021eb2..e378f29d928 100644 --- a/forge-gui/res/cardsfolder/s/stasis.txt +++ b/forge-gui/res/cardsfolder/s/stasis.txt @@ -1,9 +1,8 @@ Name:Stasis ManaCost:1 U Types:Enchantment -S:Mode$ Continuous | Affected$ Player | AddKeyword$ Skip your untap step. | Description$ Players skip their untap steps. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Untap | Skip$ True | Description$ Players skip their untap steps. K:UpkeepCost:U AI:RemoveDeck:Random SVar:NonStackingEffect:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/stasis.jpg Oracle:Players skip their untap steps.\nAt the beginning of your upkeep, sacrifice Stasis unless you pay {U}. diff --git a/forge-gui/res/cardsfolder/s/stonehorn_dignitary.txt b/forge-gui/res/cardsfolder/s/stonehorn_dignitary.txt index cd0ec2a66a6..1ae8140c4e0 100644 --- a/forge-gui/res/cardsfolder/s/stonehorn_dignitary.txt +++ b/forge-gui/res/cardsfolder/s/stonehorn_dignitary.txt @@ -2,6 +2,6 @@ Name:Stonehorn Dignitary ManaCost:3 W Types:Creature Rhino Soldier PT:1/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target opponent skips their next combat phase. -SVar:TrigPump:DB$ Pump | ValidTgts$ Opponent | KW$ Skip your next combat phase. | Permanent$ True | TgtPrompt$ Select target opponent | IsCurse$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSkipCombat | TriggerDescription$ When CARDNAME enters the battlefield, target opponent skips their next combat phase. +SVar:TrigSkipCombat:DB$ SkipPhase | ValidTgts$ Opponent | Phase$ Combat | TgtPrompt$ Select target opponent | IsCurse$ True Oracle:When Stonehorn Dignitary enters the battlefield, target opponent skips their next combat phase. diff --git a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt index c4de09dc9d4..49c3f867641 100644 --- a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt +++ b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt @@ -1,9 +1,8 @@ Name:Symbiotic Deployment ManaCost:2 G Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. A:AB$ Draw | Cost$ 1 tapXType<2/Creature> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. AI:RemoveDeck:Random SVar:NonStackingEffect:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiotic_deployment.jpg Oracle:Skip your draw step.\n{1}, Tap two untapped creatures you control: Draw a card. diff --git a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt index 8b3db2b5067..62d5e01e512 100644 --- a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt +++ b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt @@ -2,11 +2,10 @@ Name:Taigam, Sidisi's Hand ManaCost:3 U B Types:Legendary Creature Human Wizard PT:3/4 -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. SVar:TrigDig:DB$ Dig | DigNum$ 3 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. A:AB$ Pump | Cost$ B T ExileFromGrave | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn. | CostDesc$ {B}, {T}, Exile X cards from your graveyard: SVar:X:Count$xPaid AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/taigam_sidisis_hand.jpg Oracle:Skip your draw step.\nAt the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.\n{B}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/the_eon_fog.txt b/forge-gui/res/cardsfolder/t/the_eon_fog.txt index 249b1c0d659..19937db26d5 100644 --- a/forge-gui/res/cardsfolder/t/the_eon_fog.txt +++ b/forge-gui/res/cardsfolder/t/the_eon_fog.txt @@ -1,9 +1,8 @@ Name:The Eon Fog ManaCost:no cost Types:Plane Equilor -S:Mode$ Continuous | EffectZone$ Command | Affected$ Player | AddKeyword$ Skip your untap step. | Description$ Players skip their untap steps. +R:Event$ BeginPhase | ActiveZones$ Command | Phase$ Untap | Skip$ True | Description$ Players skip their untap steps. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, untap all permanents you control. SVar:RolledChaos:DB$ UntapAll | ValidCards$ Permanent.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_eon_fog.jpg SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9 Oracle:Players skip their untap steps.\nWhenever you roll {CHAOS}, untap all permanents you control. diff --git a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt index 375af58b7b5..affe240cdc2 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt @@ -1,10 +1,9 @@ Name:Yawgmoth's Bargain ManaCost:4 B B Types:Enchantment -S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. A:AB$ Draw | Cost$ PayLife<1> | NumCards$ 1 | AILogic$ YawgmothsBargain | AILifeThreshold$ 1 | SpellDescription$ Draw a card. SVar:AICastPreference:NeverCastIfLifeBelow$ 7 AI:RemoveDeck:Random SVar:NonStackingEffect:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_bargain.jpg Oracle:Skip your draw step.\nPay 1 life: Draw a card. diff --git a/forge-gui/res/cardsfolder/y/yosei_the_morning_star.txt b/forge-gui/res/cardsfolder/y/yosei_the_morning_star.txt index d4abe631baf..3d077724ef1 100644 --- a/forge-gui/res/cardsfolder/y/yosei_the_morning_star.txt +++ b/forge-gui/res/cardsfolder/y/yosei_the_morning_star.txt @@ -3,8 +3,8 @@ ManaCost:4 W W Types:Legendary Creature Dragon Spirit PT:5/5 K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target player skips their next untap step. Tap up to five target permanents that player controls. -SVar:TrigPump:DB$ Pump | ValidTgts$ Player | IsCurse$ True | KW$ Skip your next untap step. | Permanent$ True | IsCurse$ True | SubAbility$ TrigTap +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSkipPhase | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target player skips their next untap step. Tap up to five target permanents that player controls. +SVar:TrigSkipPhase:DB$ SkipPhase | ValidTgts$ Player | Step$ Untap | IsCurse$ True | SubAbility$ TrigTap SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 5 | TargetsWithDefinedController$ ParentTarget | ValidTgts$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/yosei_the_morning_star.jpg Oracle:Flying\nWhen Yosei, the Morning Star dies, target player skips their next untap step. Tap up to five target permanents that player controls.