diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java index ae92058d713..13b0e80f5c4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java @@ -1,22 +1,36 @@ package forge.game.ability.effects; import forge.game.Game; +import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.CardCollectionView; import forge.game.player.Player; +import forge.game.replacement.ReplacementResult; +import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; import forge.util.Localizer; +import java.util.Map; + public class PlaneswalkEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - Game game = sa.getActivatingPlayer().getGame(); + Player activator = sa.getActivatingPlayer(); + Game game = activator.getGame(); if (game.getActivePlanes() == null) { // not a planechase game, nothing happens return; } + + final Map repParams = AbilityKey.mapFromAffected(activator); + Object cause = sa.hasParam("Cause") ? sa.getParam("Cause") : sa; + repParams.put(AbilityKey.Cause, cause); + if (game.getReplacementHandler().run(ReplacementType.Planeswalk, repParams) == ReplacementResult.Replaced) { + return; + } + if (sa.hasParam("Optional") && !sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYouLikeToPlaneswalk"), null)) { return; diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index b4c64999e41..ce4900d954f 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -329,7 +329,7 @@ public class CardFactory { String trigger = "Mode$ PlanarDice | Result$ Planeswalk | TriggerZones$ Command | Secondary$ True | " + "TriggerDescription$ Whenever you roll the Planeswalker symbol on the planar die, planeswalk."; - String rolledWalk = "DB$ Planeswalk"; + String rolledWalk = "DB$ Planeswalk | Cause$ PlanarDie"; Trigger planesWalkTrigger = TriggerHandler.parseTrigger(trigger, card, true); planesWalkTrigger.setOverridingAbility(AbilityFactory.getAbility(rolledWalk, card)); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacePlaneswalk.java b/forge-game/src/main/java/forge/game/replacement/ReplacePlaneswalk.java new file mode 100644 index 00000000000..ce091ea6b69 --- /dev/null +++ b/forge-game/src/main/java/forge/game/replacement/ReplacePlaneswalk.java @@ -0,0 +1,28 @@ +package forge.game.replacement; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +import java.util.Map; + +public class ReplacePlaneswalk extends ReplacementEffect { + + public ReplacePlaneswalk(final Map mapParams, final Card host, final boolean intrinsic) { + super(mapParams, host, intrinsic); + } + + @Override + public boolean canReplace(Map runParams) { + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; + } + return true; + } + + @Override + public void setReplacingObjects(Map runParams, SpellAbility sa) { + sa.setReplacingObject(AbilityKey.Cause, runParams.get(AbilityKey.Cause)); + } + +} 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 2461d522b80..21107cd0410 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -35,6 +35,7 @@ public enum ReplacementType { Moved(ReplaceMoved.class), PayLife(ReplacePayLife.class), PlanarDiceResult(ReplacePlanarDiceResult.class), + Planeswalk(ReplacePlaneswalk.class), ProduceMana(ReplaceProduceMana.class), Proliferate(ReplaceProliferate.class), RemoveCounter(ReplaceRemoveCounter.class), diff --git a/forge-gui/res/cardsfolder/upcoming/fixed_point_in_time.txt b/forge-gui/res/cardsfolder/upcoming/fixed_point_in_time.txt new file mode 100644 index 00000000000..8245ecdb13e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fixed_point_in_time.txt @@ -0,0 +1,9 @@ +Name:Fixed Point in Time +ManaCost:no cost +Types:Phenomenon +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When you encounter CARDNAME, until your next turn, if a player would planeswalk as a result of rolling the planar die, chaos ensues instead. (Then planeswalk away from this phenomenon.) +SVar:TrigEffect:DB$ Effect | ReplacementEffects$ ReplacePlaneswalk | Duration$ UntilYourNextTurn | SubAbility$ PWAway +SVar:ReplacePlaneswalk:Event$ Planeswalk | ValidCause$ PlanarDie | ReplaceWith$ Chaos | Description$ If a player would planeswalk as a result of rolling the planar die, chaos ensues instead. +SVar:Chaos:DB$ ChaosEnsues +SVar:PWAway:DB$ Planeswalk +Oracle:When you encounter Fixed Point in Time, until your next turn, if a player would planeswalk as a result of rolling the planar die, chaos ensues instead. (Then planeswalk away from this phenomenon.)