From d18f891e8ff6bf88dcfbb6736fd5d8d6df7e2fb0 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 15 Jul 2018 18:42:01 +0200 Subject: [PATCH] ChangeZoneEffect: special Facedown rules for Tezzeret --- .../src/main/java/forge/game/GameAction.java | 1 + .../ability/effects/ChangeZoneEffect.java | 43 ++++++++++++++++++- .../src/main/java/forge/game/card/Card.java | 19 +++++++- .../t/tezzeret_cruel_machinist.txt | 9 ++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index cf44f0511ff..2bbe77a9967 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -153,6 +153,7 @@ public class GameAction { // up on the wrong card state etc.). if (c.isFaceDown() && (fromBattlefield || (toHand && zoneFrom.is(ZoneType.Exile)))) { c.setState(CardStateName.Original, true); + c.runFaceupCommands(); } // Clean up the temporary Dash SVar when the Dashed card leaves the battlefield diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 096e780d397..fb6a0234b37 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -6,7 +6,9 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import forge.GameCommand; import forge.card.CardStateName; +import forge.card.CardType; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; @@ -32,6 +34,7 @@ import forge.util.collect.*; import forge.util.Lang; import forge.util.MessageUtil; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -1101,11 +1104,49 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } + // need to be facedown before it hits the battlefield in case of Replacement Effects or Trigger + if (sa.hasParam("FaceDown") && ZoneType.Battlefield.equals(destination)) { + c.setState(CardStateName.FaceDown, true); + + // set New Pt doesn't work because this values need to be copyable for clone effects + if (sa.hasParam("FaceDownPower") || sa.hasParam("FaceDownToughness")) { + if (sa.hasParam("FaceDownPower")) { + c.setBasePower(AbilityUtils.calculateAmount( + source, sa.getParam("FaceDownPower"), sa)); + } + if (sa.hasParam("FaceDownToughness")) { + c.setBaseToughness(AbilityUtils.calculateAmount( + source, sa.getParam("FaceDownToughness"), sa)); + } + } + + if (sa.hasParam("FaceDownAddType")) { + CardType t = new CardType(c.getCurrentState().getType()); + t.addAll(Arrays.asList(sa.getParam("FaceDownAddType").split(","))); + c.getCurrentState().setType(t); + } + + if (sa.hasParam("FaceDownPower") || sa.hasParam("FaceDownToughness") + || sa.hasParam("FaceDownAddType")) { + final GameCommand unanimate = new GameCommand() { + private static final long serialVersionUID = 8853789549297846163L; + + @Override + public void run() { + c.clearStates(CardStateName.FaceDown, true); + } + }; + + c.addFaceupCommand(unanimate); + } + } movedCard = game.getAction().moveTo(c.getController().getZone(destination), c, sa, null); if (sa.hasParam("Tapped")) { movedCard.setTapped(true); } - if (sa.hasParam("FaceDown")) { + + // need to do that again? + if (sa.hasParam("FaceDown") && !ZoneType.Battlefield.equals(destination)) { movedCard.setState(CardStateName.FaceDown, true); } movedCard.setTimestamp(ts); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index af6bac96f8c..3d824497574 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -234,6 +234,7 @@ public class Card extends GameEntity implements Comparable { private final List untapCommandList = Lists.newArrayList(); private final List changeControllerCommandList = Lists.newArrayList(); private final List unattachCommandList = Lists.newArrayList(); + private final List faceupCommandList = Lists.newArrayList(); private final List staticCommandList = Lists.newArrayList(); private final static ImmutableList storableSVars = ImmutableList.of("ChosenX"); @@ -589,6 +590,12 @@ public class Card extends GameEntity implements Comparable { } boolean result = setState(preFaceDownState, true); + // need to run faceup commands, currently + // it does cleanup the modified facedown state + if (result) { + runFaceupCommands(); + } + if (result && runTriggers) { // Run replacement effects Map repParams = Maps.newHashMap(); @@ -2389,13 +2396,23 @@ public class Card extends GameEntity implements Comparable { public final void addUnattachCommand(final GameCommand c) { unattachCommandList.add(c); } - + + public final void addFaceupCommand(final GameCommand c) { + faceupCommandList.add(c); + } + public final void runUnattachCommands() { for (final GameCommand c : unattachCommandList) { c.run(); } } + public final void runFaceupCommands() { + for (final GameCommand c : faceupCommandList) { + c.run(); + } + } + public final void addChangeControllerCommand(final GameCommand c) { changeControllerCommandList.add(c); } diff --git a/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt new file mode 100644 index 00000000000..c24d77aad20 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt @@ -0,0 +1,9 @@ +Name:Tezzeret, Cruel Machinist +ManaCost:4 U U +Loyalty:4 +Types:Legendary Planeswalker Tezzeret +A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. +A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact | SpellDescription$ Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types. +A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card | ChangeNum$ X | References$ X | FaceDown$ True | FaceDownPower$ 5 | FaceDownToughness$ 5 | FaceDownAddType$ Artifact,Creature | StackDescription$ SpellDescription | SpellDescription$ Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures. +SVar:X:Count$InYourHand +Oracle:[+1]: Draw a card.\n[0]: Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types.\n[-7]: Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures.