From 393207c9d899e82596ca9965406cdc5df48a0808 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 9 Mar 2019 13:59:21 +0100 Subject: [PATCH] Card: fixed LandAbility + FaceDown + MayPlay --- .../main/java/forge/game/GameActionUtil.java | 6 ++++ .../game/ability/effects/TokenEffect.java | 6 ++++ .../src/main/java/forge/game/card/Card.java | 33 +++++++++++++++++-- .../java/forge/game/spellability/Spell.java | 2 ++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 3c3eae53dd9..dc3f6079cc7 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -89,6 +89,8 @@ public final class GameActionUtil { } if (lkicheck) { + // double freeze tracker, so it doesn't update view + game.getTracker().freeze(); CardCollection preList = new CardCollection(source); game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList); } @@ -164,6 +166,10 @@ public final class GameActionUtil { // reset static abilities if (lkicheck) { game.getAction().checkStaticAbilities(false); + // clear delayed changes, this check should not have updated the view + game.getTracker().clearDelayed(); + // need to unfreeze tracker + game.getTracker().unfreeze(); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index b1a59467e76..3122bf3f112 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -493,6 +493,8 @@ public class TokenEffect extends SpellAbilityEffect { lki.setLastKnownZone(tok.getController().getZone(ZoneType.Battlefield)); + // double freeze tracker, so it doesn't update view + game.getTracker().freeze(); CardCollection preList = new CardCollection(lki); game.getAction().checkStaticAbilities(false, Sets.newHashSet(lki), preList); @@ -505,6 +507,10 @@ public class TokenEffect extends SpellAbilityEffect { // reset static abilities game.getAction().checkStaticAbilities(false); + // clear delayed changes, this check should not have updated the view + game.getTracker().clearDelayed(); + // need to unfreeze tracker + game.getTracker().unfreeze(); if (!canAttach) { // Token can't attach to it diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index ca16c6766fa..58dee0138ae 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5561,19 +5561,48 @@ public class Card extends GameEntity implements Comparable { } abilities.removeAll(toRemove); - if (getState(CardStateName.Original).getType().isLand()) { + if (getState(CardStateName.Original).getType().isLand() && !getLastKnownZone().is(ZoneType.Battlefield)) { LandAbility la = new LandAbility(this, player, null); if (la.canPlay()) { abilities.add(la); } + Card source = this; + boolean lkicheck = false; + + // if Card is Facedown, need to check if MayPlay still applies + if (isFaceDown()) { + lkicheck = true; + source = CardUtil.getLKICopy(source); + + // TODO need to be changed with CloneRewrite and FaceDownState? + source.turnFaceUp(false, false); + source.getCurrentState().copyFrom(getState(CardStateName.Original), true); + } + + if (lkicheck) { + // double freeze tracker, so it doesn't update view + game.getTracker().freeze(); + CardCollection preList = new CardCollection(source); + game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList); + } + // extra for MayPlay - for (CardPlayOption o : this.mayPlay(player)) { + for (CardPlayOption o : source.mayPlay(player)) { la = new LandAbility(this, player, o.getAbility()); if (la.canPlay()) { abilities.add(la); } } + + // reset static abilities + if (lkicheck) { + game.getAction().checkStaticAbilities(false); + // clear delayed changes, this check should not have updated the view + game.getTracker().clearDelayed(); + // need to unfreeze tracker + game.getTracker().unfreeze(); + } } return abilities; diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 02ca72951dd..b3761737538 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -143,6 +143,8 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable // reset static abilities if (lkicheck) { game.getAction().checkStaticAbilities(false); + // clear delayed changes, this check should not have updated the view + game.getTracker().clearDelayed(); game.getTracker().unfreeze(); }