changed how ante works

This commit is contained in:
Maxmtg
2013-12-30 21:17:14 +00:00
parent c8352e4968
commit db8a71cca2
22 changed files with 165 additions and 192 deletions

View File

@@ -52,7 +52,6 @@ import forge.game.event.GameEventCardDestroyed;
import forge.game.event.GameEventCardRegenerated;
import forge.game.event.GameEventCardSacrificed;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.event.GameEventGameFinished;
import forge.game.event.GameEventFlipCoin;
import forge.game.event.GameEventGameStarted;
import forge.game.player.GameLossReason;
@@ -1502,9 +1501,6 @@ public class GameAction {
first = game.getPhaseHandler().getPlayerTurn(); // needed only for restart
} while (game.getAge() == GameStage.RestartedByKarn);
// will pull UI dialog, when the UI is listening
game.fireEvent(new GameEventGameFinished());
}
private Player determineFirstTurnPlayer(final GameOutcome lastGameOutcome) {

View File

@@ -20,7 +20,9 @@ package forge.game;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.apache.commons.lang3.tuple.Pair;
@@ -28,6 +30,7 @@ import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.PlayerOutcome;
import forge.game.player.PlayerStatistics;
import forge.item.PaperCard;
/**
* <p>
@@ -43,18 +46,23 @@ import forge.game.player.PlayerStatistics;
// GameObserver class - who should be notified of any considerable ingame event
public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStatistics>> {
public static class AnteResult {
public final List<PaperCard> cards;
public final boolean hasWon;
/** The player got first turn. */
// private String playerGotFirstTurn = "Nobody";
private AnteResult(List<PaperCard> cards, boolean won) {
this.cards = cards;
hasWon = won;
}
public static AnteResult won(List<PaperCard> cards) { return new AnteResult(cards, true); }
public static AnteResult lost(List<PaperCard> cards) { return new AnteResult(cards, true); }
}
/** The last turn number. */
private int lastTurnNumber = 0;
/** The player rating. */
private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2);
private final Iterable<Player> players;
public final Map<Player, AnteResult> anteResult = new TreeMap<>();
private GameEndReason winCondition;
public GameOutcome(GameEndReason reason, final Iterable<Player> list) {
@@ -65,6 +73,8 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
}
}
public boolean isDraw() {
for (Pair<LobbyPlayer, PlayerStatistics> pv : playerRating) {
if (pv.getValue().getOutcome().hasWon()) {

View File

@@ -22,6 +22,7 @@ import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.card.Card;
import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventGameFinished;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
@@ -32,13 +33,7 @@ import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref;
import forge.util.MyRandom;
/**
* TODO: Write javadoc for this type.
*
*/
public class Match {
private final List<RegisteredPlayer> players;
private final GameType gameType;
@@ -50,31 +45,19 @@ public class Match {
private final List<GameOutcome> gamesPlayed = new ArrayList<GameOutcome>();
private final List<GameOutcome> gamesPlayedRo;
/**
* This should become constructor once.
*/
public Match(GameType type, List<RegisteredPlayer> players0, int games) {
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
players = Collections.unmodifiableList(Lists.newArrayList(players0));
gameType = type;
gamesPerMatch = games;
gamesToWinMatch = (int)Math.ceil((gamesPerMatch+1)/2);
}
public Match(GameType type, List<RegisteredPlayer> players0) {
this(type,players0,3);
}
public Match(GameType type, List<RegisteredPlayer> players0, Boolean overrideAnte) {
this(type, players0);
if( overrideAnte != null )
this.useAnte = overrideAnte.booleanValue();
this(type, players0, null, 3);
}
public Match(GameType type, List<RegisteredPlayer> players0, Boolean overrideAnte, int games) {
this(type, players0, games);
if( overrideAnte != null )
gameType = type;
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
players = Collections.unmodifiableList(Lists.newArrayList(players0));
gamesPerMatch = games;
gamesToWinMatch = (int)Math.ceil((gamesPerMatch+1)/2);
if( overrideAnte != null )
this.useAnte = overrideAnte.booleanValue();
}
@@ -124,14 +107,14 @@ public class Match {
game.getAction().invoke(new Runnable() {
@Override
public void run() {
newGame(game, canRandomFoil);
prepareAllZones(game, canRandomFoil);
if (useAnte) { // Deciding which cards go to ante
Multimap<Player, Card> list = game.chooseCardsForAnte();
for(Entry<Player, Card> kv : list.entries()) {
Player p = kv.getKey();
p.getGame().getAction().moveTo(ZoneType.Ante, kv.getValue());
p.getGame().getGameLog().add(GameLogEntryType.ANTE, p + " anted " + kv.getValue());
game.getAction().moveTo(ZoneType.Ante, kv.getValue());
game.getGameLog().add(GameLogEntryType.ANTE, p + " anted " + kv.getValue());
}
game.fireEvent(new GameEventAnteCardsSelected(list));
}
@@ -139,6 +122,14 @@ public class Match {
GameOutcome lastOutcome = gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1);
game.getAction().startGame(lastOutcome);
if (useAnte) {
executeAnte(game);
}
// will pull UI dialog, when the UI is listening
game.fireEvent(new GameEventGameFinished());
if( null != latch )
latch.countDown();
}
@@ -261,15 +252,7 @@ public class Match {
library.setCards(newLibrary);
}
/**
* Constructor for new game allowing card lists to be put into play
* immediately, and life totals to be adjusted, for computer and human.
*
* TODO: Accept something like match state as parameter. Match should be aware of players,
* their decks and other special starting conditions.
* @param forceAnte Forces ante on or off no matter what your preferences
*/
private void newGame(final Game game, final boolean canRandomFoil) {
private void prepareAllZones(final Game game, final boolean canRandomFoil) {
// need this code here, otherwise observables fail
Trigger.resetIDs();
game.getTriggerHandler().clearDelayedTrigger();
@@ -290,13 +273,24 @@ public class Match {
player.initVariantsZones(psc);
if (canSideBoard) {
Deck sideboarded = player.getController().sideboard(psc.getCurrentDeck(), gameType);
psc.setCurrentDeck(sideboarded);
} else {
psc.restoreOriginalDeck();
Deck toChange = psc.getDeck();
List<PaperCard> newMain = player.getController().sideboard(toChange, gameType);
if( null != newMain ) {
CardPool allCards = new CardPool();
allCards.addAll(toChange.get(DeckSection.Main));
allCards.addAll(toChange.get(DeckSection.Sideboard));
for(PaperCard c : newMain)
allCards.remove(c);
toChange.getMain().clear();
toChange.getMain().add(newMain);
toChange.get(DeckSection.Sideboard).clear();
toChange.get(DeckSection.Sideboard).addAll(allCards);
}
}
Deck myDeck = psc.getCurrentDeck();
boolean hasSideboard = myDeck.has(DeckSection.Sideboard);
Deck myDeck = psc.getDeck();
Set<PaperCard> myRemovedAnteCards = null;
if( useAnte ) {
@@ -312,7 +306,7 @@ public class Match {
Random generator = MyRandom.getRandom();
preparePlayerLibrary(player, ZoneType.Library, myDeck.getMain(), canRandomFoil, generator);
if(hasSideboard)
if(myDeck.has(DeckSection.Sideboard))
preparePlayerLibrary(player, ZoneType.Sideboard, myDeck.get(DeckSection.Sideboard), canRandomFoil, generator);
player.shuffle(null);
@@ -336,4 +330,51 @@ public class Match {
game.getAction().revealAnte("These ante cards were removed:", removedAnteCards);
}
}
private void executeAnte(Game lastGame) {
GameOutcome outcome = lastGame.getOutcome();
if (outcome.isDraw())
return;
// remove all the lost cards from owners' decks
List<PaperCard> losses = new ArrayList<PaperCard>();
int cntPlayers = players.size();
int iWinner = -1;
for (int i = 0; i < cntPlayers; i++ ) {
Player fromGame = lastGame.getRegisteredPlayers().get(i);
if( !fromGame.hasLost()) {
iWinner = i;
continue; // not a loser
}
Deck losersDeck = players.get(i).getDeck();
List<PaperCard> peronalLosses = new ArrayList<>();
for (Card c : fromGame.getCardsIn(ZoneType.Ante)) {
PaperCard toRemove = (PaperCard) c.getPaperCard();
// this could miss the cards by returning instances that are not equal to cards found in deck
// (but only if the card has multiple prints in a set)
losersDeck.getMain().remove(toRemove);
peronalLosses.add(toRemove);
losses.add(toRemove);
}
outcome.anteResult.put(fromGame, GameOutcome.AnteResult.lost(peronalLosses));
}
if (iWinner >= 0 ) {
Player fromGame = lastGame.getRegisteredPlayers().get(iWinner);
outcome.anteResult.put(fromGame, GameOutcome.AnteResult.won(losses));
List<PaperCard> chosen = fromGame.getController().chooseCardsYouWonToAddToDeck(losses); // "Select cards to add to your deck",
if (null != chosen) {
Deck deck = players.get(iWinner).getDeck();
for (PaperCard c : chosen) {
deck.getMain().add(c);
}
}
}
}
}

View File

@@ -115,7 +115,8 @@ public abstract class PlayerController {
public abstract void playSpellAbilityForFree(SpellAbility copySA, boolean mayChoseNewTargets);
public abstract void playSpellAbilityNoStack(SpellAbility effectSA, boolean mayChoseNewTargets);
public abstract Deck sideboard(final Deck deck, GameType gameType);
public abstract List<PaperCard> sideboard(final Deck deck, GameType gameType);
public abstract List<PaperCard> chooseCardsYouWonToAddToDeck(List<PaperCard> losses);
public abstract Map<Card, Integer> assignCombatDamage(Card attacker, List<Card> blockers, int damageDealt, GameEntity defender, boolean overrideOrder);
@@ -214,4 +215,6 @@ public abstract class PlayerController {
public Collection<? extends PaperCard> complainCardsCantPlayWell(Deck myDeck) { return null; }
}

View File

@@ -103,9 +103,9 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public Deck sideboard(Deck deck, GameType gameType) {
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
// AI does not know how to sideboard
return deck;
return null;
}
@Override
@@ -694,4 +694,10 @@ public class PlayerControllerAi extends PlayerController {
return Iterables.getFirst(c.getShield(), null);
}
@Override
public List<PaperCard> chooseCardsYouWonToAddToDeck(List<PaperCard> losses) {
// TODO AI takes all by default
return losses;
}
}

View File

@@ -12,7 +12,6 @@ import forge.item.IPaperCard;
public class RegisteredPlayer {
private final Deck originalDeck;
private Deck currentDeck;
private static final Iterable<PaperCard> EmptyList = Collections.unmodifiableList(new ArrayList<PaperCard>());
@@ -27,23 +26,14 @@ public class RegisteredPlayer {
private PaperCard commander = null;
private int teamNumber = -1; // members of teams with negative id will play FFA.
public RegisteredPlayer(Deck deck0) {
private RegisteredPlayer(Deck deck0) {
originalDeck = deck0;
currentDeck = originalDeck;
}
public final Deck getOriginalDeck() {
public final Deck getDeck() {
return originalDeck;
}
public final Deck getCurrentDeck() {
return currentDeck;
}
public void setCurrentDeck(Deck currentDeck0) {
this.currentDeck = currentDeck0;
}
public final int getStartingLife() {
return startingLife;
}
@@ -99,13 +89,6 @@ public class RegisteredPlayer {
return schemes == null ? EmptyList : schemes;
}
/**
* TODO: Write javadoc for this method.
*/
public void restoreOriginalDeck() {
currentDeck = originalDeck;
}
/**
* @return the planes
*/
@@ -122,7 +105,13 @@ public class RegisteredPlayer {
}
// Copies the deck so that antes cannot change the original 'constructed' (or event) deck
public static RegisteredPlayer fromDeck(final Deck deck) {
return new RegisteredPlayer((Deck)deck.copyTo(deck.getName()));
}
// Should be used for quests when deck changes are to persist after match is over
public static RegisteredPlayer fromDeckMutable(final Deck deck) {
return new RegisteredPlayer(deck);
}

View File

@@ -240,7 +240,12 @@ public final class GuiDisplayUtil {
* @since 1.0.15
*/
public static void devModeTutor() {
final List<Card> lib = getGame().getPhaseHandler().getPriorityPlayer().getCardsIn(ZoneType.Library);
Player pPriority = getGame().getPhaseHandler().getPriorityPlayer();
if(pPriority == null) {
GuiDialog.message("No player has priority now, can't tutor from their deck at the moment");
return;
}
final List<Card> lib = pPriority.getCardsIn(ZoneType.Library);
final Card c = GuiChoose.oneOrNone("Choose a card", lib);
if (null == c)
return;

View File

@@ -257,7 +257,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
// Special branch for quest events
if (getLstDecks().getName().equals(DeckgenUtil.DeckTypes.QUESTEVENTS.toString())) {
QuestEvent event = DeckgenUtil.getQuestEvent(getLstDecks().getSelectedValuesList().get(0));
RegisteredPlayer result = new RegisteredPlayer(event.getEventDeck());
RegisteredPlayer result = RegisteredPlayer.fromDeck(event.getEventDeck());
if( event instanceof QuestEventChallenge ) {
result.setStartingLife(((QuestEventChallenge) event).getAiLife());
}

View File

@@ -115,7 +115,7 @@ public enum CSubmenuGauntletBuild implements ICDoc {
private void addDeck() {
final Deck deckToAdd = view.getLstLeft().getPlayer().getOriginalDeck();
final Deck deckToAdd = view.getLstLeft().getPlayer().getDeck();
if ( null == deckToAdd ) return;
workingDecks.add(deckToAdd);
view.getLblSave().setVisible(false);

View File

@@ -102,7 +102,7 @@ public enum CSubmenuGauntletContests implements ICDoc {
userDeck = gd.getUserDeck();
}
else {
userDeck = view.getLstDecks().getPlayer().getOriginalDeck();
userDeck = view.getLstDecks().getPlayer().getDeck();
gd.setUserDeck(userDeck);
}

View File

@@ -97,7 +97,7 @@ public enum CSubmenuGauntletQuick implements ICDoc {
Singletons.getModel().getGauntletData().setName(GauntletIO.PREFIX_QUICK + num);
// Pull user deck
final Deck userDeck = view.getLstDecks().getPlayer().getOriginalDeck();
final Deck userDeck = view.getLstDecks().getPlayer().getDeck();
// Generate gauntlet decks
final int numOpponents = view.getSliOpponents().getValue();

View File

@@ -433,8 +433,8 @@ public class SSubmenuQuestUtil {
forceAnte = qc.isForceAnte();
}
RegisteredPlayer humanStart = new RegisteredPlayer(deck);
RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck());
RegisteredPlayer humanStart = RegisteredPlayer.fromDeckMutable(deck);
RegisteredPlayer aiStart = RegisteredPlayer.fromDeck(event.getEventDeck());
if (lifeHuman != null) {
humanStart.setStartingLife(lifeHuman);

View File

@@ -108,7 +108,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
for(int i=0;i<view.getNumPlayers();i++) {
String errMsg = gameType.getDecksFormat().getDeckConformanceProblem(view.getDeckChooser(i).getPlayer().getOriginalDeck());
String errMsg = gameType.getDecksFormat().getDeckConformanceProblem(view.getDeckChooser(i).getPlayer().getDeck());
if (null != errMsg) {
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Player " + i + "'s deck " + errMsg, "Invalid deck", JOptionPane.ERROR_MESSAGE);
return;

View File

@@ -169,7 +169,7 @@ public enum CSubmenuArchenemy implements ICDoc {
GuiDialog.message("No deck selected for player " + (i + 1));
return;
}
playerDecks.add(d.getOriginalDeck());
playerDecks.add(d.getDeck());
}
List<PaperCard> schemes = null;

View File

@@ -167,7 +167,7 @@ public enum CSubmenuPlanechase implements ICDoc {
GuiDialog.message("No deck selected for player " + (i + 1));
return;
}
playerDecks.add(d.getOriginalDeck());
playerDecks.add(d.getDeck());
List<PaperCard> planes = null;

View File

@@ -129,7 +129,7 @@ public enum CSubmenuVanguard implements ICDoc {
GuiDialog.message("No deck selected for player " + (i + 1));
return;
}
playerDecks.add(d.getOriginalDeck());
playerDecks.add(d.getDeck());
}
List<PaperCard> playerAvatars = new ArrayList<PaperCard>();

View File

@@ -2,27 +2,13 @@ package forge.gui.match;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import forge.Singletons;
import forge.deck.Deck;
import forge.game.Game;
import forge.game.GameOutcome;
import forge.game.GameType;
import forge.game.Match;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
import forge.game.zone.ZoneType;
import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils;
import forge.gui.framework.FScreen;
import forge.item.PaperCard;
import forge.net.FServer;
import forge.properties.ForgePreferences.FPref;
/**
* Default controller for a ViewWinLose object. This class can
@@ -72,12 +58,6 @@ public class ControlWinLose {
SOverlayUtils.hideOverlay();
saveOptions();
boolean isAnte = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE);
//This is called from QuestWinLose also. If we're in a quest, this is already handled elsewhere
if (isAnte && lastGame.getType() != GameType.Quest) {
executeAnte();
}
Singletons.getControl().endCurrentGame();
Singletons.getControl().startGameWithUi(lastGame.getMatch());
}
@@ -110,62 +90,6 @@ public class ControlWinLose {
Singletons.getModel().getPreferences().save();
}
/**
* TODO: Write javadoc for this method.
* @param hDeck
* @param cDeck
*/
private void executeAnte() {
final Match match = lastGame.getMatch();
List<GameOutcome> games = match.getPlayedGames();
if (games.isEmpty()) {
return;
}
// remove all the lost cards from owners' decks
List<PaperCard> losses = new ArrayList<PaperCard>();
int cntPlayers = match.getPlayers().size();
for (int i = 0; i < cntPlayers; i++ ) {
Player fromGame = lastGame.getRegisteredPlayers().get(i);
if( !fromGame.hasLost()) continue; // not a loser
List<Card> compAntes = new ArrayList<Card>(fromGame.getCardsIn(ZoneType.Ante));
RegisteredPlayer psc = match.getPlayers().get(i);
Deck cDeck = psc.getCurrentDeck();
Deck oDeck = psc.getOriginalDeck();
for (Card c : compAntes) {
PaperCard toRemove = (PaperCard) c.getPaperCard();
cDeck.getMain().remove(toRemove);
if ( cDeck != oDeck )
oDeck.getMain().remove(toRemove);
losses.add(toRemove);
}
}
for (int i = 0; i < cntPlayers; i++ ) {
Player fromGame = lastGame.getRegisteredPlayers().get(i);
if( !fromGame.hasWon()) continue;
// offer to winner, if he is local human
if (fromGame.getController().getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer()) {
List<PaperCard> chosen = GuiChoose.noneOrMany("Select cards to add to your deck", losses);
if (null != chosen) {
RegisteredPlayer psc = match.getPlayers().get(i);
Deck cDeck = psc.getCurrentDeck();
//Deck oDeck = psc.getOriginalDeck();
for (PaperCard c : chosen) {
cDeck.getMain().add(c);
//oDeck.getMain().add(c);
}
}
}
}
}
/**
* <p>
* populateCustomPanel.

View File

@@ -139,7 +139,7 @@ public enum CDock implements ICDoc {
*/
public void viewDeckList() {
showDeck(game.getMatch().getPlayers().get(0).getCurrentDeck());
showDeck(game.getMatch().getPlayers().get(0).getDeck());
}
/**

View File

@@ -182,7 +182,7 @@ public class PlayerControllerHuman extends PlayerController {
* @see forge.game.player.PlayerController#sideboard(forge.deck.Deck)
*/
@Override
public Deck sideboard(Deck deck, GameType gameType) {
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
CardPool sideboard = deck.get(DeckSection.Sideboard);
if (sideboard == null) {
// Use an empty cardpool instead of null for 75/0 sideboarding scenario.
@@ -191,7 +191,7 @@ public class PlayerControllerHuman extends PlayerController {
CardPool main = deck.get(DeckSection.Main);
boolean conform = Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
int mainSize = main.countAll();
int sbSize = sideboard.countAll();
int combinedDeckSize = mainSize + sbSize;
@@ -201,14 +201,15 @@ public class PlayerControllerHuman extends PlayerController {
// Limited doesn't have a sideboard max, so let the Main min take care of things.
int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximum();
CardPool newSb = new CardPool();
List<PaperCard> newMain = null;
if (sbSize == 0 && mainSize == deckMinSize) {
// Skip sideboard loop if there are no sideboarding opportunities
newMain = main.toFlatList();
return null;
}
else {
// conformance should not be checked here
boolean conform = Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
do {
if (newMain != null) {
if (newMain.size() < deckMinSize) {
@@ -225,20 +226,7 @@ public class PlayerControllerHuman extends PlayerController {
newMain = GuiChoose.sideboard(sideboard.toFlatList(), main.toFlatList());
} while (conform && (newMain.size() < deckMinSize || combinedDeckSize - newMain.size() > sbMax));
}
newSb.clear();
newSb.addAll(main);
newSb.addAll(sideboard);
for (PaperCard c : newMain) {
newSb.remove(c);
}
Deck res = (Deck)deck.copyTo(deck.getName());
res.getMain().clear();
res.getMain().add(newMain);
CardPool resSb = res.getOrCreate(DeckSection.Sideboard);
resSb.clear();
resSb.addAll(newSb);
return res;
return newMain;
}
/* (non-Javadoc)
@@ -1076,4 +1064,9 @@ public class PlayerControllerHuman extends PlayerController {
}
return GuiChoose.one("Choose a regeneration shield:", c.getShield());
}
@Override
public List<PaperCard> chooseCardsYouWonToAddToDeck(List<PaperCard> losses) {
return GuiChoose.many("Select cards to add to your deck", "Add these to my deck", 0, losses.size(), losses, null);
}
}

View File

@@ -144,7 +144,7 @@ public class GauntletMini {
aiOpponents.clear();
for (int i = 0; i < Math.min(gameRounds, aiDecks.size()); i++) {
aiOpponents.add(new RegisteredPlayer(aiDecks.get(i)));
aiOpponents.add(RegisteredPlayer.fromDeck(aiDecks.get(i)));
}
resetCurrentRound();

View File

@@ -61,7 +61,7 @@ public class GameWrapper {
public void runGame() {
List<RegisteredPlayer> registeredPlayers = new ArrayList<RegisteredPlayer>();
for( PlayerSpecification player : players ) {
RegisteredPlayer registeredPlayer = new RegisteredPlayer( new Deck( player.getName() ) );
RegisteredPlayer registeredPlayer = RegisteredPlayer.fromDeck(new Deck(player.getName()));
LobbyPlayerForTests lobbyPlayer = new LobbyPlayerForTests( player.getName(), playerActions );
registeredPlayer.setPlayer( lobbyPlayer );
registeredPlayers.add( registeredPlayer );

View File

@@ -116,8 +116,8 @@ public class PlayerControllerForTests extends PlayerController {
}
@Override
public Deck sideboard(Deck deck, GameType gameType) {
return deck;
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
return null; // refused to side
}
@Override
@@ -550,4 +550,10 @@ public class PlayerControllerForTests extends PlayerController {
public CardShields chooseRegenerationShield(Card c) {
return Iterables.getFirst(c.getShield(), null);
}
@Override
public List<PaperCard> chooseCardsYouWonToAddToDeck(List<PaperCard> losses) {
// TODO Auto-generated method stub
return losses;
}
}