mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
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:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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
|
||||
|
||||
18
res/cardsfolder/v/vesuvan_shapeshifter.txt
Normal file
18
res/cardsfolder/v/vesuvan_shapeshifter.txt
Normal 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
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
60
src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java
Normal file
60
src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java
Normal 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   HashMap<String, String>
|
||||
* @param host   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"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user