From 9ab1629aa5f4db8b6e4fe06773d9a01ba693a81d Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 26 Sep 2015 15:03:51 +0000 Subject: [PATCH] - Another attempt at fixing Morbid + Awaken and other similar interactions (e.g. Awaken + Flesh Allergy). --- .../src/main/java/forge/game/GameAction.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 2 +- .../main/java/forge/game/card/CardUtil.java | 37 ++++++++++++++-- .../game/zone/PlayerZoneBattlefield.java | 4 +- .../src/main/java/forge/game/zone/Zone.java | 42 +++++++++++++++++-- 5 files changed, 76 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 6e2cb00e155..e53c34b310a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -251,7 +251,7 @@ public class GameAction { // "enter the battlefield as a copy" - apply code here // but how to query for input here and continue later while the callers assume synchronous result? - zoneTo.add(copied, position); + zoneTo.add(copied, position, c); // the modified state of the card is also reported here (e.g. for Morbid + Awaken) if (fromBattlefield) { c.setZone(zoneTo); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index c496e4d7d33..e9335aa8322 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1443,7 +1443,7 @@ public class CardFactoryUtil { // Count$Morbid.. if (sq[0].startsWith("Morbid")) { - final CardCollection res = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Battlefield, "Creature", c); + final CardCollection res = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Battlefield, "Creature", c, true); if (res.size() > 0) { return doXMath(Integer.parseInt(sq[1]), m, c); } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index a5d2e13047a..5f47afd131d 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -151,18 +151,33 @@ public final class CardUtil { * @param from zone coming from * @param valid a isValid expression * @param src a Card object + * @param checkLatestState a boolean, true if the latest state of the card as it left the original zone needs to be checked * @return a CardCollection that matches the given criteria */ public static CardCollection getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { + return getThisTurnEntered(to, from, valid, src, true); + } + + /** + * getThisTurnEntered. + * + * @param to zone going to + * @param from zone coming from + * @param valid a isValid expression + * @param src a Card object + * @param checkLatestState a boolean, true if the latest state of the card as it left the original zone needs to be checked + * @return a CardCollection that matches the given criteria + */ + public static CardCollection getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src, final boolean checkLatestState) { CardCollection res = new CardCollection(); final Game game = src.getGame(); if (to != ZoneType.Stack) { for (Player p : game.getPlayers()) { - res.addAll(p.getZone(to).getCardsAddedThisTurn(from)); + res.addAll(p.getZone(to).getCardsAddedThisTurn(from, checkLatestState)); } } else { - res.addAll(game.getStackZone().getCardsAddedThisTurn(from)); + res.addAll(game.getStackZone().getCardsAddedThisTurn(from, checkLatestState)); } res = CardLists.getValidCards(res, valid, src.getController(), src); return res; @@ -175,18 +190,32 @@ public final class CardUtil { * @param from zone coming from * @param valid a isValid expression * @param src a Card object + * @param checkLatestState a boolean, true if the latest state of the card as it left the original zone needs to be checked * @return a CardCollection that matches the given criteria */ public static CardCollection getLastTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { + return getLastTurnEntered(to, from, valid, src, true); + } + + /** + * getLastTurnEntered. + * + * @param to zone going to + * @param from zone coming from + * @param valid a isValid expression + * @param src a Card object + * @return a CardCollection that matches the given criteria + */ + public static CardCollection getLastTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src, final boolean checkLatestState) { CardCollection res = new CardCollection(); final Game game = src.getGame(); if (to != ZoneType.Stack) { for (Player p : game.getPlayers()) { - res.addAll(p.getZone(to).getCardsAddedLastTurn(from)); + res.addAll(p.getZone(to).getCardsAddedLastTurn(from, checkLatestState)); } } else { - res.addAll(game.getStackZone().getCardsAddedLastTurn(from)); + res.addAll(game.getStackZone().getCardsAddedLastTurn(from, checkLatestState)); } res = CardLists.getValidCards(res, valid, src.getController(), src); return res; diff --git a/forge-game/src/main/java/forge/game/zone/PlayerZoneBattlefield.java b/forge-game/src/main/java/forge/game/zone/PlayerZoneBattlefield.java index c08dd624d3b..74f59140573 100644 --- a/forge-game/src/main/java/forge/game/zone/PlayerZoneBattlefield.java +++ b/forge-game/src/main/java/forge/game/zone/PlayerZoneBattlefield.java @@ -45,12 +45,12 @@ public class PlayerZoneBattlefield extends PlayerZone { /** {@inheritDoc} */ @Override - public final void add(final Card c, final Integer position) { + public final void add(final Card c, final Integer position, final Card latestState) { if (c == null) { throw new RuntimeException("PlayerZoneComesInto Play : add() object is null"); } - super.add(c, position); + super.add(c, position, latestState); if (trigger) { // ETBTapped static abilities diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index f201e22f23d..8994bf8babb 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -50,6 +50,8 @@ public class Zone implements java.io.Serializable, Iterable { protected final transient MapOfLists cardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); protected final transient MapOfLists cardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); public Zone(final ZoneType zone0, Game game0) { zoneType = zone0; @@ -72,12 +74,17 @@ public class Zone implements java.io.Serializable, Iterable { add(c, null); } - public void add(final Card c, final Integer index) { + public final void add(final Card c, final Integer index) { + add(c, null, null); + } + + public void add(final Card c, final Integer index, final Card latestState) { // Immutable cards are usually emblems and effects if (!c.isImmutable()) { final Zone oldZone = game.getZoneOf(c); final ZoneType zt = oldZone == null ? ZoneType.Stack : oldZone.getZoneType(); cardsAddedThisTurn.add(zt, c); + latestStateCardsAddedThisTurn.add(zt, latestState != null ? latestState : c); } c.setTurnInZone(game.getPhaseHandler().getTurn()); @@ -157,18 +164,42 @@ public class Zone implements java.io.Serializable, Iterable { return cardsAddedThisTurn; } + public final MapOfLists getCardsAddedThisTurn(boolean latestState) { + if (latestState) { + return latestStateCardsAddedThisTurn; + } else { + return cardsAddedThisTurn; + } + } + public final MapOfLists getCardsAddedLastTurn() { return cardsAddedLastTurn; } + public final MapOfLists getCardsAddedLastTurn(boolean latestState) { + if (latestState) { + return latestStateCardsAddedLastTurn; + } else { + return cardsAddedLastTurn; + } + } + public final CardCollectionView getCardsAddedThisTurn(final ZoneType origin) { + return getCardsAddedThisTurn(origin, false); + } + + public final CardCollectionView getCardsAddedThisTurn(final ZoneType origin, boolean latestState) { //System.out.print("Request cards put into " + getZoneType() + " from " + origin + ".Amount: "); - return getCardsAdded(cardsAddedThisTurn, origin); + return getCardsAdded(latestState ? latestStateCardsAddedThisTurn : cardsAddedThisTurn, origin); } public final CardCollectionView getCardsAddedLastTurn(final ZoneType origin) { + return getCardsAddedLastTurn(origin, false); + } + + public final CardCollectionView getCardsAddedLastTurn(final ZoneType origin, boolean latestState) { //System.out.print("Last turn - Request cards put into " + getZoneType() + " from " + origin + ".Amount: "); - return getCardsAdded(cardsAddedLastTurn, origin); + return getCardsAdded(latestState ? latestStateCardsAddedLastTurn : cardsAddedLastTurn, origin); } private static CardCollectionView getCardsAdded(final MapOfLists cardsAdded, final ZoneType origin) { @@ -187,10 +218,15 @@ public class Zone implements java.io.Serializable, Iterable { public final void resetCardsAddedThisTurn() { cardsAddedLastTurn.clear(); + latestStateCardsAddedLastTurn.clear(); for (final Entry> entry : cardsAddedThisTurn.entrySet()) { cardsAddedLastTurn.addAll(entry.getKey(), entry.getValue()); } + for (final Entry> entry : latestStateCardsAddedThisTurn.entrySet()) { + latestStateCardsAddedLastTurn.addAll(entry.getKey(), entry.getValue()); + } cardsAddedThisTurn.clear(); + latestStateCardsAddedThisTurn.clear(); } @Override