MatchController ctor: no longer accepts a map of players, since that required unique lobbyplayers for each game player.

Player's teams are defined by numbers, no more lists of LobbyPlayers
This commit is contained in:
Maxmtg
2013-05-23 13:28:32 +00:00
parent 0c5120acb5
commit 27fe98384b
25 changed files with 256 additions and 285 deletions

1
.gitattributes vendored
View File

@@ -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/GameType.java -text
src/main/java/forge/game/GlobalRuleChange.java -text src/main/java/forge/game/GlobalRuleChange.java -text
src/main/java/forge/game/MatchController.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/PlanarDice.java -text
src/main/java/forge/game/PlayerStartConditions.java -text src/main/java/forge/game/PlayerStartConditions.java -text
src/main/java/forge/game/ai/AiAttackController.java svneol=native#text/plain src/main/java/forge/game/ai/AiAttackController.java svneol=native#text/plain

View File

@@ -1,7 +1,5 @@
package forge.card.ability.ai; package forge.card.ability.ai;
import java.util.Random;
import forge.Card; import forge.Card;
import forge.CounterType; import forge.CounterType;
import forge.card.ability.SpellAbilityAi; import forge.card.ability.SpellAbilityAi;
@@ -12,7 +10,6 @@ import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilCost;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom;
public class CountersRemoveAi extends SpellAbilityAi { 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 // AI needs to be expanded, since this function can be pretty complex
// based on what // based on what
// the expected targets could be // the expected targets could be
final Random r = MyRandom.getRandom();
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
Target abTgt = sa.getTarget(); Target abTgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();

View File

@@ -64,7 +64,7 @@ public class Lobby {
private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human"); private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human");
private final LobbyPlayerAi system = new LobbyPlayerAi("System"); private final LobbyPlayerAi system = new LobbyPlayerAi("System");
public final LobbyPlayerHuman getGuiPlayer() { public final LobbyPlayer getGuiPlayer() {
return guiPlayer; return guiPlayer;
} }

View File

@@ -1417,7 +1417,7 @@ public class GameAction {
} }
} }
void handleLeylinesAndChancellors() { private void handleLeylinesAndChancellors() {
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
final List<Card> openingHand = new ArrayList<Card>(p.getCardsIn(ZoneType.Hand)); final List<Card> openingHand = new ArrayList<Card>(p.getCardsIn(ZoneType.Hand));
@@ -1470,7 +1470,17 @@ public class GameAction {
game.getAction().checkStateEffects(); 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<String, Object> runParams = new HashMap<String, Object>();
game.getTriggerHandler().runTrigger(TriggerType.NewGame, runParams, false);
game.setAge(GameAge.Play);
game.getInputQueue().clearInput();
}
private void performMulligans(final Player firstPlayer, final boolean isCommander) {
List<Player> whoCanMulligan = Lists.newArrayList(game.getPlayers()); List<Player> whoCanMulligan = Lists.newArrayList(game.getPlayers());
int offset = whoCanMulligan.indexOf(firstPlayer); int offset = whoCanMulligan.indexOf(firstPlayer);

View File

@@ -9,6 +9,8 @@ import java.util.Map.Entry;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@@ -234,9 +236,10 @@ public class GameNew {
boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty(); boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty();
boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed(); boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed();
final Map<LobbyPlayer, PlayerStartConditions> playersConditions = game.getMatch().getPlayers(); final List<Pair<LobbyPlayer, PlayerStartConditions>> playersConditions = game.getMatch().getPlayers();
for (Player player : game.getPlayers()) { for (int i = 0; i < playersConditions.size(); i++) {
final PlayerStartConditions psc = playersConditions.get(player.getLobbyPlayer()); Player player = game.getPlayers().get(i);
final PlayerStartConditions psc = playersConditions.get(i).getRight();
putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player)); putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player));
initVariantsZones(player, psc); initVariantsZones(player, psc);
@@ -329,18 +332,11 @@ public class GameNew {
} }
// ultimate of Karn the Liberated // ultimate of Karn the Liberated
public static void restartGame( final GameState game, final Player startingTurn, Map<Player, List<Card>> playerLibraries) { public static void restartGame(final GameState game, final Player startingTurn, Map<Player, List<Card>> playerLibraries) {
final Map<LobbyPlayer, PlayerStartConditions> players = game.getMatch().getPlayers();
Map<Player, PlayerStartConditions> playersConditions = new HashMap<Player, PlayerStartConditions>();
for (Player p : game.getPlayers()) {
playersConditions.put(p, players.get(p.getLobbyPlayer()));
}
game.setAge(GameAge.Mulligan); game.setAge(GameAge.Mulligan);
// TODO: Apply new mulligan code here game.getAction().mulligan(startingTurn);
game.getInputQueue().clearInput();
//Card.resetUniqueNumber(); //Card.resetUniqueNumber();
// need this code here, otherwise observables fail // need this code here, otherwise observables fail
forge.card.trigger.Trigger.resetIDs(); forge.card.trigger.Trigger.resetIDs();
@@ -348,16 +344,21 @@ public class GameNew {
trigHandler.clearDelayedTrigger(); trigHandler.clearDelayedTrigger();
trigHandler.cleanUpTemporaryTriggers(); trigHandler.cleanUpTemporaryTriggers();
trigHandler.suppressMode(TriggerType.ChangesZone); trigHandler.suppressMode(TriggerType.ChangesZone);
game.getStack().reset(); game.getStack().reset();
GameAction action = game.getAction(); GameAction action = game.getAction();
List<Player> gamePlayers = game.getRegisteredPlayers();
for (Entry<Player, PlayerStartConditions> p : playersConditions.entrySet()) { for( int i = 0; i < gamePlayers.size(); i++ ) {
final Player player = p.getKey();
player.setStartingLife(p.getValue().getStartingLife()); 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); player.setNumLandsPlayed(0);
putCardsOnBattlefield(player, p.getValue().getCardsOnBattlefield(player)); putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player));
PlayerZone library = player.getZone(ZoneType.Library); PlayerZone library = player.getZone(ZoneType.Library);
List<Card> newLibrary = playerLibraries.get(player); List<Card> newLibrary = playerLibraries.get(player);

View File

@@ -25,6 +25,8 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.TreeMap; import java.util.TreeMap;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import forge.Card; import forge.Card;
@@ -95,11 +97,11 @@ public class GameState {
* @param match0 * @param match0
* @param input * @param input
*/ */
public GameState(Map<LobbyPlayer, PlayerStartConditions> players2, GameType t, MatchController match0) { /* no more zones to map here */ public GameState(List<Pair<LobbyPlayer, PlayerStartConditions>> players0, GameType t, MatchController match0) { /* no more zones to map here */
type = t; type = t;
match = match0; match = match0;
List<Player> players = new ArrayList<Player>(); List<Player> players = new ArrayList<Player>();
for (Entry<LobbyPlayer, PlayerStartConditions> kv : players2.entrySet()) { for (Entry<LobbyPlayer, PlayerStartConditions> kv : players0) {
Player pl = kv.getKey().getPlayer(this); Player pl = kv.getKey().getPlayer(this);
players.add(pl); players.add(pl);
ingamePlayers.add(pl); ingamePlayers.add(pl);
@@ -108,7 +110,7 @@ public class GameState {
pl.setStartingLife(psc.getStartingLife()); pl.setStartingLife(psc.getStartingLife());
pl.setMaxHandSize(psc.getStartingHand()); pl.setMaxHandSize(psc.getStartingHand());
pl.setStartingHandSize(psc.getStartingHand()); pl.setStartingHandSize(psc.getStartingHand());
pl.setAllies(psc.getAllies()); pl.setTeam(psc.getTeamNumber());
} }
allPlayers = Collections.unmodifiableList(players); allPlayers = Collections.unmodifiableList(players);

View File

@@ -2,22 +2,21 @@ package forge.game;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Lists;
import forge.Constant.Preferences; import forge.Constant.Preferences;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.card.trigger.TriggerType;
import forge.control.FControl; import forge.control.FControl;
import forge.deck.Deck;
import forge.error.BugReporter; import forge.error.BugReporter;
import forge.game.event.DuelOutcomeEvent; import forge.game.event.DuelOutcomeEvent;
import forge.game.event.FlipCoinEvent; import forge.game.event.FlipCoinEvent;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.LobbyPlayerHuman;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerStatistics; import forge.game.player.PlayerStatistics;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
@@ -42,7 +41,7 @@ import forge.util.MyRandom;
public class MatchController { public class MatchController {
private final Map<LobbyPlayer, PlayerStartConditions> players = new HashMap<LobbyPlayer, PlayerStartConditions>(); private final List<Pair<LobbyPlayer, PlayerStartConditions>> players;
private final GameType gameType; private final GameType gameType;
private int gamesPerMatch = 3; private int gamesPerMatch = 3;
@@ -58,14 +57,14 @@ public class MatchController {
/** /**
* This should become constructor once. * This should become constructor once.
*/ */
public MatchController(GameType type, Map<LobbyPlayer, PlayerStartConditions> map) { public MatchController(GameType type, List<Pair<LobbyPlayer, PlayerStartConditions>> players0) {
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed); gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
players.putAll(map); players = Collections.unmodifiableList(Lists.newArrayList(players0));
gameType = type; gameType = type;
} }
public MatchController(GameType type, Map<LobbyPlayer, PlayerStartConditions> map, Boolean forceAnte) { public MatchController(GameType type, List<Pair<LobbyPlayer, PlayerStartConditions>> players0, Boolean forceAnte) {
this(type, map); this(type, players0);
if( forceAnte != null ) if( forceAnte != null )
this.useAnte = forceAnte.booleanValue(); this.useAnte = forceAnte.booleanValue();
} }
@@ -109,7 +108,7 @@ public class MatchController {
game.getGameLog().add("Final", result.getWinner() + " won", 0); game.getGameLog().add("Final", result.getWinner() + " won", 0);
// add result entries to the game log // add result entries to the game log
final LobbyPlayerHuman human = Singletons.getControl().getLobby().getGuiPlayer(); final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer();
final List<String> outcomes = new ArrayList<String>(); final List<String> outcomes = new ArrayList<String>();
@@ -171,18 +170,12 @@ public class MatchController {
FThreads.invokeInNewThread( new Runnable() { FThreads.invokeInNewThread( new Runnable() {
@Override @Override
public void run() { public void run() {
currentGame.getAction().performMulligans(firstPlayer, currentGame.getType() == GameType.Commander); currentGame.getAction().mulligan(firstPlayer);
currentGame.getAction().handleLeylinesAndChancellors();
// Run Trigger beginning of the game
final HashMap<String, Object> runParams = new HashMap<String, Object>();
currentGame.getTriggerHandler().runTrigger(TriggerType.NewGame, runParams, false);
currentGame.setAge(GameAge.Play);
currentGame.getInputQueue().clearInput();
} }
}); });
} }
public static void attachUiToMatch(MatchController match, LobbyPlayerHuman humanLobbyPlayer) { public static void attachUiToMatch(MatchController match, LobbyPlayer humanLobbyPlayer) {
FControl.SINGLETON_INSTANCE.setMatch(match); FControl.SINGLETON_INSTANCE.setMatch(match);
GameState currentGame = match.getCurrentGame(); GameState currentGame = match.getCurrentGame();
@@ -272,8 +265,8 @@ public class MatchController {
for (GameOutcome go : gamesPlayed) { for (GameOutcome go : gamesPlayed) {
LobbyPlayer winner = go.getWinner(); LobbyPlayer winner = go.getWinner();
int i = 0; int i = 0;
for (LobbyPlayer p : players.keySet()) { for (Pair<LobbyPlayer, PlayerStartConditions> p : players) {
if (p.equals(winner)) { if (p.getLeft().equals(winner)) {
victories[i]++; victories[i]++;
break; // can't have 2 winners per game break; // can't have 2 winners per game
} }
@@ -315,24 +308,7 @@ public class MatchController {
return getGamesWonBy(questPlayer) >= gamesToWinMatch; return getGamesWonBy(questPlayer) >= gamesToWinMatch;
} }
/** public List<Pair<LobbyPlayer, PlayerStartConditions>> getPlayers() {
* 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<LobbyPlayer, PlayerStartConditions> getPlayers() {
return players; return players;
} }

View File

@@ -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<LobbyPlayer, PlayerStartConditions> players = new HashMap<LobbyPlayer, PlayerStartConditions>();
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<CardPrinted> schemes) {
PlayerStartConditions start = new PlayerStartConditions(deck);
start.setSchemes(schemes);
players.put(player, start);
}
public void addPlanechasePlayer(final LobbyPlayer player, final Deck deck, final Iterable<CardPrinted> planes) {
PlayerStartConditions start = new PlayerStartConditions(deck);
start.setPlanes(planes);
players.put(player, start);
}
public Map<LobbyPlayer, PlayerStartConditions> 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);
}
}

View File

@@ -5,7 +5,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.player.LobbyPlayer; import forge.deck.DeckSection;
import forge.game.player.Player; import forge.game.player.Player;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.IPaperCard; import forge.item.IPaperCard;
@@ -19,10 +19,10 @@ public class PlayerStartConditions {
private int startingLife = 20; private int startingLife = 20;
private int startingHand = 7; private int startingHand = 7;
private Iterable<IPaperCard> cardsOnBattlefield = null; private Iterable<IPaperCard> cardsOnBattlefield = null;
private Iterable<? extends IPaperCard> cardsInCommand = null; private final List<IPaperCard> cardsInCommand = new ArrayList<IPaperCard>();
private Iterable<? extends IPaperCard> schemes = null; private Iterable<? extends IPaperCard> schemes = null;
private Iterable<CardPrinted> planes = null; private Iterable<CardPrinted> planes = null;
private List<LobbyPlayer> allies = new ArrayList<LobbyPlayer>(); private int teamNumber = -1; // members of teams with negative id will play FFA.
public PlayerStartConditions(Deck deck0) { public PlayerStartConditions(Deck deck0) {
originalDeck = deck0; originalDeck = deck0;
@@ -41,10 +41,6 @@ public class PlayerStartConditions {
this.currentDeck = currentDeck0; this.currentDeck = currentDeck0;
} }
public Iterable<LobbyPlayer> getAllies() {
return allies;
}
public final int getStartingLife() { public final int getStartingLife() {
return startingLife; return startingLife;
} }
@@ -84,13 +80,13 @@ public class PlayerStartConditions {
/** /**
* @param function the cardsInCommand to set * @param function the cardsInCommand to set
*/ */
public void setCardsInCommand(Iterable<? extends IPaperCard> function) { public void addCardsInCommand(Iterable<? extends IPaperCard> function) {
this.cardsInCommand = function; for(IPaperCard pc : function)
this.cardsInCommand.add(pc);
} }
public void addAlly(LobbyPlayer ally) { public void addCardsInCommand(IPaperCard pc) {
if(!allies.contains(ally)) this.cardsInCommand.add(pc);
allies.add(ally);
} }
/** /**
@@ -128,5 +124,44 @@ public class PlayerStartConditions {
this.planes = planes0; 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<CardPrinted> schemes) {
PlayerStartConditions start = fromDeck(deck);
start.setSchemes(schemes);
return start;
}
public static PlayerStartConditions forPlanechase(final Deck deck, final Iterable<CardPrinted> planes) {
PlayerStartConditions start = fromDeck(deck);
start.setPlanes(planes);
return start;
}
} }

View File

@@ -22,14 +22,16 @@ import java.util.List;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.control.Lobby; import forge.control.Lobby;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
/** /**
@@ -162,12 +164,12 @@ public class GauntletMini {
} }
}); });
final MatchStartHelper starter = new MatchStartHelper();
List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.getGuiPlayer(), humanDeck); starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(humanDeck)));
starter.addPlayer(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1)); starter.add(Pair.of(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1)));
final MatchController mc = new MatchController(gauntletType, starter);
final MatchController mc = new MatchController(gauntletType, starter.getPlayerMap());
FThreads.invokeInEdtLater(new Runnable(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

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

View File

@@ -162,7 +162,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private PlayerStatistics stats = new PlayerStatistics(); private PlayerStatistics stats = new PlayerStatistics();
protected PlayerController controller; protected PlayerController controller;
private final LobbyPlayer lobbyPlayer; private final LobbyPlayer lobbyPlayer;
private final List<LobbyPlayer> allies = new ArrayList<LobbyPlayer>(); private int teamNumber = -1;
private Card activeScheme = null; private Card activeScheme = null;
@@ -210,11 +210,14 @@ public class Player extends GameEntity implements Comparable<Player> {
return stats; return stats;
} }
public final void setAllies(Iterable<LobbyPlayer> allys) { public final void setTeam(int iTeam) {
for(LobbyPlayer a : allys) { teamNumber = iTeam;
allies.add(a);
}
} }
public final int getTeam() {
return teamNumber;
}
@Deprecated @Deprecated
public boolean isHuman() { return getType() == PlayerType.HUMAN; } public boolean isHuman() { return getType() == PlayerType.HUMAN; }
@@ -268,8 +271,8 @@ public class Player extends GameEntity implements Comparable<Player> {
*/ */
public final Player getOpponent() { public final Player getOpponent() {
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p == this || allies.contains(p.getLobbyPlayer())) { continue; } if (p.isOpponentOf(this))
return p; return p;
} }
throw new IllegalStateException("No opponents left ingame for " + this); throw new IllegalStateException("No opponents left ingame for " + this);
} }
@@ -283,8 +286,8 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getOpponents() { public final List<Player> getOpponents() {
List<Player> result = new ArrayList<Player>(); List<Player> result = new ArrayList<Player>();
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p == this || allies.contains(p.getLobbyPlayer())) { continue; } if (p.isOpponentOf(this))
result.add(p); result.add(p);
} }
return result; return result;
} }
@@ -297,7 +300,7 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getAllies() { public final List<Player> getAllies() {
List<Player> result = new ArrayList<Player>(); List<Player> result = new ArrayList<Player>();
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if( allies.contains(p.getLobbyPlayer())) if (!p.isOpponentOf(this))
result.add(p); result.add(p);
} }
return result; return result;
@@ -320,15 +323,21 @@ public class Player extends GameEntity implements Comparable<Player> {
* @return * @return
*/ */
public final Player getWeakestOpponent() { public final Player getWeakestOpponent() {
Player weakest = this.getOpponents().get(0); List<Player> opponnets = this.getOpponents();
for (int i = 1; i < this.getOpponents().size(); i++) { Player weakest = opponnets.get(0);
if (weakest.getLife() > this.getOpponents().get(i).getLife()) { for (int i = 1; i < opponnets.size(); i++) {
weakest = this.getOpponents().get(i); if (weakest.getLife() > opponnets.get(i).getLife()) {
weakest = opponnets.get(i);
} }
} }
return weakest; 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<Player> {
return false; return false;
} }
/** public final boolean hasLost() {
* <p> return this.getOutcome() != null && this.getOutcome().lossState != null;
* hasWon. }
* </p>
*
* @return a boolean.
*/
public final boolean hasWon() { public final boolean hasWon() {
if (this.cantWin()) { if (this.cantWin()) {
return false; return false;
@@ -2904,16 +2910,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return false; 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() { public int getStartingHandSize() {
return this.startingHandSize; return this.startingHandSize;

View File

@@ -5,11 +5,8 @@ package forge.game.player;
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
*/ */
public class PlayerOutcome { public class PlayerOutcome {
/** The alt win source name. */
public final String altWinSourceName; public final String altWinSourceName;
/** The loss state. */
public final GameLossReason lossState; public final GameLossReason lossState;
/** The lose condition spell. */
public final String loseConditionSpell; public final String loseConditionSpell;
private PlayerOutcome(String altWinSourceName, GameLossReason lossState, String loseConditionSpell) { private PlayerOutcome(String altWinSourceName, GameLossReason lossState, String loseConditionSpell) {

View File

@@ -10,6 +10,10 @@ import java.util.List;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -18,7 +22,8 @@ import forge.deck.Deck;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
@@ -116,13 +121,13 @@ public enum CSubmenuGauntletContests implements ICDoc {
Deck aiDeck = gd.getDecks().get(gd.getCompleted()); Deck aiDeck = gd.getDecks().get(gd.getCompleted());
MatchStartHelper starter = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); starter.add(ImmutablePair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck())));
starter.addPlayer(lobby.getAiPlayer(), aiDeck); 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(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -8,6 +8,9 @@ import java.util.List;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -15,7 +18,8 @@ import forge.control.Lobby;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
@@ -109,12 +113,12 @@ public enum CSubmenuGauntletLoad implements ICDoc {
final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData(); final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData();
final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
MatchStartHelper starter = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck())));
starter.addPlayer(lobby.getAiPlayer(), aiDeck); 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(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -9,6 +9,9 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -18,7 +21,8 @@ import forge.deck.DeckgenUtil;
import forge.deck.DeckgenUtil.DeckTypes; import forge.deck.DeckgenUtil.DeckTypes;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType; import forge.game.player.PlayerType;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
@@ -144,13 +148,12 @@ public enum CSubmenuGauntletQuick implements ICDoc {
final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
MatchStartHelper starter = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck())));
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck()); starter.add(Pair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck)));
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
final MatchController mc = new MatchController(GameType.Gauntlet, starter);
final MatchController mc = new MatchController(GameType.Gauntlet, starter.getPlayerMap());
FThreads.invokeInEdtLater(new Runnable(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -10,15 +10,16 @@ import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.control.FControl; import forge.control.FControl;
import forge.control.Lobby;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
@@ -433,14 +434,15 @@ public class SSubmenuQuestUtil {
aiStart.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event)); aiStart.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event));
} }
MatchStartHelper msh = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart); 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()); LobbyPlayer aiPlayer = Singletons.getControl().getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent());
aiPlayer.setIconImageKey(event.getIconImageKey()); 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(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -2,16 +2,20 @@ package forge.gui.home.sanctioned;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.control.Lobby; import forge.control.Lobby;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
@@ -114,13 +118,16 @@ public enum CSubmenuConstructed implements ICDoc {
SOverlayUtils.startGameOverlay(); SOverlayUtils.startGameOverlay();
SOverlayUtils.showOverlay(); SOverlayUtils.showOverlay();
final MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
LobbyPlayer firstPlayer = view.getCbSpectate().isSelected() ? lobby.getAiPlayer() : lobby.getGuiPlayer(); 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<Pair<LobbyPlayer, PlayerStartConditions>> players = new ArrayList<Pair<LobbyPlayer, PlayerStartConditions>>();
players.add(ImmutablePair.of(firstPlayer, humanPsc));
players.add(ImmutablePair.of(lobby.getAiPlayer(), aiDeck));
final MatchController mc = new MatchController(gameType, players);
FThreads.invokeInEdtLater(new Runnable(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -8,6 +8,9 @@ import java.util.List;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -17,9 +20,10 @@ import forge.deck.Deck;
import forge.deck.DeckGroup; import forge.deck.DeckGroup;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper; import forge.game.PlayerStartConditions;
import forge.game.limited.BoosterDraft; import forge.game.limited.BoosterDraft;
import forge.game.limited.LimitedPoolType; import forge.game.limited.LimitedPoolType;
import forge.game.player.LobbyPlayer;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.CDeckEditorUI;
@@ -130,12 +134,12 @@ public enum CSubmenuDraft implements ICDoc {
throw new IllegalStateException("Draft: Computer deck is null!"); throw new IllegalStateException("Draft: Computer deck is null!");
} }
MatchStartHelper starter = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer, PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.getGuiPlayer(), humanDeck); starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(humanDeck)));
starter.addPlayer(lobby.getAiPlayer(), aiDeck); 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(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -7,6 +7,10 @@ import java.util.List;
import java.util.Vector; import java.util.Vector;
import javax.swing.SwingUtilities; 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 com.google.common.base.Predicate;
import forge.Command; import forge.Command;
@@ -19,7 +23,6 @@ import forge.deck.DeckSection;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -220,24 +223,22 @@ public enum CSubmenuArchenemy implements ICDoc {
SOverlayUtils.showOverlay(); SOverlayUtils.showOverlay();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper();
List<LobbyPlayer> allies = new ArrayList<LobbyPlayer>(); List<Pair<LobbyPlayer, PlayerStartConditions>> players = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
for (int i = 0; i < view.getNumPlayers(); i++) { for (int i = 0; i < view.getNumPlayers(); i++) {
if (i == 0) { if (i == 0) {
LobbyPlayer player = lobby.getGuiPlayer();
helper.addArchenemy(player, playerDecks.get(i), schemes); PlayerStartConditions psc = PlayerStartConditions.forArchenemy(playerDecks.get(i), schemes);
helper.getPlayerMap().get(player).setStartingLife(10 + (10 * (view.getNumPlayers() - 1))); psc.setStartingLife(10 + (10 * (view.getNumPlayers() - 1)));
players.add(ImmutablePair.of(lobby.getGuiPlayer(), psc));
} else { } else {
LobbyPlayer player = lobby.getAiPlayer(); PlayerStartConditions psc = PlayerStartConditions.fromDeck(playerDecks.get(i));
allies.add(player); psc.setTeamNumber(0);
helper.addPlayer(player, playerDecks.get(i)); players.add(ImmutablePair.of(lobby.getAiPlayer(), psc));
} }
} }
for(int i = 0; i < allies.size(); i++)
for(int j = i+1; i < allies.size(); j++) final MatchController mc = new MatchController(GameType.Archenemy, players);
helper.setAllies(allies.get(i), allies.get(j));
final MatchController mc = new MatchController(GameType.Archenemy, helper.getPlayerMap());
FThreads.invokeInEdtLater(new Runnable(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -7,6 +7,9 @@ import java.util.List;
import java.util.Vector; import java.util.Vector;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import forge.Command; import forge.Command;
@@ -19,7 +22,6 @@ import forge.deck.DeckSection;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -150,7 +152,7 @@ public enum CSubmenuPlanechase implements ICDoc {
/** @param lists0 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */ /** @param lists0 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */
private void startGame() { private void startGame() {
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> helper = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
List<Deck> playerDecks = new ArrayList<Deck>(); List<Deck> playerDecks = new ArrayList<Deck>();
for (int i = 0; i < view.getNumPlayers(); i++) { for (int i = 0; i < view.getNumPlayers(); i++) {
PlayerStartConditions d = view.getDeckChoosers().get(i).getDeck(); 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."); GuiDialog.message("Player " + (i+1) + " will use a default planar deck.");
} }
LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); 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.startGameOverlay();
SOverlayUtils.showOverlay(); SOverlayUtils.showOverlay();
final MatchController mc = new MatchController(GameType.Planechase, helper.getPlayerMap()); final MatchController mc = new MatchController(GameType.Planechase, helper);
FThreads.invokeInEdtLater(new Runnable(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -7,6 +7,9 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import forge.Command; import forge.Command;
@@ -17,7 +20,6 @@ import forge.deck.Deck;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions; import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -172,13 +174,12 @@ public enum CSubmenuVanguard implements ICDoc {
} }
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper(); List<Pair<LobbyPlayer, PlayerStartConditions>> helper = new ArrayList<Pair<LobbyPlayer, PlayerStartConditions>>();
for (int i = 0; i < view.getNumPlayers(); i++) { for (int i = 0; i < view.getNumPlayers(); i++) {
LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer(); LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer();
helper.add(Pair.of(player, PlayerStartConditions.forVanguard(playerDecks.get(i), playerAvatars.get(i))));
helper.addVanguardPlayer(player, 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(){ FThreads.invokeInEdtLater(new Runnable(){
@Override @Override
public void run() { public void run() {

View File

@@ -14,6 +14,7 @@ import forge.deck.Deck;
import forge.game.GameOutcome; import forge.game.GameOutcome;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.PlayerStartConditions;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerType; import forge.game.player.PlayerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -114,50 +115,49 @@ public class ControlWinLose {
private void executeAnte() { private void executeAnte() {
List<GameOutcome> games = match.getPlayedGames(); List<GameOutcome> games = match.getPlayedGames();
GameOutcome lastGame = match.getLastGameOutcome();
if (games.isEmpty()) { if (games.isEmpty()) {
return; return;
} }
for (Player p : match.getCurrentGame().getRegisteredPlayers()) { // remove all the lost cards from owners' decks
if (!p.getLobbyPlayer().equals(lastGame.getWinner())) { List<CardPrinted> losses = new ArrayList<CardPrinted>();
continue; int cntPlayers = match.getPlayers().size();
} for (int i = 0; i < cntPlayers; i++ ) {
// p is winner by this point Player fromGame = match.getCurrentGame().getRegisteredPlayers().get(i);
if( !fromGame.hasLost()) continue; // not a loser
// remove all the lost cards from owners' decks
List<CardPrinted> losses = new ArrayList<CardPrinted>();
for (Player loser : match.getCurrentGame().getRegisteredPlayers()) { List<Card> compAntes = new ArrayList<Card>(fromGame.getCardsIn(ZoneType.Ante));
if (loser.equals(p)) { PlayerStartConditions psc = match.getPlayers().get(i).getValue();
continue; // not a loser Deck cDeck = psc.getCurrentDeck();
} Deck oDeck = psc.getOriginalDeck();
List<Card> compAntes = new ArrayList<Card>(loser.getCardsIn(ZoneType.Ante)); for (Card c : compAntes) {
Deck cDeck = match.getPlayersDeck(loser.getLobbyPlayer()); CardPrinted toRemove = CardDb.getCard(c);
Deck oDeck = match.getPlayersOriginalDeck(loser.getLobbyPlayer()); cDeck.getMain().remove(toRemove);
if ( cDeck != oDeck )
for (Card c : compAntes) { oDeck.getMain().remove(toRemove);
CardPrinted toRemove = CardDb.getCard(c); losses.add(toRemove);
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 // offer to winner, if he is local human
if (p.getLobbyPlayer().getType() == PlayerType.HUMAN) { if (fromGame.getLobbyPlayer().getType() == PlayerType.HUMAN) {
List<CardPrinted> chosen = GuiChoose.noneOrMany("Select cards to add to your deck", losses); List<CardPrinted> chosen = GuiChoose.noneOrMany("Select cards to add to your deck", losses);
if (null != chosen) { 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) { for (CardPrinted c : chosen) {
d.getMain().add(c); cDeck.getMain().add(c);
//oDeck.getMain().add(c);
} }
} }
} }
break; // expect no other winners
} }
} }

View File

@@ -148,7 +148,7 @@ public enum CDock implements ICDoc {
* View deck list. * View deck list.
*/ */
private void viewDeckList() { private void viewDeckList() {
showDeck(player.getGame().getMatch().getPlayersDeck(player.getLobbyPlayer())); showDeck(player.getGame().getMatch().getPlayers().get(0).getValue().getCurrentDeck());
} }
/** /**

View File

@@ -227,7 +227,7 @@ public class FDeckChooser extends JPanel {
deck = DeckgenUtil.getConstructedDeck(selection); deck = DeckgenUtil.getConstructedDeck(selection);
} }
return new PlayerStartConditions(deck); return PlayerStartConditions.fromDeck(deck);
} }
private PlayerType getPlayerType() { private PlayerType getPlayerType() {