diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 6daec489222..050193da109 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -82,6 +82,8 @@ public abstract class GameState { private String precastHuman = null; private String precastAI = null; + private int turn; + // Targeting for precast spells in a game state (mostly used by Puzzle Mode game states) private final int TARGET_NONE = -1; // untargeted spell (e.g. Joraga Invocation) private final int TARGET_HUMAN = -2; @@ -110,6 +112,7 @@ public abstract class GameState { sb.append(TextUtil.concatNoSpace("humanlife=", String.valueOf(humanLife), "\n")); sb.append(TextUtil.concatNoSpace("ailife=", String.valueOf(computerLife), "\n")); + sb.append(TextUtil.concatNoSpace("turn=", String.valueOf(turn), "\n")); if (!humanCounters.isEmpty()) { sb.append(TextUtil.concatNoSpace("humancounters=", humanCounters, "\n")); @@ -149,6 +152,7 @@ public abstract class GameState { tChangePlayer = game.getPhaseHandler().getPlayerTurn() == ai ? "ai" : "human"; tChangePhase = game.getPhaseHandler().getPhase().toString(); + turn = game.getPhaseHandler().getTurn(); aiCardTexts.clear(); humanCardTexts.clear(); @@ -392,6 +396,11 @@ public abstract class GameState { boolean isHuman = categoryName.startsWith("human"); + if (categoryName.equals("turn")) { + turn = Integer.parseInt(categoryValue); + } else { + turn = 1; + } if (categoryName.endsWith("life")) { if (isHuman) humanLife = Integer.parseInt(categoryValue); @@ -499,7 +508,7 @@ public abstract class GameState { applyCountersToGameEntity(ai, computerCounters); } - game.getPhaseHandler().devModeSet(newPhase, newPlayerTurn); + game.getPhaseHandler().devModeSet(newPhase, newPlayerTurn, turn); game.getTriggerHandler().setSuppressAllTriggers(true); @@ -530,7 +539,7 @@ public abstract class GameState { private void handleCombat(final Game game, final Player attackingPlayer, final Player defendingPlayer, final boolean toDeclareBlockers) { // First we need to ensure that all attackers are declared in the Declare Attackers step, // even if proceeding straight to Declare Blockers - game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, attackingPlayer); + game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, attackingPlayer, turn); if (game.getPhaseHandler().getCombat() == null) { game.getPhaseHandler().setCombat(new Combat(attackingPlayer)); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 636a509c35f..33c614de03b 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -97,7 +97,7 @@ public class GameCopier { PhaseHandler origPhaseHandler = origGame.getPhaseHandler(); Player newPlayerTurn = playerMap.get(origPhaseHandler.getPlayerTurn()); - newGame.getPhaseHandler().devModeSet(origPhaseHandler.getPhase(), newPlayerTurn); + newGame.getPhaseHandler().devModeSet(origPhaseHandler.getPhase(), newPlayerTurn, origPhaseHandler.getTurn()); newGame.getTriggerHandler().suppressMode(TriggerType.ChangesZone); for (Player p : newGame.getPlayers()) { ((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false); 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 7445e060fef..a3e13765a6b 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -1054,13 +1054,14 @@ public class PhaseHandler implements java.io.Serializable { // this is a hack for the setup game state mode, do not use outside of devSetupGameState code // as it avoids calling any of the phase effects that may be necessary in a less enforced context - public final void devModeSet(final PhaseType phase0, final Player player0, boolean endCombat) { + public final void devModeSet(final PhaseType phase0, final Player player0, boolean endCombat, int cturn) { if (phase0 != null) { setPhase(phase0); } if (player0 != null) { setPlayerTurn(player0); } + turn = cturn; game.fireEvent(new GameEventTurnPhase(playerTurn, phase, "")); if (endCombat) { @@ -1068,9 +1069,18 @@ public class PhaseHandler implements java.io.Serializable { } } public final void devModeSet(final PhaseType phase0, final Player player0) { - devModeSet(phase0, player0, true); + devModeSet(phase0, player0, true, 1); } + public final void devModeSet(final PhaseType phase0, final Player player0, int cturn) { + devModeSet(phase0, player0, true, cturn); + } + + public final void devModeSet(final PhaseType phase0, final Player player0, boolean endCombat) { + devModeSet(phase0, player0, endCombat, 0); + } + + public final void endTurnByEffect() { endCombat(); extraPhases.clear();