From 27a0f313a00a1815e6535cb688972ca8171ba240 Mon Sep 17 00:00:00 2001 From: ArsenalNut Date: Thu, 3 Jan 2013 16:00:22 +0000 Subject: [PATCH] Added replacement effect handler for turns face up. Moved running of triggers for TurnFaceUp to turnFaceUp method in Card.java. Added Vesuvan Shapeshifter. --- .gitattributes | 2 + res/cardsfolder/v/vesuvan_shapeshifter.txt | 18 ++++++ src/main/java/forge/Card.java | 15 ++++- .../effects/SetStateEffect.java | 6 ++ .../card/cardfactory/CardFactoryUtil.java | 5 -- .../card/replacement/ReplaceTurnFaceUp.java | 60 +++++++++++++++++++ .../card/replacement/ReplacementHandler.java | 4 +- 7 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 res/cardsfolder/v/vesuvan_shapeshifter.txt create mode 100644 src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java diff --git a/.gitattributes b/.gitattributes index 26829e4501c..1cf98de14e9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11085,6 +11085,7 @@ res/cardsfolder/v/vesper_ghoul.txt svneol=native#text/plain res/cardsfolder/v/vessel_of_endless_rest.txt -text res/cardsfolder/v/vesuva.txt -text res/cardsfolder/v/vesuvan_doppelganger.txt svneol=native#text/plain +res/cardsfolder/v/vesuvan_shapeshifter.txt -text res/cardsfolder/v/veteran_armorer.txt svneol=native#text/plain res/cardsfolder/v/veteran_armorsmith.txt svneol=native#text/plain res/cardsfolder/v/veteran_bodyguard.txt -text @@ -13184,6 +13185,7 @@ src/main/java/forge/card/replacement/ReplaceGainLife.java -text src/main/java/forge/card/replacement/ReplaceGameLoss.java -text src/main/java/forge/card/replacement/ReplaceMoved.java -text src/main/java/forge/card/replacement/ReplaceSetInMotion.java -text +src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java -text src/main/java/forge/card/replacement/ReplacementEffect.java -text src/main/java/forge/card/replacement/ReplacementHandler.java -text src/main/java/forge/card/replacement/ReplacementLayer.java -text diff --git a/res/cardsfolder/v/vesuvan_shapeshifter.txt b/res/cardsfolder/v/vesuvan_shapeshifter.txt new file mode 100644 index 00000000000..a9bd8ca5380 --- /dev/null +++ b/res/cardsfolder/v/vesuvan_shapeshifter.txt @@ -0,0 +1,18 @@ +Name:Vesuvan Shapeshifter +ManaCost:3 U U +Types:Creature Shapeshifter +Text:no text +PT:0/0 +K:Morph:1 U +K:ETBReplacement:Copy:ChooseCreature:Optional +# Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +SVar:ChooseCreature:DB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | AILogic$ Clone | RememberChosen$ True | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig +SVar:VesShapeUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesShapeTurn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may turn CARDNAME face down. +SVar:VesShapeTurn:AB$ SetState | Cost$ 0 | Defined$ Self | Mode$ TurnFace | ResetClone$ True +R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ ChooseCreature | ActiveZones$ Battlefield | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_shapeshifter.jpg +SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/90.jpg +Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +End \ No newline at end of file diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 9db5f460ce9..c0bbb954bf7 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -364,7 +364,20 @@ public class Card extends GameEntity implements Comparable { */ public boolean turnFaceUp() { if (this.curCharacteristics == CardCharacteristicName.FaceDown) { - return this.setState(this.preTFDCharacteristic); + boolean result = this.setState(this.preTFDCharacteristic); + if (result) { + // Run replacement effects + HashMap repParams = new HashMap(); + repParams.put("Event", "TurnFaceUp"); + repParams.put("Affected", this); + Singletons.getModel().getGame().getReplacementHandler().run(repParams); + + // Run triggers + final Map runParams = new TreeMap(); + runParams.put("Card", this); + Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.TurnFaceUp, runParams); + } + return result; } return false; diff --git a/src/main/java/forge/card/abilityfactory/effects/SetStateEffect.java b/src/main/java/forge/card/abilityfactory/effects/SetStateEffect.java index 9efa9bb1fca..922035ff8dd 100644 --- a/src/main/java/forge/card/abilityfactory/effects/SetStateEffect.java +++ b/src/main/java/forge/card/abilityfactory/effects/SetStateEffect.java @@ -98,6 +98,12 @@ public class SetStateEffect extends SpellEffect { } } else if (mode.equals("TurnFace")) { if (tgt.getCurState() == CardCharacteristicName.Original) { + // Reset cloned state if Vesuvan Shapeshifter + if (tgt.isCloned() && tgt.getState(CardCharacteristicName.Cloner).getName().equals("Vesuvan Shapeshifter")) { + tgt.switchStates(CardCharacteristicName.Cloner, CardCharacteristicName.Original); + tgt.setState(CardCharacteristicName.Original); + tgt.clearStates(CardCharacteristicName.Cloner); + } if (tgt.turnFaceDown() && remChanged) { host.addRemembered(tgt); } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index ebfd7e880fc..98549a00369 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -900,11 +900,6 @@ public class CardFactoryUtil { @Override public void resolve() { if (sourceCard.turnFaceUp()) { - // Run triggers - final Map runParams = new TreeMap(); - runParams.put("Card", sourceCard); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.TurnFaceUp, runParams); - StringBuilder sb = new StringBuilder(); sb.append(this.getActivatingPlayer()).append(" has unmorphed "); sb.append(sourceCard.getName()); diff --git a/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java b/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java new file mode 100644 index 00000000000..5bbd31008c5 --- /dev/null +++ b/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java @@ -0,0 +1,60 @@ +package forge.card.replacement; + +import java.util.HashMap; + +import forge.Card; +import forge.card.spellability.SpellAbility; + +/** + * TODO: Write javadoc for this type. + * + */ +public class ReplaceTurnFaceUp extends ReplacementEffect { + + /** + * + * TODO: Write javadoc for Constructor. + * @param mapParams   HashMap + * @param host   Card + */ + public ReplaceTurnFaceUp(final HashMap mapParams, final Card host) { + super(mapParams, host); + } + + /* (non-Javadoc) + * @see forge.card.replacement.ReplacementEffect#canReplace(java.util.HashMap) + */ + @Override + public boolean canReplace(HashMap runParams) { + if (!runParams.get("Event").equals("TurnFaceUp")) { + return false; + } + if (this.getMapParams().containsKey("ValidCard")) { + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidCard").split(","), this.getHostCard())) { + return false; + } + } + return true; + } + + /* (non-Javadoc) + * @see forge.card.replacement.ReplacementEffect#getCopy() + */ + @Override + public ReplacementEffect getCopy() { + ReplacementEffect res = new ReplaceTurnFaceUp(this.getMapParams(), this.getHostCard()); + res.setOverridingAbility(this.getOverridingAbility()); + res.setActiveZone(validHostZones); + res.setLayer(getLayer()); + return res; + } + + /* (non-Javadoc) + * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) + */ + @Override + public void setReplacingObjects(HashMap runParams, SpellAbility sa) { + sa.setReplacingObject("Card", runParams.get("Affected")); + } + +} diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 8bfe7af3c5b..cd600b0fd5e 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -199,7 +199,7 @@ public class ReplacementHandler { } while(tailend != null); } - // Decider gets to choose wether or not to apply the replacement. + // Decider gets to choose whether or not to apply the replacement. if (replacementEffect.getMapParams().containsKey("Optional")) { Player optDecider = decider; if (mapParams.containsKey("OptionalDecider") && (effectSA != null)) { @@ -284,6 +284,8 @@ public class ReplacementHandler { ret = new ReplaceMoved(mapParams, host); } else if (eventToReplace.equals("SetInMotion")) { ret = new ReplaceSetInMotion(mapParams, host); + } else if (eventToReplace.equals("TurnFaceUp")) { + ret = new ReplaceTurnFaceUp(mapParams, host); } String activeZones = mapParams.get("ActiveZones");