mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
Fix: Have certain effects happen in turn order.
Also reset the turn order when restarting the game.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user