diff --git a/.gitattributes b/.gitattributes index 5c38cedcb67..be5997ee8c5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14200,7 +14200,6 @@ src/main/java/forge/game/GameState.java -text src/main/java/forge/game/GameType.java -text src/main/java/forge/game/GlobalRuleChange.java -text src/main/java/forge/game/MatchController.java -text -src/main/java/forge/game/MatchStartHelper.java -text src/main/java/forge/game/PlanarDice.java -text src/main/java/forge/game/PlayerStartConditions.java -text src/main/java/forge/game/ai/AiAttackController.java svneol=native#text/plain diff --git a/src/main/java/forge/card/ability/ai/CountersRemoveAi.java b/src/main/java/forge/card/ability/ai/CountersRemoveAi.java index dfc59555414..db6c086350d 100644 --- a/src/main/java/forge/card/ability/ai/CountersRemoveAi.java +++ b/src/main/java/forge/card/ability/ai/CountersRemoveAi.java @@ -1,7 +1,5 @@ package forge.card.ability.ai; -import java.util.Random; - import forge.Card; import forge.CounterType; import forge.card.ability.SpellAbilityAi; @@ -12,7 +10,6 @@ import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCost; import forge.game.phase.PhaseType; import forge.game.player.Player; -import forge.util.MyRandom; public class CountersRemoveAi extends SpellAbilityAi { @@ -21,7 +18,6 @@ public class CountersRemoveAi extends SpellAbilityAi { // AI needs to be expanded, since this function can be pretty complex // based on what // the expected targets could be - final Random r = MyRandom.getRandom(); final Cost abCost = sa.getPayCosts(); Target abTgt = sa.getTarget(); final Card source = sa.getSourceCard(); diff --git a/src/main/java/forge/control/Lobby.java b/src/main/java/forge/control/Lobby.java index f79a2fad669..0093d46010e 100644 --- a/src/main/java/forge/control/Lobby.java +++ b/src/main/java/forge/control/Lobby.java @@ -64,7 +64,7 @@ public class Lobby { private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human"); private final LobbyPlayerAi system = new LobbyPlayerAi("System"); - public final LobbyPlayerHuman getGuiPlayer() { + public final LobbyPlayer getGuiPlayer() { return guiPlayer; } diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 07ef6e909f1..f65fd4443e6 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1417,7 +1417,7 @@ public class GameAction { } } - void handleLeylinesAndChancellors() { + private void handleLeylinesAndChancellors() { for (Player p : game.getPlayers()) { final List openingHand = new ArrayList(p.getCardsIn(ZoneType.Hand)); @@ -1470,7 +1470,17 @@ public class GameAction { game.getAction().checkStateEffects(); } - public void performMulligans(final Player firstPlayer, final boolean isCommander) { + public void mulligan(final Player firstPlayer) { + performMulligans(firstPlayer, game.getType() == GameType.Commander); + handleLeylinesAndChancellors(); + // Run Trigger beginning of the game + final HashMap runParams = new HashMap(); + game.getTriggerHandler().runTrigger(TriggerType.NewGame, runParams, false); + game.setAge(GameAge.Play); + game.getInputQueue().clearInput(); + } + + private void performMulligans(final Player firstPlayer, final boolean isCommander) { List whoCanMulligan = Lists.newArrayList(game.getPlayers()); int offset = whoCanMulligan.indexOf(firstPlayer); diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 85969571013..945d5db9bf0 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -9,6 +9,8 @@ import java.util.Map.Entry; import java.util.Random; import java.util.Set; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; @@ -234,9 +236,10 @@ public class GameNew { boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty(); boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed(); - final Map playersConditions = game.getMatch().getPlayers(); - for (Player player : game.getPlayers()) { - final PlayerStartConditions psc = playersConditions.get(player.getLobbyPlayer()); + final List> playersConditions = game.getMatch().getPlayers(); + for (int i = 0; i < playersConditions.size(); i++) { + Player player = game.getPlayers().get(i); + final PlayerStartConditions psc = playersConditions.get(i).getRight(); putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player)); initVariantsZones(player, psc); @@ -329,18 +332,11 @@ public class GameNew { } // ultimate of Karn the Liberated - public static void restartGame( final GameState game, final Player startingTurn, Map> playerLibraries) { - final Map players = game.getMatch().getPlayers(); - Map playersConditions = new HashMap(); - - for (Player p : game.getPlayers()) { - playersConditions.put(p, players.get(p.getLobbyPlayer())); - } - + public static void restartGame(final GameState game, final Player startingTurn, Map> playerLibraries) { + game.setAge(GameAge.Mulligan); - // TODO: Apply new mulligan code here - game.getInputQueue().clearInput(); - + game.getAction().mulligan(startingTurn); + //Card.resetUniqueNumber(); // need this code here, otherwise observables fail forge.card.trigger.Trigger.resetIDs(); @@ -348,16 +344,21 @@ public class GameNew { trigHandler.clearDelayedTrigger(); trigHandler.cleanUpTemporaryTriggers(); trigHandler.suppressMode(TriggerType.ChangesZone); - + game.getStack().reset(); GameAction action = game.getAction(); - - for (Entry p : playersConditions.entrySet()) { - final Player player = p.getKey(); - player.setStartingLife(p.getValue().getStartingLife()); + List gamePlayers = game.getRegisteredPlayers(); + for( int i = 0; i < gamePlayers.size(); i++ ) { + + final Player player = gamePlayers.get(i); + if( player.hasLost()) continue; + + PlayerStartConditions psc = game.getMatch().getPlayers().get(i).getValue(); + + player.setStartingLife(psc.getStartingLife()); player.setNumLandsPlayed(0); - putCardsOnBattlefield(player, p.getValue().getCardsOnBattlefield(player)); + putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player)); PlayerZone library = player.getZone(ZoneType.Library); List newLibrary = playerLibraries.get(player); diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 67959aa9052..4b13881872d 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.eventbus.EventBus; import forge.Card; @@ -95,11 +97,11 @@ public class GameState { * @param match0 * @param input */ - public GameState(Map players2, GameType t, MatchController match0) { /* no more zones to map here */ + public GameState(List> players0, GameType t, MatchController match0) { /* no more zones to map here */ type = t; match = match0; List players = new ArrayList(); - for (Entry kv : players2.entrySet()) { + for (Entry kv : players0) { Player pl = kv.getKey().getPlayer(this); players.add(pl); ingamePlayers.add(pl); @@ -108,7 +110,7 @@ public class GameState { pl.setStartingLife(psc.getStartingLife()); pl.setMaxHandSize(psc.getStartingHand()); pl.setStartingHandSize(psc.getStartingHand()); - pl.setAllies(psc.getAllies()); + pl.setTeam(psc.getTeamNumber()); } allPlayers = Collections.unmodifiableList(players); diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 1c0c7d1c3f2..b7d3be0aa6d 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -2,22 +2,21 @@ package forge.game; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.collect.Lists; + import forge.Constant.Preferences; import forge.FThreads; import forge.Singletons; -import forge.card.trigger.TriggerType; import forge.control.FControl; -import forge.deck.Deck; import forge.error.BugReporter; import forge.game.event.DuelOutcomeEvent; import forge.game.event.FlipCoinEvent; import forge.game.player.LobbyPlayer; -import forge.game.player.LobbyPlayerHuman; import forge.game.player.Player; import forge.game.player.PlayerStatistics; import forge.gui.framework.EDocID; @@ -42,7 +41,7 @@ import forge.util.MyRandom; public class MatchController { - private final Map players = new HashMap(); + private final List> players; private final GameType gameType; private int gamesPerMatch = 3; @@ -58,14 +57,14 @@ public class MatchController { /** * This should become constructor once. */ - public MatchController(GameType type, Map map) { + public MatchController(GameType type, List> players0) { gamesPlayedRo = Collections.unmodifiableList(gamesPlayed); - players.putAll(map); + players = Collections.unmodifiableList(Lists.newArrayList(players0)); gameType = type; } - public MatchController(GameType type, Map map, Boolean forceAnte) { - this(type, map); + public MatchController(GameType type, List> players0, Boolean forceAnte) { + this(type, players0); if( forceAnte != null ) this.useAnte = forceAnte.booleanValue(); } @@ -109,7 +108,7 @@ public class MatchController { game.getGameLog().add("Final", result.getWinner() + " won", 0); // add result entries to the game log - final LobbyPlayerHuman human = Singletons.getControl().getLobby().getGuiPlayer(); + final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer(); final List outcomes = new ArrayList(); @@ -171,18 +170,12 @@ public class MatchController { FThreads.invokeInNewThread( new Runnable() { @Override public void run() { - currentGame.getAction().performMulligans(firstPlayer, currentGame.getType() == GameType.Commander); - currentGame.getAction().handleLeylinesAndChancellors(); - // Run Trigger beginning of the game - final HashMap runParams = new HashMap(); - currentGame.getTriggerHandler().runTrigger(TriggerType.NewGame, runParams, false); - currentGame.setAge(GameAge.Play); - currentGame.getInputQueue().clearInput(); + currentGame.getAction().mulligan(firstPlayer); } }); } - public static void attachUiToMatch(MatchController match, LobbyPlayerHuman humanLobbyPlayer) { + public static void attachUiToMatch(MatchController match, LobbyPlayer humanLobbyPlayer) { FControl.SINGLETON_INSTANCE.setMatch(match); GameState currentGame = match.getCurrentGame(); @@ -272,8 +265,8 @@ public class MatchController { for (GameOutcome go : gamesPlayed) { LobbyPlayer winner = go.getWinner(); int i = 0; - for (LobbyPlayer p : players.keySet()) { - if (p.equals(winner)) { + for (Pair p : players) { + if (p.getLeft().equals(winner)) { victories[i]++; break; // can't have 2 winners per game } @@ -315,24 +308,7 @@ public class MatchController { return getGamesWonBy(questPlayer) >= gamesToWinMatch; } - /** - * TODO: Write javadoc for this method. - * - * @param lobbyPlayer - * @return - */ - public Deck getPlayersDeck(LobbyPlayer lobbyPlayer) { - PlayerStartConditions cond = players.get(lobbyPlayer); - return cond == null ? null : cond.getCurrentDeck(); - } - - public Deck getPlayersOriginalDeck(LobbyPlayer lobbyPlayer) { - PlayerStartConditions cond = players.get(lobbyPlayer); - return cond == null ? null : cond.getOriginalDeck(); - } - - - public Map getPlayers() { + public List> getPlayers() { return players; } diff --git a/src/main/java/forge/game/MatchStartHelper.java b/src/main/java/forge/game/MatchStartHelper.java deleted file mode 100644 index 8aabe4c1a46..00000000000 --- a/src/main/java/forge/game/MatchStartHelper.java +++ /dev/null @@ -1,72 +0,0 @@ -package forge.game; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import forge.deck.Deck; -import forge.deck.DeckSection; -import forge.game.player.LobbyPlayer; -import forge.item.CardPrinted; - -/** - * TODO: Write javadoc for this type. - * - */ -public class MatchStartHelper { - private final Map players = new HashMap(); - - public void addPlayer(final LobbyPlayer player, final PlayerStartConditions c) { - players.put(player, c); - } - - public void addPlayer(final LobbyPlayer player, final Deck deck) { - PlayerStartConditions start = new PlayerStartConditions(deck); - players.put(player, start); - } - - public void addVanguardPlayer(final LobbyPlayer player, final Deck deck, final CardPrinted avatar) { - - PlayerStartConditions start = new PlayerStartConditions(deck); - start.setStartingLife(start.getStartingLife() + avatar.getRules().getLife()); - start.setStartingHand(start.getStartingHand() + avatar.getRules().getHand()); - start.setCardsInCommand(Arrays.asList(avatar)); - - players.put(player, start); - } - - public void addCommanderPlayer(final LobbyPlayer player, final Deck deck) - { - PlayerStartConditions start = new PlayerStartConditions(deck); - start.setStartingLife(40); - start.setCardsInCommand(deck.get(DeckSection.Commander).toFlatList()); - - players.put(player, start); - } - - public void addArchenemy(final LobbyPlayer player, final Deck deck, final Iterable schemes) { - PlayerStartConditions start = new PlayerStartConditions(deck); - start.setSchemes(schemes); - players.put(player, start); - } - - public void addPlanechasePlayer(final LobbyPlayer player, final Deck deck, final Iterable planes) { - PlayerStartConditions start = new PlayerStartConditions(deck); - start.setPlanes(planes); - players.put(player, start); - } - - public Map getPlayerMap() { - - return players; - } - - public void setAllies(final LobbyPlayer p1, final LobbyPlayer p2) { - PlayerStartConditions psc1 = players.get(p1); - PlayerStartConditions psc2 = players.get(p2); - - psc1.addAlly(p2); - psc2.addAlly(p1); - } - -} diff --git a/src/main/java/forge/game/PlayerStartConditions.java b/src/main/java/forge/game/PlayerStartConditions.java index d8d622d43ec..5e65c447c89 100644 --- a/src/main/java/forge/game/PlayerStartConditions.java +++ b/src/main/java/forge/game/PlayerStartConditions.java @@ -5,7 +5,7 @@ import java.util.Collections; import java.util.List; import forge.deck.Deck; -import forge.game.player.LobbyPlayer; +import forge.deck.DeckSection; import forge.game.player.Player; import forge.item.CardPrinted; import forge.item.IPaperCard; @@ -19,10 +19,10 @@ public class PlayerStartConditions { private int startingLife = 20; private int startingHand = 7; private Iterable cardsOnBattlefield = null; - private Iterable cardsInCommand = null; + private final List cardsInCommand = new ArrayList(); private Iterable schemes = null; private Iterable planes = null; - private List allies = new ArrayList(); + private int teamNumber = -1; // members of teams with negative id will play FFA. public PlayerStartConditions(Deck deck0) { originalDeck = deck0; @@ -41,10 +41,6 @@ public class PlayerStartConditions { this.currentDeck = currentDeck0; } - public Iterable getAllies() { - return allies; - } - public final int getStartingLife() { return startingLife; } @@ -84,13 +80,13 @@ public class PlayerStartConditions { /** * @param function the cardsInCommand to set */ - public void setCardsInCommand(Iterable function) { - this.cardsInCommand = function; + public void addCardsInCommand(Iterable function) { + for(IPaperCard pc : function) + this.cardsInCommand.add(pc); } - public void addAlly(LobbyPlayer ally) { - if(!allies.contains(ally)) - allies.add(ally); + public void addCardsInCommand(IPaperCard pc) { + this.cardsInCommand.add(pc); } /** @@ -128,5 +124,44 @@ public class PlayerStartConditions { this.planes = planes0; } + public int getTeamNumber() { + return teamNumber; + } + + public void setTeamNumber(int teamNumber0) { + this.teamNumber = teamNumber0; + } + + + public static PlayerStartConditions fromDeck(final Deck deck) { + PlayerStartConditions start = new PlayerStartConditions(deck); + if( deck.has(DeckSection.Commander)) { + start.setStartingLife(40); + start.addCardsInCommand(deck.get(DeckSection.Commander).toFlatList()); + } + return new PlayerStartConditions(deck); + } + + public static PlayerStartConditions forVanguard(final Deck deck, final CardPrinted avatar) { + PlayerStartConditions start = fromDeck(deck); + start.setStartingLife(start.getStartingLife() + avatar.getRules().getLife()); + start.setStartingHand(start.getStartingHand() + avatar.getRules().getHand()); + start.addCardsInCommand(avatar); + return start; + } + + + public static PlayerStartConditions forArchenemy(final Deck deck, final Iterable schemes) { + PlayerStartConditions start = fromDeck(deck); + start.setSchemes(schemes); + return start; + } + + public static PlayerStartConditions forPlanechase(final Deck deck, final Iterable planes) { + PlayerStartConditions start = fromDeck(deck); + start.setPlanes(planes); + return start; + } + } diff --git a/src/main/java/forge/game/limited/GauntletMini.java b/src/main/java/forge/game/limited/GauntletMini.java index 8888724e4c0..4f1ac7cd063 100644 --- a/src/main/java/forge/game/limited/GauntletMini.java +++ b/src/main/java/forge/game/limited/GauntletMini.java @@ -22,14 +22,16 @@ import java.util.List; import javax.swing.SwingUtilities; +import org.apache.commons.lang3.tuple.Pair; + import forge.FThreads; import forge.Singletons; import forge.control.Lobby; import forge.deck.Deck; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; +import forge.game.player.LobbyPlayer; import forge.gui.SOverlayUtils; /** @@ -162,12 +164,12 @@ public class GauntletMini { } }); - final MatchStartHelper starter = new MatchStartHelper(); + + List> starter = new ArrayList>(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.getGuiPlayer(), humanDeck); - starter.addPlayer(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1)); - - final MatchController mc = new MatchController(gauntletType, starter.getPlayerMap()); + starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(humanDeck))); + starter.add(Pair.of(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1))); + final MatchController mc = new MatchController(gauntletType, starter); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index b27bafe1e2a..7b893a61cdd 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -602,7 +602,7 @@ public class Upkeep extends Phase { *

