mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
- ORI:Added Liliana, Heretical Healer
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -287,6 +287,7 @@ Kiora
|
|||||||
Koth
|
Koth
|
||||||
Liliana
|
Liliana
|
||||||
Nahiri
|
Nahiri
|
||||||
|
Narset
|
||||||
Nissa
|
Nissa
|
||||||
Nixilis
|
Nixilis
|
||||||
Ral
|
Ral
|
||||||
|
|||||||
Reference in New Issue
Block a user