diff --git a/forge-gui/src/main/java/forge/game/GameAction.java b/forge-gui/src/main/java/forge/game/GameAction.java index ce6e1c16660..8cdcc72c958 100644 --- a/forge-gui/src/main/java/forge/game/GameAction.java +++ b/forge-gui/src/main/java/forge/game/GameAction.java @@ -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) { diff --git a/forge-gui/src/main/java/forge/game/GameOutcome.java b/forge-gui/src/main/java/forge/game/GameOutcome.java index 382900b8902..b6e78906d16 100644 --- a/forge-gui/src/main/java/forge/game/GameOutcome.java +++ b/forge-gui/src/main/java/forge/game/GameOutcome.java @@ -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; /** *

@@ -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> { + public static class AnteResult { + public final List cards; + public final boolean hasWon; + + private AnteResult(List cards, boolean won) { + this.cards = cards; + hasWon = won; + } + + public static AnteResult won(List cards) { return new AnteResult(cards, true); } + public static AnteResult lost(List cards) { return new AnteResult(cards, true); } + } - /** The player got first turn. */ - // private String playerGotFirstTurn = "Nobody"; - - /** The last turn number. */ private int lastTurnNumber = 0; - - /** The player rating. */ private final List> playerRating = new ArrayList>(2); - private final Iterable players; - + public final Map anteResult = new TreeMap<>(); private GameEndReason winCondition; public GameOutcome(GameEndReason reason, final Iterable list) { @@ -64,6 +72,8 @@ public final class GameOutcome implements Iterable pv : playerRating) { diff --git a/forge-gui/src/main/java/forge/game/Match.java b/forge-gui/src/main/java/forge/game/Match.java index 1107c082fc1..d5946eefd55 100644 --- a/forge-gui/src/main/java/forge/game/Match.java +++ b/forge-gui/src/main/java/forge/game/Match.java @@ -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 players; private final GameType gameType; @@ -50,31 +45,19 @@ public class Match { private final List gamesPlayed = new ArrayList(); private final List gamesPlayedRo; - /** - * This should become constructor once. - */ - public Match(GameType type, List 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 players0) { - this(type,players0,3); - } - - public Match(GameType type, List players0, Boolean overrideAnte) { - this(type, players0); - if( overrideAnte != null ) - this.useAnte = overrideAnte.booleanValue(); + this(type, players0, null, 3); } public Match(GameType type, List 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 list = game.chooseCardsForAnte(); for(Entry 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 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 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 losses = new ArrayList(); + 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 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 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); + } + } + } + + } + } diff --git a/forge-gui/src/main/java/forge/game/player/PlayerController.java b/forge-gui/src/main/java/forge/game/player/PlayerController.java index 369e69b81fb..1edaecdcd4b 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerController.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerController.java @@ -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 sideboard(final Deck deck, GameType gameType); + public abstract List chooseCardsYouWonToAddToDeck(List losses); public abstract Map assignCombatDamage(Card attacker, List blockers, int damageDealt, GameEntity defender, boolean overrideOrder); @@ -214,4 +215,6 @@ public abstract class PlayerController { public Collection complainCardsCantPlayWell(Deck myDeck) { return null; } + + } diff --git a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java index d361fbadca9..443353f5948 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java @@ -103,9 +103,9 @@ public class PlayerControllerAi extends PlayerController { } @Override - public Deck sideboard(Deck deck, GameType gameType) { + public List 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 chooseCardsYouWonToAddToDeck(List losses) { + // TODO AI takes all by default + return losses; + } + } diff --git a/forge-gui/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-gui/src/main/java/forge/game/player/RegisteredPlayer.java index d18c9ef2179..c342b575fd3 100644 --- a/forge-gui/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-gui/src/main/java/forge/game/player/RegisteredPlayer.java @@ -12,7 +12,6 @@ import forge.item.IPaperCard; public class RegisteredPlayer { private final Deck originalDeck; - private Deck currentDeck; private static final Iterable EmptyList = Collections.unmodifiableList(new ArrayList()); @@ -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 */ @@ -121,11 +104,17 @@ public class RegisteredPlayer { this.teamNumber = teamNumber0; } - + + // 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); + 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); + } + public static RegisteredPlayer forVanguard(final Deck deck, final PaperCard avatar) { RegisteredPlayer start = fromDeck(deck); start.setStartingLife(start.getStartingLife() + avatar.getRules().getLife()); diff --git a/forge-gui/src/main/java/forge/gui/GuiDisplayUtil.java b/forge-gui/src/main/java/forge/gui/GuiDisplayUtil.java index b69fdb0ad0a..396b78ce3f2 100644 --- a/forge-gui/src/main/java/forge/gui/GuiDisplayUtil.java +++ b/forge-gui/src/main/java/forge/gui/GuiDisplayUtil.java @@ -240,7 +240,12 @@ public final class GuiDisplayUtil { * @since 1.0.15 */ public static void devModeTutor() { - final List 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 lib = pPriority.getCardsIn(ZoneType.Library); final Card c = GuiChoose.oneOrNone("Choose a card", lib); if (null == c) return; diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java index e40d3132a29..f2c7f7d5fc3 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -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()); } diff --git a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java index f7d5beb1935..cc0ebd91729 100644 --- a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java +++ b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java @@ -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); diff --git a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java index 1c036e58268..13f22208cbf 100644 --- a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java +++ b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java @@ -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); } diff --git a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index b0857953b5f..0092fe57fcd 100644 --- a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -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(); diff --git a/forge-gui/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/forge-gui/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java index dbde8949173..d7f60ed64f1 100644 --- a/forge-gui/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java +++ b/forge-gui/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java @@ -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); diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index 8317692dc27..529505873e6 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -108,7 +108,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { for(int i=0;i schemes = null; diff --git a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java index 3df4e649703..338f5488570 100644 --- a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java +++ b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java @@ -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 planes = null; diff --git a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java index 73ef51af2dc..b146424bef6 100644 --- a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java +++ b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java @@ -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 playerAvatars = new ArrayList(); diff --git a/forge-gui/src/main/java/forge/gui/match/ControlWinLose.java b/forge-gui/src/main/java/forge/gui/match/ControlWinLose.java index 8298f289386..c425c919467 100644 --- a/forge-gui/src/main/java/forge/gui/match/ControlWinLose.java +++ b/forge-gui/src/main/java/forge/gui/match/ControlWinLose.java @@ -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 games = match.getPlayedGames(); - - if (games.isEmpty()) { - return; - } - - // remove all the lost cards from owners' decks - List losses = new ArrayList(); - int cntPlayers = match.getPlayers().size(); - for (int i = 0; i < cntPlayers; i++ ) { - Player fromGame = lastGame.getRegisteredPlayers().get(i); - if( !fromGame.hasLost()) continue; // not a loser - - - List compAntes = new ArrayList(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 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); - } - } - } - } - - } - /** *

* populateCustomPanel. diff --git a/forge-gui/src/main/java/forge/gui/match/controllers/CDock.java b/forge-gui/src/main/java/forge/gui/match/controllers/CDock.java index 6bfbfe98c9b..41b681ee9eb 100644 --- a/forge-gui/src/main/java/forge/gui/match/controllers/CDock.java +++ b/forge-gui/src/main/java/forge/gui/match/controllers/CDock.java @@ -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()); } /** diff --git a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java index 293e5a50866..2cb2c1e2bdd 100644 --- a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java @@ -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 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 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 chooseCardsYouWonToAddToDeck(List losses) { + return GuiChoose.many("Select cards to add to your deck", "Add these to my deck", 0, losses.size(), losses, null); + } } diff --git a/forge-gui/src/main/java/forge/limited/GauntletMini.java b/forge-gui/src/main/java/forge/limited/GauntletMini.java index 593df2f9eb0..375752a7617 100644 --- a/forge-gui/src/main/java/forge/limited/GauntletMini.java +++ b/forge-gui/src/main/java/forge/limited/GauntletMini.java @@ -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(); diff --git a/forge-gui/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 11b4b481613..2f7738f7bfa 100644 --- a/forge-gui/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -61,7 +61,7 @@ public class GameWrapper { public void runGame() { List registeredPlayers = new ArrayList(); 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 ); diff --git a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index e793b550cfc..450fca739e0 100644 --- a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -116,8 +116,8 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public Deck sideboard(Deck deck, GameType gameType) { - return deck; + public List 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 chooseCardsYouWonToAddToDeck(List losses) { + // TODO Auto-generated method stub + return losses; + } }