From 8937d5a97d28338edf681703eaecc28273bc4bde Mon Sep 17 00:00:00 2001 From: TRT <> Date: Thu, 17 Mar 2022 14:13:11 +0100 Subject: [PATCH] fix RestartGame corner case + AI NPE from card changes --- .../main/java/forge/ai/ability/CountersPutOrRemoveAi.java | 5 ++++- forge-game/src/main/java/forge/game/GameAction.java | 8 ++++---- .../main/java/forge/game/ability/effects/PlayEffect.java | 5 +---- .../forge/game/ability/effects/RestartGameEffect.java | 4 ++-- .../src/main/java/forge/game/phase/PhaseHandler.java | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java index 31cf0c1899d..f9fa3764eae 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java @@ -183,7 +183,10 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - return doTgt(ai, sa, true); + if (sa.usesTargeting()) { + return doTgt(ai, sa, mandatory); + } + return mandatory; } /* diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 61817b15f8e..3b4a9d86998 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -510,7 +510,7 @@ public class GameAction { if (mergedCards != null) { // Move components of merged permanent here - // Also handle 721.3e and 903.9a + // Also handle 723.3e and 903.9a boolean wasToken = c.isToken(); if (commanderEffect != null) { for (final ReplacementEffect re : commanderEffect.getReplacementEffects()) { @@ -524,7 +524,7 @@ public class GameAction { if (card.isRealCommander()) { card.setMoveToCommandZone(true); } - // 721.3e & 903.9a + // 723.3e & 903.9a if (wasToken && !card.isRealToken() || card.isRealCommander()) { Map repParams = AbilityKey.mapFromAffected(card); repParams.put(AbilityKey.CardLKI, card); @@ -1956,7 +1956,7 @@ public class GameAction { // Where there are none, it should bring up speed controls game.fireEvent(new GameEventGameStarted(gameType, first, game.getPlayers())); - runPreOpeningHandActions(first); + runPreOpeningHandActions(first); game.setAge(GameStage.Mulligan); for (final Player p1 : game.getPlayers()) { @@ -1997,7 +1997,7 @@ public class GameAction { p.getController().autoPassCancel(); } - first = game.getPhaseHandler().getPlayerTurn(); // needed only for restart + first = game.getPhaseHandler().getPlayerTurn(); // needed only for restart } while (game.getAge() == GameStage.RestartedByKarn); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index dc6f8f64b63..10e67f4e9fa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -167,8 +167,7 @@ public class PlayEffect extends SpellAbilityEffect { // so it gets added to stack card.setCopiedPermanent(card); card.setToken(true); - tgtCards = new CardCollection(); - tgtCards.add(card); + tgtCards = new CardCollection(card); } else { tgtCards = new CardCollection(); // filter only cards that didn't changed zones @@ -217,7 +216,6 @@ public class PlayEffect extends SpellAbilityEffect { boolean singleOption = tgtCards.size() == 1 && amount == 1 && optional; Map params = hasTotalCMCLimit ? new HashMap<>() : null; - Map moveParams = AbilityKey.newMap(); moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); @@ -425,7 +423,6 @@ public class PlayEffect extends SpellAbilityEffect { } } // end resolve - protected void addReplaceGraveyardEffect(Card c, SpellAbility sa, String zone, Map moveParams) { final Card hostCard = sa.getHostCard(); final Game game = hostCard.getGame(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index bcc9eb2f059..54d4cfdd914 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -103,8 +103,8 @@ public class RestartGameEffect extends SpellAbilityEffect { game.resetTurnOrder(); game.setAge(GameStage.RestartedByKarn); - // Do not need this because ability will resolve only during that player's turn - //game.getPhaseHandler().setPlayerTurn(sa.getActivatingPlayer()); + // For the rare case that you get to resolve it during another players turn + game.getPhaseHandler().setPlayerTurn(sa.getActivatingPlayer()); // Set turn number? diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index cde7c7d0bcd..3fd70bba0db 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -134,7 +134,7 @@ public class PhaseHandler implements java.io.Serializable { public final Player getPlayerTurn() { return playerTurn; } - private final void setPlayerTurn(final Player playerTurn0) { + public final void setPlayerTurn(final Player playerTurn0) { if (playerTurn == playerTurn0) { return; } playerTurn = playerTurn0; game.updatePlayerTurnForView();