mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Facedown: fix effects turning cards face down in exile
This commit is contained in:
committed by
Michael Kamensky
parent
b8a0882b66
commit
08041e14fb
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user