From f14de1c2c1f9a284e61caa3f4fe4ad28d2f78677 Mon Sep 17 00:00:00 2001 From: Alumi Date: Sat, 17 Jul 2021 03:29:13 +0000 Subject: [PATCH] Handle mutate and wasCast interaction --- .../src/main/java/forge/game/GameAction.java | 15 +++++++++------ .../src/main/java/forge/game/card/Card.java | 13 +++++++++++++ .../main/java/forge/game/card/CardProperty.java | 7 +++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 19a9f25ac72..b0a62990da8 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -705,17 +705,20 @@ public class GameAction { } } - if (zoneFrom == null) { - c.setCastFrom(null); - c.setCastSA(null); - } else if (zoneTo.is(ZoneType.Stack)) { - c.setCastFrom(zoneFrom.getZoneType()); + if (zoneTo.is(ZoneType.Stack)) { + // zoneFrom maybe null if the spell is cast from "Ouside the game", ex. ability of Garth One-Eye + if (zoneFrom == null) { + c.setCastFrom(null); + } else { + c.setCastFrom(zoneFrom.getZoneType()); + } if (cause != null && cause.isSpell() && c.equals(cause.getHostCard()) && !c.isCopiedSpell()) { c.setCastSA(cause); } else { c.setCastSA(null); } - } else if (!(zoneTo.is(ZoneType.Battlefield) && zoneFrom.is(ZoneType.Stack))) { + } else if (zoneFrom == null || !(zoneFrom.is(ZoneType.Stack) && + (zoneTo.is(ZoneType.Battlefield) || zoneTo.is(ZoneType.Merged)))) { c.setCastFrom(null); c.setCastSA(null); } 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 07908174fac..f62cd15a2fe 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6036,6 +6036,19 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public void setCastFrom(final ZoneType castFrom0) { castFrom = castFrom0; } + public boolean wasCast() { + if (hasMergedCard()) { + boolean wasCast = false; + for (Card c : getMergedCards()) { + if (null != c.getCastFrom()) { + wasCast = true; + break; + } + } + return wasCast; + } + return getCastFrom() != null; + } public SpellAbility getCastSA() { return castSA; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index a7fb0555bf6..60bab6f6645 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1690,16 +1690,15 @@ public class CardProperty { return false; } } else if (property.equals("wasCast")) { - if (null == card.getCastFrom()) { + if (!card.wasCast()) { return false; } } else if (property.equals("wasNotCast")) { - if (null != card.getCastFrom()) { + if (card.wasCast()) { return false; } } else if (property.startsWith("wasCastFrom")) { - // How are we getting in here with a comma? - final String strZone = property.split(",")[0].substring(11); + final String strZone = property.substring(11); final ZoneType realZone = ZoneType.smartValueOf(strZone); if (realZone != card.getCastFrom()) { return false;