diff --git a/forge-game/src/main/java/forge/game/Direction.java b/forge-game/src/main/java/forge/game/Direction.java index 1e08482a107..a9d143c870f 100644 --- a/forge-game/src/main/java/forge/game/Direction.java +++ b/forge-game/src/main/java/forge/game/Direction.java @@ -40,12 +40,17 @@ public enum Direction { /** @return Immutable list of all directions (in order, Left and Right). */ public static List getListOfDirections() { return listOfDirections; } + /** @return True if and only if this is the default direction. */ + public boolean isDefaultDirection() { + return this.equals(getDefaultDirection()); + } + /** * Get the index by which the turn order is shifted, given this Direction. * @return 1 or -1. */ public int getShift() { - if (this.equals(getDefaultDirection())) { + if (this.isDefaultDirection()) { return 1; } return -1; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index ea5bf615bdb..1afe12ec748 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -31,6 +31,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.eventbus.EventBus; @@ -66,6 +67,7 @@ import forge.util.Aggregates; public class Game { private final GameRules rules; private final List roIngamePlayers; + private final List roIngamePlayersReversed; private final List allPlayers; private final List ingamePlayers = new ArrayList(); @@ -104,6 +106,7 @@ public class Game { List players = new ArrayList(); allPlayers = Collections.unmodifiableList(players); roIngamePlayers = Collections.unmodifiableList(ingamePlayers); + roIngamePlayersReversed = Lists.reverse(roIngamePlayers); // reverse of unmodifiable list is also unmodifiable int highestTeam = -1; for (RegisteredPlayer psc : players0) { @@ -147,14 +150,27 @@ public class Game { } + /** + * Gets the players who are still fighting to win, in turn order. + * + * @return the players + */ + public final List getPlayersInTurnOrder() { + if (this.turnOrder.isDefaultDirection()) { + return this.roIngamePlayers; + } + return this.roIngamePlayersReversed; + } + /** * Gets the players who are still fighting to win. * * @return the players */ public final List getPlayers() { - return roIngamePlayers; + return roIngamePlayers; } + /** * Gets the players who participated in match (regardless of outcome). * Use this in UI and after match calculations @@ -303,6 +319,10 @@ public class Game { this.turnOrder = this.turnOrder.getOtherDirection(); } + public final void resetTurnOrder() { + this.turnOrder = Direction.getDefaultDirection(); + } + /** * Create and return the next timestamp. * @@ -350,7 +370,7 @@ public class Game { p.setMindSlaveMaster(null); // for correct totals } - for (Player p : roIngamePlayers) { + for (Player p : getPlayers()) { p.onGameOver(); } @@ -502,9 +522,11 @@ public class Game { } /** - * TODO: Write javadoc for this method. - * @param playerTurn - * @return + * Get the player whose turn it is after a given player's turn, taking turn + * order into account. + * @param playerTurn a {@link Player}, or {@code null}. + * @return A {@link Player}, whose turn comes after the current player, or + * {@code null} if there are no players in the game. */ public Player getNextPlayerAfter(final Player playerTurn) { int iPlayer = roIngamePlayers.indexOf(playerTurn); diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index b57695e7c77..8ed54d83122 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -205,9 +205,10 @@ public class Match { boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty(); boolean canSideBoard = !isFirstGame && rules.getGameType().isSideboardingAllowed(); + final List players = game.getPlayers(); final List playersConditions = game.getMatch().getPlayers(); for (int i = 0; i < playersConditions.size(); i++) { - Player player = game.getPlayers().get(i); + final Player player = players.get(i); final RegisteredPlayer psc = playersConditions.get(i); player.initVariantsZones(psc); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index fdd6e1483a3..0493d50609f 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -422,7 +422,7 @@ public class AbilityUtils { } else if (hType.startsWith("Property")) { String defined = hType.split("Property")[1]; - for (Player p : game.getPlayers()) { + for (Player p : game.getPlayersInTurnOrder()) { if (p.hasProperty(defined, ability.getActivatingPlayer(), ability.getHostCard())) { players.add(p); } @@ -1011,7 +1011,7 @@ public class AbilityUtils { } } else if (defined.startsWith("Non")) { - players.addAll(game.getPlayers()); + players.addAll(game.getPlayersInTurnOrder()); players.removeAll(getDefinedPlayers(card, defined.substring(3), sa)); } else if (defined.equals("EnchantedController")) { @@ -1065,7 +1065,7 @@ public class AbilityUtils { players.add(card.getOwner()); } else if (defined.startsWith("PlayerNamed_")) { - for (Player p : game.getPlayers()) { + for (Player p : game.getPlayersInTurnOrder()) { System.out.println("Named player " + defined.substring(12)); if (p.getName().equals(defined.substring(12))) { players.add(p); @@ -1073,7 +1073,7 @@ public class AbilityUtils { } } else if (defined.startsWith("Flipped")) { - for (Player p : game.getPlayers()) { + for (Player p : game.getPlayersInTurnOrder()) { if (null != sa.getHostCard().getFlipResult(p)) { if (sa.getHostCard().getFlipResult(p).equals(defined.substring(7))) { players.add(p); @@ -1088,13 +1088,13 @@ public class AbilityUtils { players.add(sa.getActivatingPlayer()); } else if (defined.equals("Each")) { - players.addAll(game.getPlayers()); + players.addAll(game.getPlayersInTurnOrder()); } else if (defined.equals("Opponent")) { players.add(sa.getActivatingPlayer().getOpponent()); } else { - for (Player p : game.getPlayers()) { + for (Player p : game.getPlayersInTurnOrder()) { if (p.isValid(defined, sa.getActivatingPlayer(), sa.getHostCard())) { players.add(p); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java index 6841f84e947..c9052c9b920 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java @@ -30,7 +30,7 @@ public class BalanceEffect extends SpellAbilityEffect { int min = Integer.MAX_VALUE; - final List players = game.getPlayers(); + final List players = game.getPlayersInTurnOrder(); final List> validCards = new ArrayList>(players.size()); for(int i = 0; i < players.size(); i++) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index 0857a7382ac..701ea344042 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -47,13 +47,14 @@ public class BidLifeEffect extends SpellAbilityEffect { bidPlayers.add(activator); bidPlayers.addAll(AbilityUtils.getDefinedPlayers(host, sa.getParam("OtherBidder"), sa)); } else{ - bidPlayers.addAll(activator.getGame().getPlayers()); + bidPlayers.addAll(activator.getGame().getPlayersInTurnOrder()); int pSize = bidPlayers.size(); // start with the activator while (bidPlayers.contains(activator) && !activator.equals(Iterables.getFirst(bidPlayers, null))) { bidPlayers.add(pSize - 1, bidPlayers.remove(0)); } } + boolean willBid = true; Player winner = activator; int bid = startBidding; @@ -66,6 +67,7 @@ public class BidLifeEffect extends SpellAbilityEffect { if (result) { // a different choose number bid += p.getController().chooseNumber(sa, "Bid life:", 1, 9); winner = p; + host.getGame().getAction().nofityOfValue(sa, p, "topped bid with " + bid + " life", p); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java index e839d5f62a3..8ada57d0458 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java @@ -33,7 +33,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); final List choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers( - sa.getHostCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayers(); + sa.getHostCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayersInTurnOrder(); final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a player"; final boolean random = sa.hasParam("Random"); 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 a3ce78dedf2..056ea925b62 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 @@ -82,6 +82,7 @@ public class RestartGameEffect extends SpellAbilityEffect { trigHandler.clearSuppression(TriggerType.ChangesZone); + 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()); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index c0f1a2ac4d2..c56e9b1b8c8 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -584,7 +584,7 @@ public class StaticAbilityContinuous { final String[] strngs = params.get("Affected").split(","); - for (Player p : controller.getGame().getPlayers()) { + for (Player p : controller.getGame().getPlayersInTurnOrder()) { if (p.isValid(strngs, controller, hostCard)) { players.add(p); }