From 375699a3799b9cfbe705e3109af5d5919bc3c35c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 21 Nov 2016 22:41:00 +0100 Subject: [PATCH] * Changed/fixed handling of controlling other player's turn to prevent unwanted turn/phase skipping. --- .../src/mage/player/human/HumanPlayer.java | 153 +++++++++--------- 1 file changed, 81 insertions(+), 72 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 4325ca696f2..f26b96a4b4c 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -584,98 +584,106 @@ public class HumanPlayer extends PlayerImpl { public boolean priority(Game game) { passed = false; if (!abort) { + HumanPlayer controllingPlayer = this; + if (isGameUnderControl()) { + Player player = game.getPlayer(getTurnControlledBy()); + if (player instanceof HumanPlayer) { + controllingPlayer = (HumanPlayer) player; + } + } if (getJustActivatedType() != null && !holdingPriority) { - if (userData.isPassPriorityCast() && getJustActivatedType().equals(AbilityType.SPELL)) { + if (controllingPlayer.getUserData().isPassPriorityCast() && getJustActivatedType().equals(AbilityType.SPELL)) { setJustActivatedType(null); pass(game); return false; } - if (userData.isPassPriorityActivation() && getJustActivatedType().equals(AbilityType.ACTIVATED)) { + if (controllingPlayer.getUserData().isPassPriorityActivation() && getJustActivatedType().equals(AbilityType.ACTIVATED)) { setJustActivatedType(null); pass(game); return false; } } - - if (passedAllTurns || passedTurnSkipStack) { - if (passWithManaPoolCheck(game)) { - return false; - } - } - if (passedUntilEndStepBeforeMyTurn) { - - if (!game.getTurn().getStepType().equals(PhaseStep.END_TURN)) { + if (isGameUnderControl()) { // Use the skip actions only if the player itself controls its turn + if (passedAllTurns || passedTurnSkipStack) { if (passWithManaPoolCheck(game)) { return false; } - } else { - PlayerList playerList = game.getState().getPlayerList(playerId); - if (!playerList.getPrevious().equals(game.getActivePlayerId())) { + } + if (passedUntilEndStepBeforeMyTurn) { + + if (!game.getTurn().getStepType().equals(PhaseStep.END_TURN)) { if (passWithManaPoolCheck(game)) { return false; } - } - } - } - if (game.getStack().isEmpty()) { - passedUntilStackResolved = false; - boolean dontCheckPassStep = false; - if (passedTurn || passedTurnSkipStack) { - if (passWithManaPoolCheck(game)) { - return false; - } - } - if (passedUntilNextMain) { - if (game.getTurn().getStepType().equals(PhaseStep.POSTCOMBAT_MAIN) || game.getTurn().getStepType().equals(PhaseStep.PRECOMBAT_MAIN)) { - // it's a main phase - if (!skippedAtLeastOnce || (!playerId.equals(game.getActivePlayerId()) && !this.getUserData().getUserSkipPrioritySteps().isStopOnAllMainPhases())) { - skippedAtLeastOnce = true; + } else { + PlayerList playerList = game.getState().getPlayerList(playerId); + if (!playerList.getPrevious().equals(game.getActivePlayerId())) { if (passWithManaPoolCheck(game)) { return false; } - } else { - dontCheckPassStep = true; - passedUntilNextMain = false; // reset skip action - } - } else { - skippedAtLeastOnce = true; - if (passWithManaPoolCheck(game)) { - return false; } } } - if (passedUntilEndOfTurn) { - if (game.getTurn().getStepType().equals(PhaseStep.END_TURN)) { - // It's end of turn phase - if (!skippedAtLeastOnce || (playerId.equals(game.getActivePlayerId()) && !this.getUserData().getUserSkipPrioritySteps().isStopOnAllEndPhases())) { - skippedAtLeastOnce = true; - if (passWithManaPoolCheck(game)) { - return false; - } - } else { - dontCheckPassStep = true; - passedUntilEndOfTurn = false; - } - } else { - skippedAtLeastOnce = true; - if (passWithManaPoolCheck(game)) { - return false; - } - } - } - if (!dontCheckPassStep && checkPassStep(game)) { - if (passWithManaPoolCheck(game)) { - return false; - } - } - } else if (passedUntilStackResolved) { - if (dateLastAddedToStack == game.getStack().getDateLastAdded()) { - dateLastAddedToStack = game.getStack().getDateLastAdded(); - if (passWithManaPoolCheck(game)) { - return false; - } - } else { + if (game.getStack().isEmpty()) { passedUntilStackResolved = false; + boolean dontCheckPassStep = false; + if (passedTurn || passedTurnSkipStack) { + if (passWithManaPoolCheck(game)) { + return false; + } + } + if (passedUntilNextMain) { + if (game.getTurn().getStepType().equals(PhaseStep.POSTCOMBAT_MAIN) || game.getTurn().getStepType().equals(PhaseStep.PRECOMBAT_MAIN)) { + // it's a main phase + if (!skippedAtLeastOnce || (!playerId.equals(game.getActivePlayerId()) && !this.getUserData().getUserSkipPrioritySteps().isStopOnAllMainPhases())) { + skippedAtLeastOnce = true; + if (passWithManaPoolCheck(game)) { + return false; + } + } else { + dontCheckPassStep = true; + passedUntilNextMain = false; // reset skip action + } + } else { + skippedAtLeastOnce = true; + if (passWithManaPoolCheck(game)) { + return false; + } + } + } + if (passedUntilEndOfTurn) { + if (game.getTurn().getStepType().equals(PhaseStep.END_TURN)) { + // It's end of turn phase + if (!skippedAtLeastOnce || (playerId.equals(game.getActivePlayerId()) && !this.getUserData().getUserSkipPrioritySteps().isStopOnAllEndPhases())) { + skippedAtLeastOnce = true; + if (passWithManaPoolCheck(game)) { + return false; + } + } else { + dontCheckPassStep = true; + passedUntilEndOfTurn = false; + } + } else { + skippedAtLeastOnce = true; + if (passWithManaPoolCheck(game)) { + return false; + } + } + } + if (!dontCheckPassStep && checkPassStep(game, controllingPlayer)) { + if (passWithManaPoolCheck(game)) { + return false; + } + } + } else if (passedUntilStackResolved) { + if (dateLastAddedToStack == game.getStack().getDateLastAdded()) { + dateLastAddedToStack = game.getStack().getDateLastAdded(); + if (passWithManaPoolCheck(game)) { + return false; + } + } else { + passedUntilStackResolved = false; + } } } while (canRespond()) { @@ -734,12 +742,13 @@ public class HumanPlayer extends PlayerImpl { return false; } - private boolean checkPassStep(Game game) { + private boolean checkPassStep(Game game, HumanPlayer controllingPlayer) { try { + if (playerId.equals(game.getActivePlayerId())) { - return !this.getUserData().getUserSkipPrioritySteps().getYourTurn().isPhaseStepSet(game.getStep().getType()); + return !controllingPlayer.getUserData().getUserSkipPrioritySteps().getYourTurn().isPhaseStepSet(game.getStep().getType()); } else { - return !this.getUserData().getUserSkipPrioritySteps().getOpponentTurn().isPhaseStepSet(game.getStep().getType()); + return !controllingPlayer.getUserData().getUserSkipPrioritySteps().getOpponentTurn().isPhaseStepSet(game.getStep().getType()); } } catch (NullPointerException ex) { logger.error("null pointer exception UserData = " + userData == null ? "null" : "not null");