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/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

View File

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

View File

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

View File

@@ -1417,7 +1417,7 @@ public class GameAction {
}
}
void handleLeylinesAndChancellors() {
private void handleLeylinesAndChancellors() {
for (Player p : game.getPlayers()) {
final List<Card> openingHand = new ArrayList<Card>(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<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());
int offset = whoCanMulligan.indexOf(firstPlayer);

View File

@@ -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<LobbyPlayer, PlayerStartConditions> playersConditions = game.getMatch().getPlayers();
for (Player player : game.getPlayers()) {
final PlayerStartConditions psc = playersConditions.get(player.getLobbyPlayer());
final List<Pair<LobbyPlayer, PlayerStartConditions>> 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,17 +332,10 @@ public class GameNew {
}
// ultimate of Karn the Liberated
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()));
}
public static void restartGame(final GameState game, final Player startingTurn, Map<Player, List<Card>> 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
@@ -352,12 +348,17 @@ public class GameNew {
game.getStack().reset();
GameAction action = game.getAction();
List<Player> gamePlayers = game.getRegisteredPlayers();
for( int i = 0; i < gamePlayers.size(); i++ ) {
for (Entry<Player, PlayerStartConditions> p : playersConditions.entrySet()) {
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);
putCardsOnBattlefield(player, p.getValue().getCardsOnBattlefield(player));
putCardsOnBattlefield(player, psc.getCardsOnBattlefield(player));
PlayerZone library = player.getZone(ZoneType.Library);
List<Card> newLibrary = playerLibraries.get(player);

View File

@@ -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<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;
match = match0;
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);
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);

View File

@@ -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<LobbyPlayer, PlayerStartConditions> players = new HashMap<LobbyPlayer, PlayerStartConditions>();
private final List<Pair<LobbyPlayer, PlayerStartConditions>> 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<LobbyPlayer, PlayerStartConditions> map) {
public MatchController(GameType type, List<Pair<LobbyPlayer, PlayerStartConditions>> players0) {
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
players.putAll(map);
players = Collections.unmodifiableList(Lists.newArrayList(players0));
gameType = type;
}
public MatchController(GameType type, Map<LobbyPlayer, PlayerStartConditions> map, Boolean forceAnte) {
this(type, map);
public MatchController(GameType type, List<Pair<LobbyPlayer, PlayerStartConditions>> 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<String> outcomes = new ArrayList<String>();
@@ -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<String, Object> runParams = new HashMap<String, Object>();
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<LobbyPlayer, PlayerStartConditions> 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<LobbyPlayer, PlayerStartConditions> getPlayers() {
public List<Pair<LobbyPlayer, PlayerStartConditions>> getPlayers() {
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 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<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<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) {
originalDeck = deck0;
@@ -41,10 +41,6 @@ public class PlayerStartConditions {
this.currentDeck = currentDeck0;
}
public Iterable<LobbyPlayer> 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<? extends IPaperCard> function) {
this.cardsInCommand = function;
public void addCardsInCommand(Iterable<? extends IPaperCard> 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<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 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();
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());
List<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby();
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() {

View File

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

View File

@@ -162,7 +162,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private PlayerStatistics stats = new PlayerStatistics();
protected PlayerController controller;
private final LobbyPlayer lobbyPlayer;
private final List<LobbyPlayer> allies = new ArrayList<LobbyPlayer>();
private int teamNumber = -1;
private Card activeScheme = null;
@@ -210,12 +210,15 @@ public class Player extends GameEntity implements Comparable<Player> {
return stats;
}
public final void setAllies(Iterable<LobbyPlayer> 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; }
@Deprecated
@@ -268,7 +271,7 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
public final Player getOpponent() {
for (Player p : game.getPlayers()) {
if (p == this || allies.contains(p.getLobbyPlayer())) { continue; }
if (p.isOpponentOf(this))
return p;
}
throw new IllegalStateException("No opponents left ingame for " + this);
@@ -283,7 +286,7 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getOpponents() {
List<Player> result = new ArrayList<Player>();
for (Player p : game.getPlayers()) {
if (p == this || allies.contains(p.getLobbyPlayer())) { continue; }
if (p.isOpponentOf(this))
result.add(p);
}
return result;
@@ -297,7 +300,7 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getAllies() {
List<Player> result = new ArrayList<Player>();
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<Player> {
* @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<Player> 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<Player> {
return false;
}
/**
* <p>
* hasWon.
* </p>
*
* @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<Player> {
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;

View File

@@ -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) {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
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() {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
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() {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
Lobby lobby = Singletons.getControl().getLobby();
starter.add(Pair.of(lobby.getGuiPlayer(), PlayerStartConditions.fromDeck(gd.getUserDeck())));
starter.add(Pair.of(lobby.getAiPlayer(), PlayerStartConditions.fromDeck(aiDeck)));
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck());
starter.addPlayer(lobby.getAiPlayer(), 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() {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
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() {

View File

@@ -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<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(){
@Override
public void run() {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> starter = new ArrayList<Pair<LobbyPlayer, PlayerStartConditions>>();
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() {

View File

@@ -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<LobbyPlayer> allies = new ArrayList<LobbyPlayer>();
List<Pair<LobbyPlayer, PlayerStartConditions>> players = new ArrayList<Pair<LobbyPlayer,PlayerStartConditions>>();
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)));
} else {
LobbyPlayer player = lobby.getAiPlayer();
allies.add(player);
helper.addPlayer(player, playerDecks.get(i));
}
}
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());
PlayerStartConditions psc = PlayerStartConditions.forArchenemy(playerDecks.get(i), schemes);
psc.setStartingLife(10 + (10 * (view.getNumPlayers() - 1)));
players.add(ImmutablePair.of(lobby.getGuiPlayer(), psc));
} else {
PlayerStartConditions psc = PlayerStartConditions.fromDeck(playerDecks.get(i));
psc.setTeamNumber(0);
players.add(ImmutablePair.of(lobby.getAiPlayer(), psc));
}
}
final MatchController mc = new MatchController(GameType.Archenemy, players);
FThreads.invokeInEdtLater(new Runnable(){
@Override
public void run() {

View File

@@ -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 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */
private void startGame() {
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>();
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() {

View File

@@ -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<Pair<LobbyPlayer, PlayerStartConditions>> helper = new ArrayList<Pair<LobbyPlayer, PlayerStartConditions>>();
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() {

View File

@@ -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,28 +115,22 @@ public class ControlWinLose {
private void executeAnte() {
List<GameOutcome> 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<CardPrinted> losses = new ArrayList<CardPrinted>();
for (Player loser : match.getCurrentGame().getRegisteredPlayers()) {
if (loser.equals(p)) {
continue; // not a loser
}
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<Card> compAntes = new ArrayList<Card>(loser.getCardsIn(ZoneType.Ante));
Deck cDeck = match.getPlayersDeck(loser.getLobbyPlayer());
Deck oDeck = match.getPlayersOriginalDeck(loser.getLobbyPlayer());
List<Card> compAntes = new ArrayList<Card>(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);
@@ -146,18 +141,23 @@ public class ControlWinLose {
}
}
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<CardPrinted> 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
}
}

View File

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

View File

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