diff --git a/Mage.Sets/src/mage/cards/k/KarnLiberated.java b/Mage.Sets/src/mage/cards/k/KarnLiberated.java index 6d7c6867f39..e0a35d5bd66 100644 --- a/Mage.Sets/src/mage/cards/k/KarnLiberated.java +++ b/Mage.Sets/src/mage/cards/k/KarnLiberated.java @@ -157,6 +157,7 @@ class KarnLiberatedEffect extends OneShotEffect { } } game.addDelayedTriggeredAbility(new KarnLiberatedDelayedTriggeredAbility(exileId), source); + game.setStartingPlayerId(source.getControllerId()); game.start(null); return true; } diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 87040399b57..9ac4302df8e 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -442,6 +442,8 @@ public interface Game extends MageItem, Serializable { UUID getStartingPlayerId(); + void setStartingPlayerId(UUID startingPlayerId); + void saveRollBackGameState(); boolean canRollbackTurns(int turnsToRollback); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 41d2996498a..7f4f936bba3 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -27,6 +27,10 @@ */ package mage.game; +import java.io.IOException; +import java.io.Serializable; +import java.util.*; +import java.util.Map.Entry; import mage.MageException; import mage.MageObject; import mage.abilities.*; @@ -92,11 +96,6 @@ import mage.watchers.Watchers; import mage.watchers.common.*; import org.apache.log4j.Logger; -import java.io.IOException; -import java.io.Serializable; -import java.util.*; -import java.util.Map.Entry; - public abstract class GameImpl implements Game, Serializable { private static final int ROLLBACK_TURNS_MAX = 4; @@ -855,31 +854,33 @@ public abstract class GameImpl implements Game, Serializable { } //20091005 - 103.2 - TargetPlayer targetPlayer = new TargetPlayer(); - targetPlayer.setTargetName("starting player"); Player choosingPlayer = null; - if (choosingPlayerId != null) { - choosingPlayer = this.getPlayer(choosingPlayerId); - if (choosingPlayer != null && !choosingPlayer.isInGame()) { - choosingPlayer = null; + if (startingPlayerId == null) { + TargetPlayer targetPlayer = new TargetPlayer(); + targetPlayer.setTargetName("starting player"); + if (choosingPlayerId != null) { + choosingPlayer = this.getPlayer(choosingPlayerId); + if (choosingPlayer != null && !choosingPlayer.isInGame()) { + choosingPlayer = null; + } } - } - if (choosingPlayer == null) { - choosingPlayerId = pickChoosingPlayer(); - if (choosingPlayerId == null) { + if (choosingPlayer == null) { + choosingPlayerId = pickChoosingPlayer(); + if (choosingPlayerId == null) { + return; + } + choosingPlayer = getPlayer(choosingPlayerId); + } + if (choosingPlayer == null) { + return; + } + getState().setChoosingPlayerId(choosingPlayerId); // needed to start/stop the timer if active + if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { + startingPlayerId = targetPlayer.getTargets().get(0); + } else if (getState().getPlayers().size() < 3) { + // not possible to choose starting player, choosing player has probably conceded, so stop here return; } - choosingPlayer = getPlayer(choosingPlayerId); - } - if (choosingPlayer == null) { - return; - } - getState().setChoosingPlayerId(choosingPlayerId); // needed to start/stop the timer if active - if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { - startingPlayerId = targetPlayer.getTargets().get(0); - } else if (getState().getPlayers().size() < 3) { - // not possible to choose starting player, choosing player has probably conceded, so stop here - return; } if (startingPlayerId == null) { // choose any available player as starting player @@ -898,15 +899,7 @@ public abstract class GameImpl implements Game, Serializable { logger.debug("Starting player not found. playerId:" + startingPlayerId); return; } - StringBuilder message = new StringBuilder(choosingPlayer.getLogName()).append(" chooses that "); - if (choosingPlayer.getId().equals(startingPlayerId)) { - message.append("he or she"); - } else { - message.append(startingPlayer.getLogName()); - } - message.append(" takes the first turn"); - - this.informPlayers(message.toString()); + sendStartMessage(choosingPlayer, startingPlayer); //20091005 - 103.3 int startingHandSize = 7; @@ -1019,6 +1012,21 @@ public abstract class GameImpl implements Game, Serializable { } + protected void sendStartMessage(Player choosingPlayer, Player startingPlayer) { + StringBuilder message = new StringBuilder(); + if (choosingPlayer != null) { + message.append(choosingPlayer.getLogName()).append(" chooses that "); + } + if (choosingPlayer != null && choosingPlayer.getId().equals(startingPlayer.getId())) { + message.append("he or she"); + } else { + message.append(startingPlayer.getLogName()); + } + message.append(" takes the first turn"); + + this.informPlayers(message.toString()); + } + protected UUID findWinnersAndLosers() { UUID winnerIdFound = null; for (Player player : state.getPlayers().values()) { @@ -2834,6 +2842,11 @@ public abstract class GameImpl implements Game, Serializable { return startingPlayerId; } + @Override + public void setStartingPlayerId(UUID startingPlayerId) { + this.startingPlayerId = startingPlayerId; + } + @Override public int getLife() { return startLife;