Fix: Have certain effects happen in turn order.

Also reset the turn order when restarting the game.
This commit is contained in:
elcnesh
2014-06-05 11:05:48 +00:00
parent 0244fc4461
commit 8fbd507854
9 changed files with 48 additions and 17 deletions

View File

@@ -40,12 +40,17 @@ public enum Direction {
/** @return Immutable list of all directions (in order, Left and Right). */
public static List<Direction> 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;

View File

@@ -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<Player> roIngamePlayers;
private final List<Player> roIngamePlayersReversed;
private final List<Player> allPlayers;
private final List<Player> ingamePlayers = new ArrayList<Player>();
@@ -104,6 +106,7 @@ public class Game {
List<Player> players = new ArrayList<Player>();
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<Player> 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<Player> getPlayers() {
return roIngamePlayers;
return roIngamePlayers;
}
/**
* Gets the players who participated in match (regardless of outcome).
* <i>Use this in UI and after match calculations</i>
@@ -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);

View File

@@ -205,9 +205,10 @@ public class Match {
boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty();
boolean canSideBoard = !isFirstGame && rules.getGameType().isSideboardingAllowed();
final List<Player> players = game.getPlayers();
final List<RegisteredPlayer> 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);

View File

@@ -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);
}

View File

@@ -30,7 +30,7 @@ public class BalanceEffect extends SpellAbilityEffect {
int min = Integer.MAX_VALUE;
final List<Player> players = game.getPlayers();
final List<Player> players = game.getPlayersInTurnOrder();
final List<List<Card>> validCards = new ArrayList<List<Card>>(players.size());
for(int i = 0; i < players.size(); i++) {

View File

@@ -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);
}
}
}

View File

@@ -33,7 +33,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final List<Player> 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");

View File

@@ -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());

View File

@@ -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);
}