mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
changed how ante works
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
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 player got first turn. */
|
||||
// private String playerGotFirstTurn = "Nobody";
|
||||
|
||||
/** 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) {
|
||||
@@ -64,6 +72,8 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
|
||||
this.playerRating.add(Pair.of(n.getLobbyPlayer(), n.getStats()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean isDraw() {
|
||||
for (Pair<LobbyPlayer, PlayerStatistics> pv : playerRating) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user