* upkeepSuspend. *

- */ + */ /* private static void upkeepSuspend(final GameState game) { final Player player = game.getPhaseHandler().getPlayerTurn(); @@ -626,7 +626,7 @@ public class Upkeep extends Phase { } } } // suspend - +*/ /** *

* upkeepVanishing. diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 1ea00ce0199..52328cb84e7 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -162,7 +162,7 @@ public class Player extends GameEntity implements Comparable { private PlayerStatistics stats = new PlayerStatistics(); protected PlayerController controller; private final LobbyPlayer lobbyPlayer; - private final List allies = new ArrayList(); + private int teamNumber = -1; private Card activeScheme = null; @@ -210,11 +210,14 @@ public class Player extends GameEntity implements Comparable { return stats; } - public final void setAllies(Iterable allys) { - for(LobbyPlayer a : allys) { - allies.add(a); - } + public final void setTeam(int iTeam) { + teamNumber = iTeam; } + public final int getTeam() { + return teamNumber; + } + + @Deprecated public boolean isHuman() { return getType() == PlayerType.HUMAN; } @@ -268,8 +271,8 @@ public class Player extends GameEntity implements Comparable { */ public final Player getOpponent() { for (Player p : game.getPlayers()) { - if (p == this || allies.contains(p.getLobbyPlayer())) { continue; } - return p; + if (p.isOpponentOf(this)) + return p; } throw new IllegalStateException("No opponents left ingame for " + this); } @@ -283,8 +286,8 @@ public class Player extends GameEntity implements Comparable { public final List getOpponents() { List result = new ArrayList(); for (Player p : game.getPlayers()) { - if (p == this || allies.contains(p.getLobbyPlayer())) { continue; } - result.add(p); + if (p.isOpponentOf(this)) + result.add(p); } return result; } @@ -297,7 +300,7 @@ public class Player extends GameEntity implements Comparable { public final List getAllies() { List result = new ArrayList(); for (Player p : game.getPlayers()) { - if( allies.contains(p.getLobbyPlayer())) + if (!p.isOpponentOf(this)) result.add(p); } return result; @@ -320,15 +323,21 @@ public class Player extends GameEntity implements Comparable { * @return */ public final Player getWeakestOpponent() { - Player weakest = this.getOpponents().get(0); - for (int i = 1; i < this.getOpponents().size(); i++) { - if (weakest.getLife() > this.getOpponents().get(i).getLife()) { - weakest = this.getOpponents().get(i); + List opponnets = this.getOpponents(); + Player weakest = opponnets.get(0); + for (int i = 1; i < opponnets.size(); i++) { + if (weakest.getLife() > opponnets.get(i).getLife()) { + weakest = opponnets.get(i); } } return weakest; } + public boolean isOpponentOf(Player other) { + return other != this && ( other.teamNumber < 0 || other.teamNumber != this.teamNumber ); + } + + // //////////////////////// @@ -2167,13 +2176,10 @@ public class Player extends GameEntity implements Comparable { return false; } - /** - *

- * hasWon. - *

- * - * @return a boolean. - */ + public final boolean hasLost() { + return this.getOutcome() != null && this.getOutcome().lossState != null; + } + public final boolean hasWon() { if (this.cantWin()) { return false; @@ -2904,16 +2910,6 @@ public class Player extends GameEntity implements Comparable { return false; } - /** - * TODO: Write javadoc for this method. - * @param playerTurn - * @return - */ - public boolean isOpponentOf(Player other) { - return other != this && !allies.contains(other.getLobbyPlayer()); - } - - public int getStartingHandSize() { return this.startingHandSize; diff --git a/src/main/java/forge/game/player/PlayerOutcome.java b/src/main/java/forge/game/player/PlayerOutcome.java index 8ed0c3b6419..4aa52547943 100644 --- a/src/main/java/forge/game/player/PlayerOutcome.java +++ b/src/main/java/forge/game/player/PlayerOutcome.java @@ -5,11 +5,8 @@ package forge.game.player; * TODO: Write javadoc for this type. */ public class PlayerOutcome { - /** The alt win source name. */ public final String altWinSourceName; - /** The loss state. */ public final GameLossReason lossState; - /** The lose condition spell. */ public final String loseConditionSpell; private PlayerOutcome(String altWinSourceName, GameLossReason lossState, String loseConditionSpell) { diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java index 2627e9ea9b5..e39f421481a 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java @@ -10,6 +10,10 @@ import java.util.List; import javax.swing.JList; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import forge.Command; import forge.FThreads; import forge.Singletons; @@ -18,7 +22,8 @@ import forge.deck.Deck; import forge.deck.DeckgenUtil; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; +import forge.game.PlayerStartConditions; +import forge.game.player.LobbyPlayer; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; @@ -116,13 +121,13 @@ public enum CSubmenuGauntletContests implements ICDoc { Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - MatchStartHelper starter = new MatchStartHelper(); + List> starter = new ArrayList>(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); - starter.addPlayer(lobby.getAiPlayer(), aiDeck); + starter.add(ImmutablePair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck()))); + starter.add(ImmutablePair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck))); - final MatchController mc = new MatchController(GameType.Gauntlet, starter.getPlayerMap()); + final MatchController mc = new MatchController(GameType.Gauntlet, starter); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java index b5217027ab0..0955e3b6118 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java @@ -8,6 +8,9 @@ import java.util.List; import javax.swing.JButton; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.Pair; + import forge.Command; import forge.FThreads; import forge.Singletons; @@ -15,7 +18,8 @@ import forge.control.Lobby; import forge.deck.Deck; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; +import forge.game.PlayerStartConditions; +import forge.game.player.LobbyPlayer; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; @@ -109,12 +113,12 @@ public enum CSubmenuGauntletLoad implements ICDoc { final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData(); final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - MatchStartHelper starter = new MatchStartHelper(); + List> starter = new ArrayList>(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); - starter.addPlayer(lobby.getAiPlayer(), aiDeck); + starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck()))); + starter.add(Pair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck))); - final MatchController mc = new MatchController(GameType.Gauntlet, starter.getPlayerMap()); + final MatchController mc = new MatchController(GameType.Gauntlet, starter); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index fc0a22d2a48..5006c556f0f 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -9,6 +9,9 @@ import java.util.List; import java.util.Set; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.Pair; + import forge.Command; import forge.FThreads; import forge.Singletons; @@ -18,7 +21,8 @@ import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil.DeckTypes; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; +import forge.game.PlayerStartConditions; +import forge.game.player.LobbyPlayer; import forge.game.player.PlayerType; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; @@ -144,13 +148,12 @@ public enum CSubmenuGauntletQuick implements ICDoc { final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - MatchStartHelper starter = new MatchStartHelper(); + List> starter = new ArrayList>(); Lobby lobby = Singletons.getControl().getLobby(); - - starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); - starter.addPlayer(lobby.getAiPlayer(), aiDeck); - - final MatchController mc = new MatchController(GameType.Gauntlet, starter.getPlayerMap()); + starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck()))); + starter.add(Pair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck))); + + final MatchController mc = new MatchController(GameType.Gauntlet, starter); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java index 14403fb91dd..5cc3f2b4a7c 100644 --- a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java +++ b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java @@ -10,15 +10,16 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import forge.FThreads; import forge.Singletons; import forge.card.CardEdition; import forge.control.FControl; +import forge.control.Lobby; import forge.deck.Deck; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; import forge.gui.GuiChoose; @@ -433,14 +434,15 @@ public class SSubmenuQuestUtil { aiStart.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event)); } - MatchStartHelper msh = new MatchStartHelper(); - msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart); + List> starter = new ArrayList>(); + Lobby lobby = Singletons.getControl().getLobby(); + starter.add(Pair.of(lobby.getQuestPlayer(), humanStart)); LobbyPlayer aiPlayer = Singletons.getControl().getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent()); aiPlayer.setIconImageKey(event.getIconImageKey()); - msh.addPlayer(aiPlayer, aiStart); + starter.add(Pair.of(aiPlayer, aiStart)); - final MatchController mc = new MatchController(GameType.Quest, msh.getPlayerMap(), forceAnte); + final MatchController mc = new MatchController(GameType.Quest, starter, forceAnte); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index fed5f2756ac..3833634997e 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -2,16 +2,20 @@ package forge.gui.home.sanctioned; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; - +import java.util.ArrayList; +import java.util.List; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import forge.Command; import forge.FThreads; import forge.Singletons; import forge.control.Lobby; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; import forge.gui.SOverlayUtils; @@ -114,13 +118,16 @@ public enum CSubmenuConstructed implements ICDoc { SOverlayUtils.startGameOverlay(); SOverlayUtils.showOverlay(); - final MatchStartHelper starter = new MatchStartHelper(); + + Lobby lobby = Singletons.getControl().getLobby(); LobbyPlayer firstPlayer = view.getCbSpectate().isSelected() ? lobby.getAiPlayer() : lobby.getGuiPlayer(); - starter.addPlayer(firstPlayer, humanPsc); - starter.addPlayer(lobby.getAiPlayer(), aiDeck); - final MatchController mc = new MatchController(gameType, starter.getPlayerMap()); + List> players = new ArrayList>(); + players.add(ImmutablePair.of(firstPlayer, humanPsc)); + players.add(ImmutablePair.of(lobby.getAiPlayer(), aiDeck)); + + final MatchController mc = new MatchController(gameType, players); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java index 5373a70ef30..6229c7e852b 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java @@ -8,6 +8,9 @@ import java.util.List; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.Pair; + import forge.Command; import forge.FThreads; import forge.Singletons; @@ -17,9 +20,10 @@ import forge.deck.Deck; import forge.deck.DeckGroup; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; +import forge.game.PlayerStartConditions; import forge.game.limited.BoosterDraft; import forge.game.limited.LimitedPoolType; +import forge.game.player.LobbyPlayer; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; @@ -130,12 +134,12 @@ public enum CSubmenuDraft implements ICDoc { throw new IllegalStateException("Draft: Computer deck is null!"); } - MatchStartHelper starter = new MatchStartHelper(); + List> starter = new ArrayList>(); Lobby lobby = Singletons.getControl().getLobby(); - starter.addPlayer(lobby.getGuiPlayer(), humanDeck); - starter.addPlayer(lobby.getAiPlayer(), aiDeck); + starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(humanDeck))); + starter.add(Pair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck))); - final MatchController mc = new MatchController(GameType.Draft, starter.getPlayerMap()); + final MatchController mc = new MatchController(GameType.Draft, starter); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java index 30c87ef817f..882d9118735 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java @@ -7,6 +7,10 @@ import java.util.List; import java.util.Vector; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import forge.Command; @@ -19,7 +23,6 @@ import forge.deck.DeckSection; import forge.deck.DeckgenUtil; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; import forge.gui.GuiDialog; @@ -220,24 +223,22 @@ public enum CSubmenuArchenemy implements ICDoc { SOverlayUtils.showOverlay(); Lobby lobby = Singletons.getControl().getLobby(); - MatchStartHelper helper = new MatchStartHelper(); - List allies = new ArrayList(); + + List> players = new ArrayList>(); for (int i = 0; i < view.getNumPlayers(); i++) { if (i == 0) { - LobbyPlayer player = lobby.getGuiPlayer(); - helper.addArchenemy(player, playerDecks.get(i), schemes); - helper.getPlayerMap().get(player).setStartingLife(10 + (10 * (view.getNumPlayers() - 1))); + + PlayerStartConditions psc = PlayerStartConditions.forArchenemy(playerDecks.get(i), schemes); + psc.setStartingLife(10 + (10 * (view.getNumPlayers() - 1))); + players.add(ImmutablePair.of(lobby.getGuiPlayer(), psc)); } else { - LobbyPlayer player = lobby.getAiPlayer(); - allies.add(player); - helper.addPlayer(player, playerDecks.get(i)); + PlayerStartConditions psc = PlayerStartConditions.fromDeck(playerDecks.get(i)); + psc.setTeamNumber(0); + players.add(ImmutablePair.of(lobby.getAiPlayer(), psc)); } } - for(int i = 0; i < allies.size(); i++) - for(int j = i+1; i < allies.size(); j++) - helper.setAllies(allies.get(i), allies.get(j)); - - final MatchController mc = new MatchController(GameType.Archenemy, helper.getPlayerMap()); + + final MatchController mc = new MatchController(GameType.Archenemy, players); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java index 5700939c4dd..7a1e9dd3c99 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java @@ -7,6 +7,9 @@ import java.util.List; import java.util.Vector; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import forge.Command; @@ -19,7 +22,6 @@ import forge.deck.DeckSection; import forge.deck.DeckgenUtil; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; import forge.gui.GuiDialog; @@ -150,7 +152,7 @@ public enum CSubmenuPlanechase implements ICDoc { /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ private void startGame() { Lobby lobby = Singletons.getControl().getLobby(); - MatchStartHelper helper = new MatchStartHelper(); + List> helper = new ArrayList>(); List playerDecks = new ArrayList(); for (int i = 0; i < view.getNumPlayers(); i++) { PlayerStartConditions d = view.getDeckChoosers().get(i).getDeck(); @@ -209,13 +211,13 @@ public enum CSubmenuPlanechase implements ICDoc { GuiDialog.message("Player " + (i+1) + " will use a default planar deck."); } LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); - helper.addPlanechasePlayer(player, playerDecks.get(i), planes); + helper.add(Pair.of(player, PlayerStartConditions.forPlanechase(playerDecks.get(i), planes))); } SOverlayUtils.startGameOverlay(); SOverlayUtils.showOverlay(); - final MatchController mc = new MatchController(GameType.Planechase, helper.getPlayerMap()); + final MatchController mc = new MatchController(GameType.Planechase, helper); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java index f3a73745c57..b4f32ee5ffa 100644 --- a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java @@ -7,6 +7,9 @@ import java.util.List; import java.util.Random; import javax.swing.SwingUtilities; + +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.collect.Iterables; import forge.Command; @@ -17,7 +20,6 @@ import forge.deck.Deck; import forge.deck.DeckSection; import forge.game.GameType; import forge.game.MatchController; -import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions; import forge.game.player.LobbyPlayer; import forge.gui.GuiDialog; @@ -172,13 +174,12 @@ public enum CSubmenuVanguard implements ICDoc { } Lobby lobby = Singletons.getControl().getLobby(); - MatchStartHelper helper = new MatchStartHelper(); + List> helper = new ArrayList>(); for (int i = 0; i < view.getNumPlayers(); i++) { LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); - - helper.addVanguardPlayer(player, playerDecks.get(i), playerAvatars.get(i)); + helper.add(Pair.of(player, PlayerStartConditions.forVanguard(playerDecks.get(i), playerAvatars.get(i)))); } - final MatchController mc = new MatchController(GameType.Vanguard, helper.getPlayerMap()); + final MatchController mc = new MatchController(GameType.Vanguard, helper); FThreads.invokeInEdtLater(new Runnable(){ @Override public void run() { diff --git a/src/main/java/forge/gui/match/ControlWinLose.java b/src/main/java/forge/gui/match/ControlWinLose.java index 6c0726e0afc..6ac9dcd77f7 100644 --- a/src/main/java/forge/gui/match/ControlWinLose.java +++ b/src/main/java/forge/gui/match/ControlWinLose.java @@ -14,6 +14,7 @@ import forge.deck.Deck; import forge.game.GameOutcome; import forge.game.GameType; import forge.game.MatchController; +import forge.game.PlayerStartConditions; import forge.game.player.Player; import forge.game.player.PlayerType; import forge.game.zone.ZoneType; @@ -114,50 +115,49 @@ public class ControlWinLose { private void executeAnte() { List games = match.getPlayedGames(); - - GameOutcome lastGame = match.getLastGameOutcome(); if (games.isEmpty()) { return; } - for (Player p : match.getCurrentGame().getRegisteredPlayers()) { - if (!p.getLobbyPlayer().equals(lastGame.getWinner())) { - continue; - } - // p is winner by this point - - // remove all the lost cards from owners' decks - List losses = new ArrayList(); - for (Player loser : match.getCurrentGame().getRegisteredPlayers()) { - if (loser.equals(p)) { - continue; // not a loser - } - - List compAntes = new ArrayList(loser.getCardsIn(ZoneType.Ante)); - Deck cDeck = match.getPlayersDeck(loser.getLobbyPlayer()); - Deck oDeck = match.getPlayersOriginalDeck(loser.getLobbyPlayer()); - - for (Card c : compAntes) { - CardPrinted toRemove = CardDb.getCard(c); - cDeck.getMain().remove(toRemove); - if ( cDeck != oDeck ) - oDeck.getMain().remove(toRemove); - losses.add(toRemove); - } + // remove all the lost cards from owners' decks + List losses = new ArrayList(); + int cntPlayers = match.getPlayers().size(); + for (int i = 0; i < cntPlayers; i++ ) { + Player fromGame = match.getCurrentGame().getRegisteredPlayers().get(i); + if( !fromGame.hasLost()) continue; // not a loser + + + List compAntes = new ArrayList(fromGame.getCardsIn(ZoneType.Ante)); + PlayerStartConditions psc = match.getPlayers().get(i).getValue(); + Deck cDeck = psc.getCurrentDeck(); + Deck oDeck = psc.getOriginalDeck(); + + for (Card c : compAntes) { + CardPrinted toRemove = CardDb.getCard(c); + cDeck.getMain().remove(toRemove); + if ( cDeck != oDeck ) + oDeck.getMain().remove(toRemove); + losses.add(toRemove); } + } + for (int i = 0; i < cntPlayers; i++ ) { + Player fromGame = match.getCurrentGame().getRegisteredPlayers().get(i); + if( !fromGame.hasWon()) continue; // not a loser + // offer to winner, if he is local human - if (p.getLobbyPlayer().getType() == PlayerType.HUMAN) { + if (fromGame.getLobbyPlayer().getType() == PlayerType.HUMAN) { List chosen = GuiChoose.noneOrMany("Select cards to add to your deck", losses); if (null != chosen) { - Deck d = match.getPlayersDeck(p.getLobbyPlayer()); + PlayerStartConditions psc = match.getPlayers().get(i).getValue(); + Deck cDeck = psc.getCurrentDeck(); + //Deck oDeck = psc.getOriginalDeck(); for (CardPrinted c : chosen) { - d.getMain().add(c); + cDeck.getMain().add(c); + //oDeck.getMain().add(c); } } } - - break; // expect no other winners } } diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index 6c5a4641462..bb1595ca730 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -148,7 +148,7 @@ public enum CDock implements ICDoc { * View deck list. */ private void viewDeckList() { - showDeck(player.getGame().getMatch().getPlayersDeck(player.getLobbyPlayer())); + showDeck(player.getGame().getMatch().getPlayers().get(0).getValue().getCurrentDeck()); } /** diff --git a/src/main/java/forge/gui/toolbox/FDeckChooser.java b/src/main/java/forge/gui/toolbox/FDeckChooser.java index 1ec19930046..a17f99f52a7 100644 --- a/src/main/java/forge/gui/toolbox/FDeckChooser.java +++ b/src/main/java/forge/gui/toolbox/FDeckChooser.java @@ -227,7 +227,7 @@ public class FDeckChooser extends JPanel { deck = DeckgenUtil.getConstructedDeck(selection); } - return new PlayerStartConditions(deck); + return PlayerStartConditions.fromDeck(deck); } private PlayerType getPlayerType() {