Added replacement effect handler for turns face up. Moved running of triggers for TurnFaceUp to turnFaceUp method in Card.java. Added Vesuvan Shapeshifter.

This commit is contained in:
ArsenalNut
2013-01-03 16:00:22 +00:00
parent c6523dd4fd
commit 27a0f313a0
7 changed files with 103 additions and 7 deletions

2
.gitattributes vendored
View File

@@ -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

View File

@@ -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

View File

@@ -364,7 +364,20 @@ public class Card extends GameEntity implements Comparable<Card> {
*/
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<String, Object> repParams = new HashMap<String, Object>();
repParams.put("Event", "TurnFaceUp");
repParams.put("Affected", this);
Singletons.getModel().getGame().getReplacementHandler().run(repParams);
// Run triggers
final Map<String, Object> runParams = new TreeMap<String, Object>();
runParams.put("Card", this);
Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.TurnFaceUp, runParams);
}
return result;
}
return false;

View File

@@ -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);
}

View File

@@ -900,11 +900,6 @@ public class CardFactoryUtil {
@Override
public void resolve() {
if (sourceCard.turnFaceUp()) {
// Run triggers
final Map<String, Object> runParams = new TreeMap<String, Object>();
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());

View File

@@ -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 &emsp; HashMap<String, String>
* @param host &emsp; Card
*/
public ReplaceTurnFaceUp(final HashMap<String, String> mapParams, final Card host) {
super(mapParams, host);
}
/* (non-Javadoc)
* @see forge.card.replacement.ReplacementEffect#canReplace(java.util.HashMap)
*/
@Override
public boolean canReplace(HashMap<String, Object> 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<String, Object> runParams, SpellAbility sa) {
sa.setReplacingObject("Card", runParams.get("Affected"));
}
}

View File

@@ -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");