Facedown: fix effects turning cards face down in exile

This commit is contained in:
Hans Mackowiak
2019-05-19 13:28:10 +00:00
committed by Michael Kamensky
parent b8a0882b66
commit 08041e14fb
5 changed files with 31 additions and 44 deletions

View File

@@ -185,8 +185,7 @@ public class GameAction {
// all sort of funky shenanigans may happen later (e.g. their ETB replacement effects are set // all sort of funky shenanigans may happen later (e.g. their ETB replacement effects are set
// up on the wrong card state etc.). // up on the wrong card state etc.).
if (wasFacedown && (fromBattlefield || (toHand && zoneFrom.is(ZoneType.Exile)))) { if (wasFacedown && (fromBattlefield || (toHand && zoneFrom.is(ZoneType.Exile)))) {
c.setState(CardStateName.Original, true); c.turnFaceUp();
c.runFaceupCommands();
} }
if (!c.isToken()) { if (!c.isToken()) {
@@ -445,13 +444,9 @@ public class GameAction {
// rule 504.6: reveal a face-down card leaving the stack // rule 504.6: reveal a face-down card leaving the stack
if (zoneFrom != null && zoneTo != null && zoneFrom.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield) && wasFacedown) { if (zoneFrom != null && zoneTo != null && zoneFrom.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield) && wasFacedown) {
// FIXME: tracker freeze-unfreeze is needed here to avoid a bug with the card staying face down in the View for the reveal Card revealLKI = CardUtil.getLKICopy(c);
boolean trackerFrozen = game.getTracker().isFrozen(); revealLKI.turnFaceUp(true, false);
game.getTracker().unfreeze(); reveal(new CardCollection(revealLKI), revealLKI.getOwner(), true, "Face-down card moves from the stack: ");
c.setState(CardStateName.Original, true);
reveal(new CardCollection(c), c.getOwner(), true, "Face-down card moves from the stack: ");
c.setState(CardStateName.FaceDown, true);
if (trackerFrozen) { game.getTracker().freeze(); }
} }
if (fromBattlefield) { if (fromBattlefield) {
@@ -480,13 +475,11 @@ public class GameAction {
} }
// Reveal if face-down // Reveal if face-down
if (wasFacedown) { if (wasFacedown) {
// FIXME: tracker freeze-unfreeze is needed here to avoid a bug with the card staying face down in the View for the reveal Card revealLKI = CardUtil.getLKICopy(c);
boolean trackerFrozen = game.getTracker().isFrozen(); revealLKI.turnFaceUp(true, false);
game.getTracker().unfreeze();
c.setState(CardStateName.Original, true); reveal(new CardCollection(revealLKI), revealLKI.getOwner(), true, "Face-down card leaves the battlefield: ");
reveal(new CardCollection(c), c.getOwner(), true, "Face-down card leaves the battlefield: ");
c.setState(CardStateName.FaceDown, true);
if (trackerFrozen) { game.getTracker().freeze(); }
copied.setState(CardStateName.Original, true); copied.setState(CardStateName.Original, true);
} }
unattachCardLeavingBattlefield(copied); unattachCardLeavingBattlefield(copied);

View File

@@ -2,7 +2,6 @@ package forge.game.ability.effects;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import forge.card.CardStateName;
import forge.game.Game; import forge.game.Game;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
@@ -43,7 +42,7 @@ public class ManifestEffect extends SpellAbilityEffect {
//check if lki would be a land entering the battlefield //check if lki would be a land entering the battlefield
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLandBattlefield)) { if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLandBattlefield)) {
Card lki = CardUtil.getLKICopy(c); Card lki = CardUtil.getLKICopy(c);
lki.setState(CardStateName.FaceDown, false); lki.turnFaceDownNoUpdate();
lki.setManifested(true); lki.setManifested(true);
lki.setLastKnownZone(p.getZone(ZoneType.Battlefield)); lki.setLastKnownZone(p.getZone(ZoneType.Battlefield));
CardCollection preList = new CardCollection(lki); CardCollection preList = new CardCollection(lki);

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.GameLogEntryType; import forge.game.GameLogEntryType;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
@@ -64,7 +63,7 @@ public class MillEffect extends SpellAbilityEffect {
for (final Card c : milled) { for (final Card c : milled) {
c.setExiledWith(host); c.setExiledWith(host);
if (facedown) { if (facedown) {
c.setState(CardStateName.FaceDown, true); c.turnFaceDown(true);
} }
} }
} }

View File

@@ -14,7 +14,6 @@ import com.google.common.collect.Lists;
import forge.GameCommand; import forge.GameCommand;
import forge.StaticData; import forge.StaticData;
import forge.card.CardRulesPredicates; import forge.card.CardRulesPredicates;
import forge.card.CardStateName;
import forge.game.Game; import forge.game.Game;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
@@ -153,7 +152,7 @@ public class PlayEffect extends SpellAbilityEffect {
final boolean wasFaceDown; final boolean wasFaceDown;
if (tgtCard.isFaceDown()) { if (tgtCard.isFaceDown()) {
tgtCard.setState(CardStateName.Original, false); tgtCard.turnFaceUp(false, false);
wasFaceDown = true; wasFaceDown = true;
} else { } else {
wasFaceDown = false; wasFaceDown = false;
@@ -165,7 +164,7 @@ public class PlayEffect extends SpellAbilityEffect {
if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace("Do you want to play", TextUtil.addSuffix(tgtCard.toString(),"?")))) { if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace("Do you want to play", TextUtil.addSuffix(tgtCard.toString(),"?")))) {
if (wasFaceDown) { if (wasFaceDown) {
tgtCard.setState(CardStateName.FaceDown, false); tgtCard.turnFaceDownNoUpdate();
} }
saidNoTo.add(tgtCard); saidNoTo.add(tgtCard);
continue; continue;

View File

@@ -7,6 +7,7 @@ import forge.game.GameLogEntryType;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.card.CardUtil;
import forge.game.card.CounterType; import forge.game.card.CounterType;
import forge.game.event.GameEventCardStatsChanged; import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player; import forge.game.player.Player;
@@ -73,13 +74,9 @@ public class SetStateEffect extends SpellAbilityEffect {
// facedown cards that are not Permanent, can't turn faceup there // facedown cards that are not Permanent, can't turn faceup there
if ("TurnFace".equals(mode) && tgt.isFaceDown() && tgt.isInZone(ZoneType.Battlefield) if ("TurnFace".equals(mode) && tgt.isFaceDown() && tgt.isInZone(ZoneType.Battlefield)
&& !tgt.getState(CardStateName.Original).getType().isPermanent()) { && !tgt.getState(CardStateName.Original).getType().isPermanent()) {
// need to cache manifest status Card lki = CardUtil.getLKICopy(tgt);
boolean manifested = tgt.isManifested(); lki.turnFaceUp(true, false);
// FIXME setState has to many other Consequences, use LKI? game.getAction().reveal(new CardCollection(lki), lki.getOwner(), true, "Face-down card can't turn face up");
tgt.setState(CardStateName.Original, true);
game.getAction().reveal(new CardCollection(tgt), tgt.getOwner(), true, "Face-down card can't turn face up");
tgt.setState(CardStateName.FaceDown, true);
tgt.setManifested(manifested);
continue; continue;
} }