- ORI:Added Liliana, Heretical Healer

This commit is contained in:
swordshine
2015-03-08 06:35:08 +00:00
parent 006f0534db
commit aed4b5cdfa
6 changed files with 41 additions and 41 deletions

View File

@@ -12,7 +12,6 @@ import forge.ai.PlayerControllerAi;
import forge.ai.simulation.GameStateEvaluator.Score; import forge.ai.simulation.GameStateEvaluator.Score;
import forge.game.Game; import forge.game.Game;
import forge.game.GameObject; import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.player.Player; import forge.game.player.Player;

View File

@@ -442,6 +442,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) { if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) {
tgtC.setTapped(true); tgtC.setTapped(true);
} }
if (sa.hasParam("Transformed") && tgtC.isDoubleFaced()) {
tgtC.changeCardState("Transform", null);
}
if (sa.hasParam("WithCounters")) { if (sa.hasParam("WithCounters")) {
String[] parse = sa.getParam("WithCounters").split("_"); String[] parse = sa.getParam("WithCounters").split("_");
tgtC.addCounter(CounterType.getType(parse[0]), Integer.parseInt(parse[1]), true); tgtC.addCounter(CounterType.getType(parse[0]), Integer.parseInt(parse[1]), true);

View File

@@ -1,6 +1,5 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import forge.card.CardStateName;
import forge.game.Game; import forge.game.Game;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
@@ -50,7 +49,7 @@ public class SetStateEffect extends SpellAbilityEffect {
continue; continue;
} }
boolean hasTransformed = changeCardState(tgt, sa.getParam("Mode"), sa.getParam("NewState")); boolean hasTransformed = tgt.changeCardState(sa.getParam("Mode"), sa.getParam("NewState"));
if ( hasTransformed ) { if ( hasTransformed ) {
game.fireEvent(new GameEventCardStatsChanged(tgt)); game.fireEvent(new GameEventCardStatsChanged(tgt));
} }
@@ -59,40 +58,4 @@ public class SetStateEffect extends SpellAbilityEffect {
} }
} }
} }
private static boolean changeCardState(final Card tgt, final String mode, final String customState) {
if (mode == null)
return tgt.changeToState(CardStateName.smartValueOf(customState));
// flip and face-down don't overlap. That is there is no chance to turn face down a flipped permanent
// and then any effect have it turn upface again and demand its former flip state to be restored
// Proof: Morph cards never have ability that makes them flip, Ixidron does not suppose cards to be turned face up again,
// Illusionary Mask affects cards in hand.
CardStateName oldState = tgt.getCurrentStateName();
if (mode.equals("Transform") && tgt.isDoubleFaced()) {
if (tgt.hasKeyword("CARDNAME can't transform")) {
return false;
}
CardStateName destState = oldState == CardStateName.Transformed ? CardStateName.Original : CardStateName.Transformed;
return tgt.changeToState(destState);
} else if (mode.equals("Flip") && tgt.isFlipCard()) {
CardStateName destState = oldState == CardStateName.Flipped ? CardStateName.Original : CardStateName.Flipped;
return tgt.changeToState(destState);
} else if (mode.equals("TurnFace")) {
if (oldState == CardStateName.Original) {
// Reset cloned state if Vesuvan Shapeshifter
if (tgt.isCloned() && tgt.getState(CardStateName.Cloner).getName().equals("Vesuvan Shapeshifter")) {
tgt.switchStates(CardStateName.Cloner, CardStateName.Original, false);
tgt.setState(CardStateName.Original, false);
tgt.clearStates(CardStateName.Cloner, false);
}
return tgt.turnFaceDown();
} else if (oldState == CardStateName.FaceDown) {
return tgt.turnFaceUp();
}
}
return false;
}
} }

View File

@@ -410,6 +410,41 @@ public class Card extends GameEntity implements Comparable<Card> {
preFaceDownState = preCharacteristic; preFaceDownState = preCharacteristic;
} }
public boolean changeCardState(final String mode, final String customState) {
if (mode == null)
return changeToState(CardStateName.smartValueOf(customState));
// flip and face-down don't overlap. That is there is no chance to turn face down a flipped permanent
// and then any effect have it turn upface again and demand its former flip state to be restored
// Proof: Morph cards never have ability that makes them flip, Ixidron does not suppose cards to be turned face up again,
// Illusionary Mask affects cards in hand.
CardStateName oldState = getCurrentStateName();
if (mode.equals("Transform") && isDoubleFaced()) {
if (hasKeyword("CARDNAME can't transform")) {
return false;
}
CardStateName destState = oldState == CardStateName.Transformed ? CardStateName.Original : CardStateName.Transformed;
return changeToState(destState);
} else if (mode.equals("Flip") && isFlipCard()) {
CardStateName destState = oldState == CardStateName.Flipped ? CardStateName.Original : CardStateName.Flipped;
return changeToState(destState);
} else if (mode.equals("TurnFace")) {
if (oldState == CardStateName.Original) {
// Reset cloned state if Vesuvan Shapeshifter
if (isCloned() && getState(CardStateName.Cloner).getName().equals("Vesuvan Shapeshifter")) {
switchStates(CardStateName.Cloner, CardStateName.Original, false);
setState(CardStateName.Original, false);
clearStates(CardStateName.Cloner, false);
}
return turnFaceDown();
} else if (oldState == CardStateName.FaceDown) {
return turnFaceUp();
}
}
return false;
}
public Card manifest(Player p) { public Card manifest(Player p) {
// Turn Face Down (even if it's DFC). // Turn Face Down (even if it's DFC).
CardState originalCard = this.getState(CardStateName.Original); CardState originalCard = this.getState(CardStateName.Original);

View File

@@ -5,8 +5,7 @@ PT:2/2
K:Vigilance K:Vigilance
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDelay | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield transformed under your control at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDelay | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield transformed under your control at the beginning of the next end step.
SVar:TrigDelay:AB$ DelayedTrigger | Cost$ 0 | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredCard | TriggerDescription$ return CARDNAME to the battlefield transformed SVar:TrigDelay:AB$ DelayedTrigger | Cost$ 0 | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredCard | TriggerDescription$ return CARDNAME to the battlefield transformed
SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ TrigTransform SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield | Transformed$ True | GainControl$ True
SVar:TrigTransform:DB$ SetState | Cost$ 0 | Defined$ DelayTriggerRemembered | Mode$ Transform
SVar:Picture:http://www.wizards.com/global/images/magic/general/loyal_cathar.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/loyal_cathar.jpg
AlternateMode:DoubleFaced AlternateMode:DoubleFaced
Oracle:Vigilance\nWhen Loyal Cathar dies, return it to the battlefield transformed under your control at the beginning of the next end step. Oracle:Vigilance\nWhen Loyal Cathar dies, return it to the battlefield transformed under your control at the beginning of the next end step.

View File

@@ -287,6 +287,7 @@ Kiora
Koth Koth
Liliana Liliana
Nahiri Nahiri
Narset
Nissa Nissa
Nixilis Nixilis
Ral Ral