diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index ddfc049d9ce..0f0af2e3c97 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1040,9 +1040,9 @@ public class PlayerControllerAi extends PlayerController { if (sa.isCopied()) { if (sa.isSpell()) { if (!sa.getHostCard().isInZone(ZoneType.Stack)) { - sa.setHostCard(player.getGame().getAction().moveToStack(sa.getHostCard(), sa)); + sa.setHostCard(getGame().getAction().moveToStack(sa.getHostCard(), sa)); } else { - player.getGame().getStackZone().add(sa.getHostCard()); + getGame().getStackZone().add(sa.getHostCard()); } } @@ -1053,13 +1053,13 @@ public class PlayerControllerAi extends PlayerController { */ if (sa.isMayChooseNewTargets() && !sa.setupTargets()) { if (sa.isSpell()) { - player.getGame().getAction().ceaseToExist(sa.getHostCard(), false); + getGame().getAction().ceaseToExist(sa.getHostCard(), false); } continue; } } // need finally add the new spell to the stack - player.getGame().getStack().add(sa); + getGame().getStack().add(sa); } } } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 01dfb9cf117..63147953b58 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -957,7 +957,10 @@ public class GameAction { if (c.isInZone(ZoneType.Stack)) { c.getGame().getStack().remove(c); } - c.getZone().remove(c); + // in some corner cases there's no zone yet (copied spell that failed targeting) + if (c.getZone() != null) { + c.getZone().remove(c); + } // CR 603.6c other players LTB triggers should work if (!skipTrig) { @@ -971,13 +974,15 @@ public class GameAction { if (lki == null) { lki = CardUtil.getLKICopy(c); } - if (game.getCombat() != null) { - game.getCombat().removeFromCombat(c); - game.getCombat().saveLKI(lki); - } - // again, make sure no triggers run from cards leaving controlled by loser - if (!lki.getController().equals(lki.getOwner())) { - game.getTriggerHandler().registerActiveLTBTrigger(lki); + if (lki.isInPlay()) { + if (game.getCombat() != null) { + game.getCombat().saveLKI(lki); + game.getCombat().removeFromCombat(c); + } + // again, make sure no triggers run from cards leaving controlled by loser + if (!lki.getController().equals(lki.getOwner())) { + game.getTriggerHandler().registerActiveLTBTrigger(lki); + } } final Map runParams = AbilityKey.mapFromCard(c); runParams.put(AbilityKey.CardLKI, lki); diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 5772e926b2c..7fac51009c9 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -295,6 +295,9 @@ public class Combat { // takes LKI into consideration, should use it at all times (though a single iteration over multimap seems faster) public final AttackingBand getBandOfAttacker(final Card c) { + if (c == null) { + return null; + } for (AttackingBand ab : attackedByBands.values()) { if (ab.contains(c)) { return ab;