mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +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.GameEventCardRegenerated;
|
||||||
import forge.game.event.GameEventCardSacrificed;
|
import forge.game.event.GameEventCardSacrificed;
|
||||||
import forge.game.event.GameEventCardStatsChanged;
|
import forge.game.event.GameEventCardStatsChanged;
|
||||||
import forge.game.event.GameEventGameFinished;
|
|
||||||
import forge.game.event.GameEventFlipCoin;
|
import forge.game.event.GameEventFlipCoin;
|
||||||
import forge.game.event.GameEventGameStarted;
|
import forge.game.event.GameEventGameStarted;
|
||||||
import forge.game.player.GameLossReason;
|
import forge.game.player.GameLossReason;
|
||||||
@@ -1502,9 +1501,6 @@ public class GameAction {
|
|||||||
|
|
||||||
first = game.getPhaseHandler().getPlayerTurn(); // needed only for restart
|
first = game.getPhaseHandler().getPlayerTurn(); // needed only for restart
|
||||||
} while (game.getAge() == GameStage.RestartedByKarn);
|
} while (game.getAge() == GameStage.RestartedByKarn);
|
||||||
|
|
||||||
// will pull UI dialog, when the UI is listening
|
|
||||||
game.fireEvent(new GameEventGameFinished());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Player determineFirstTurnPlayer(final GameOutcome lastGameOutcome) {
|
private Player determineFirstTurnPlayer(final GameOutcome lastGameOutcome) {
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ package forge.game;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
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.Player;
|
||||||
import forge.game.player.PlayerOutcome;
|
import forge.game.player.PlayerOutcome;
|
||||||
import forge.game.player.PlayerStatistics;
|
import forge.game.player.PlayerStatistics;
|
||||||
|
import forge.item.PaperCard;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -43,18 +46,23 @@ import forge.game.player.PlayerStatistics;
|
|||||||
// GameObserver class - who should be notified of any considerable ingame event
|
// GameObserver class - who should be notified of any considerable ingame event
|
||||||
public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStatistics>> {
|
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 AnteResult(List<PaperCard> cards, boolean won) {
|
||||||
// private String playerGotFirstTurn = "Nobody";
|
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;
|
private int lastTurnNumber = 0;
|
||||||
|
|
||||||
/** The player rating. */
|
|
||||||
private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2);
|
private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2);
|
||||||
|
|
||||||
private final Iterable<Player> players;
|
private final Iterable<Player> players;
|
||||||
|
public final Map<Player, AnteResult> anteResult = new TreeMap<>();
|
||||||
private GameEndReason winCondition;
|
private GameEndReason winCondition;
|
||||||
|
|
||||||
public GameOutcome(GameEndReason reason, final Iterable<Player> list) {
|
public GameOutcome(GameEndReason reason, final Iterable<Player> list) {
|
||||||
@@ -65,6 +73,8 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isDraw() {
|
public boolean isDraw() {
|
||||||
for (Pair<LobbyPlayer, PlayerStatistics> pv : playerRating) {
|
for (Pair<LobbyPlayer, PlayerStatistics> pv : playerRating) {
|
||||||
if (pv.getValue().getOutcome().hasWon()) {
|
if (pv.getValue().getOutcome().hasWon()) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import forge.deck.Deck;
|
|||||||
import forge.deck.DeckSection;
|
import forge.deck.DeckSection;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.event.GameEventAnteCardsSelected;
|
import forge.game.event.GameEventAnteCardsSelected;
|
||||||
|
import forge.game.event.GameEventGameFinished;
|
||||||
import forge.game.player.LobbyPlayer;
|
import forge.game.player.LobbyPlayer;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
@@ -32,13 +33,7 @@ import forge.item.PaperCard;
|
|||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.util.MyRandom;
|
import forge.util.MyRandom;
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class Match {
|
public class Match {
|
||||||
|
|
||||||
private final List<RegisteredPlayer> players;
|
private final List<RegisteredPlayer> players;
|
||||||
private final GameType gameType;
|
private final GameType gameType;
|
||||||
|
|
||||||
@@ -50,31 +45,19 @@ public class Match {
|
|||||||
private final List<GameOutcome> gamesPlayed = new ArrayList<GameOutcome>();
|
private final List<GameOutcome> gamesPlayed = new ArrayList<GameOutcome>();
|
||||||
private final List<GameOutcome> gamesPlayedRo;
|
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) {
|
public Match(GameType type, List<RegisteredPlayer> players0) {
|
||||||
this(type,players0,3);
|
this(type, players0, null, 3);
|
||||||
}
|
|
||||||
|
|
||||||
public Match(GameType type, List<RegisteredPlayer> players0, Boolean overrideAnte) {
|
|
||||||
this(type, players0);
|
|
||||||
if( overrideAnte != null )
|
|
||||||
this.useAnte = overrideAnte.booleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Match(GameType type, List<RegisteredPlayer> players0, Boolean overrideAnte, int games) {
|
public Match(GameType type, List<RegisteredPlayer> players0, Boolean overrideAnte, int games) {
|
||||||
this(type, players0, games);
|
gameType = type;
|
||||||
if( overrideAnte != null )
|
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();
|
this.useAnte = overrideAnte.booleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,14 +107,14 @@ public class Match {
|
|||||||
game.getAction().invoke(new Runnable() {
|
game.getAction().invoke(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
newGame(game, canRandomFoil);
|
prepareAllZones(game, canRandomFoil);
|
||||||
|
|
||||||
if (useAnte) { // Deciding which cards go to ante
|
if (useAnte) { // Deciding which cards go to ante
|
||||||
Multimap<Player, Card> list = game.chooseCardsForAnte();
|
Multimap<Player, Card> list = game.chooseCardsForAnte();
|
||||||
for(Entry<Player, Card> kv : list.entries()) {
|
for(Entry<Player, Card> kv : list.entries()) {
|
||||||
Player p = kv.getKey();
|
Player p = kv.getKey();
|
||||||
p.getGame().getAction().moveTo(ZoneType.Ante, kv.getValue());
|
game.getAction().moveTo(ZoneType.Ante, kv.getValue());
|
||||||
p.getGame().getGameLog().add(GameLogEntryType.ANTE, p + " anted " + kv.getValue());
|
game.getGameLog().add(GameLogEntryType.ANTE, p + " anted " + kv.getValue());
|
||||||
}
|
}
|
||||||
game.fireEvent(new GameEventAnteCardsSelected(list));
|
game.fireEvent(new GameEventAnteCardsSelected(list));
|
||||||
}
|
}
|
||||||
@@ -139,6 +122,14 @@ public class Match {
|
|||||||
GameOutcome lastOutcome = gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1);
|
GameOutcome lastOutcome = gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1);
|
||||||
game.getAction().startGame(lastOutcome);
|
game.getAction().startGame(lastOutcome);
|
||||||
|
|
||||||
|
if (useAnte) {
|
||||||
|
executeAnte(game);
|
||||||
|
}
|
||||||
|
|
||||||
|
// will pull UI dialog, when the UI is listening
|
||||||
|
game.fireEvent(new GameEventGameFinished());
|
||||||
|
|
||||||
|
|
||||||
if( null != latch )
|
if( null != latch )
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
}
|
}
|
||||||
@@ -261,15 +252,7 @@ public class Match {
|
|||||||
library.setCards(newLibrary);
|
library.setCards(newLibrary);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private void prepareAllZones(final Game game, final boolean canRandomFoil) {
|
||||||
* 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) {
|
|
||||||
// need this code here, otherwise observables fail
|
// need this code here, otherwise observables fail
|
||||||
Trigger.resetIDs();
|
Trigger.resetIDs();
|
||||||
game.getTriggerHandler().clearDelayedTrigger();
|
game.getTriggerHandler().clearDelayedTrigger();
|
||||||
@@ -290,13 +273,24 @@ public class Match {
|
|||||||
player.initVariantsZones(psc);
|
player.initVariantsZones(psc);
|
||||||
|
|
||||||
if (canSideBoard) {
|
if (canSideBoard) {
|
||||||
Deck sideboarded = player.getController().sideboard(psc.getCurrentDeck(), gameType);
|
Deck toChange = psc.getDeck();
|
||||||
psc.setCurrentDeck(sideboarded);
|
List<PaperCard> newMain = player.getController().sideboard(toChange, gameType);
|
||||||
} else {
|
if( null != newMain ) {
|
||||||
psc.restoreOriginalDeck();
|
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;
|
Set<PaperCard> myRemovedAnteCards = null;
|
||||||
if( useAnte ) {
|
if( useAnte ) {
|
||||||
@@ -312,7 +306,7 @@ public class Match {
|
|||||||
Random generator = MyRandom.getRandom();
|
Random generator = MyRandom.getRandom();
|
||||||
|
|
||||||
preparePlayerLibrary(player, ZoneType.Library, myDeck.getMain(), canRandomFoil, generator);
|
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);
|
preparePlayerLibrary(player, ZoneType.Sideboard, myDeck.get(DeckSection.Sideboard), canRandomFoil, generator);
|
||||||
|
|
||||||
player.shuffle(null);
|
player.shuffle(null);
|
||||||
@@ -336,4 +330,51 @@ public class Match {
|
|||||||
game.getAction().revealAnte("These ante cards were removed:", removedAnteCards);
|
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 playSpellAbilityForFree(SpellAbility copySA, boolean mayChoseNewTargets);
|
||||||
public abstract void playSpellAbilityNoStack(SpellAbility effectSA, 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);
|
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; }
|
public Collection<? extends PaperCard> complainCardsCantPlayWell(Deck myDeck) { return null; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,9 +103,9 @@ public class PlayerControllerAi extends PlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Deck sideboard(Deck deck, GameType gameType) {
|
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
|
||||||
// AI does not know how to sideboard
|
// AI does not know how to sideboard
|
||||||
return deck;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -694,4 +694,10 @@ public class PlayerControllerAi extends PlayerController {
|
|||||||
return Iterables.getFirst(c.getShield(), null);
|
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 {
|
public class RegisteredPlayer {
|
||||||
private final Deck originalDeck;
|
private final Deck originalDeck;
|
||||||
private Deck currentDeck;
|
|
||||||
|
|
||||||
private static final Iterable<PaperCard> EmptyList = Collections.unmodifiableList(new ArrayList<PaperCard>());
|
private static final Iterable<PaperCard> EmptyList = Collections.unmodifiableList(new ArrayList<PaperCard>());
|
||||||
|
|
||||||
@@ -27,23 +26,14 @@ public class RegisteredPlayer {
|
|||||||
private PaperCard commander = null;
|
private PaperCard commander = null;
|
||||||
private int teamNumber = -1; // members of teams with negative id will play FFA.
|
private int teamNumber = -1; // members of teams with negative id will play FFA.
|
||||||
|
|
||||||
public RegisteredPlayer(Deck deck0) {
|
private RegisteredPlayer(Deck deck0) {
|
||||||
originalDeck = deck0;
|
originalDeck = deck0;
|
||||||
currentDeck = originalDeck;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Deck getOriginalDeck() {
|
public final Deck getDeck() {
|
||||||
return originalDeck;
|
return originalDeck;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Deck getCurrentDeck() {
|
|
||||||
return currentDeck;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCurrentDeck(Deck currentDeck0) {
|
|
||||||
this.currentDeck = currentDeck0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getStartingLife() {
|
public final int getStartingLife() {
|
||||||
return startingLife;
|
return startingLife;
|
||||||
}
|
}
|
||||||
@@ -99,13 +89,6 @@ public class RegisteredPlayer {
|
|||||||
return schemes == null ? EmptyList : schemes;
|
return schemes == null ? EmptyList : schemes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this method.
|
|
||||||
*/
|
|
||||||
public void restoreOriginalDeck() {
|
|
||||||
currentDeck = originalDeck;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the planes
|
* @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) {
|
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);
|
return new RegisteredPlayer(deck);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -240,7 +240,12 @@ public final class GuiDisplayUtil {
|
|||||||
* @since 1.0.15
|
* @since 1.0.15
|
||||||
*/
|
*/
|
||||||
public static void devModeTutor() {
|
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);
|
final Card c = GuiChoose.oneOrNone("Choose a card", lib);
|
||||||
if (null == c)
|
if (null == c)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
|||||||
// Special branch for quest events
|
// Special branch for quest events
|
||||||
if (getLstDecks().getName().equals(DeckgenUtil.DeckTypes.QUESTEVENTS.toString())) {
|
if (getLstDecks().getName().equals(DeckgenUtil.DeckTypes.QUESTEVENTS.toString())) {
|
||||||
QuestEvent event = DeckgenUtil.getQuestEvent(getLstDecks().getSelectedValuesList().get(0));
|
QuestEvent event = DeckgenUtil.getQuestEvent(getLstDecks().getSelectedValuesList().get(0));
|
||||||
RegisteredPlayer result = new RegisteredPlayer(event.getEventDeck());
|
RegisteredPlayer result = RegisteredPlayer.fromDeck(event.getEventDeck());
|
||||||
if( event instanceof QuestEventChallenge ) {
|
if( event instanceof QuestEventChallenge ) {
|
||||||
result.setStartingLife(((QuestEventChallenge) event).getAiLife());
|
result.setStartingLife(((QuestEventChallenge) event).getAiLife());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
|||||||
|
|
||||||
|
|
||||||
private void addDeck() {
|
private void addDeck() {
|
||||||
final Deck deckToAdd = view.getLstLeft().getPlayer().getOriginalDeck();
|
final Deck deckToAdd = view.getLstLeft().getPlayer().getDeck();
|
||||||
if ( null == deckToAdd ) return;
|
if ( null == deckToAdd ) return;
|
||||||
workingDecks.add(deckToAdd);
|
workingDecks.add(deckToAdd);
|
||||||
view.getLblSave().setVisible(false);
|
view.getLblSave().setVisible(false);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
|||||||
userDeck = gd.getUserDeck();
|
userDeck = gd.getUserDeck();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
userDeck = view.getLstDecks().getPlayer().getOriginalDeck();
|
userDeck = view.getLstDecks().getPlayer().getDeck();
|
||||||
gd.setUserDeck(userDeck);
|
gd.setUserDeck(userDeck);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
|||||||
Singletons.getModel().getGauntletData().setName(GauntletIO.PREFIX_QUICK + num);
|
Singletons.getModel().getGauntletData().setName(GauntletIO.PREFIX_QUICK + num);
|
||||||
|
|
||||||
// Pull user deck
|
// Pull user deck
|
||||||
final Deck userDeck = view.getLstDecks().getPlayer().getOriginalDeck();
|
final Deck userDeck = view.getLstDecks().getPlayer().getDeck();
|
||||||
|
|
||||||
// Generate gauntlet decks
|
// Generate gauntlet decks
|
||||||
final int numOpponents = view.getSliOpponents().getValue();
|
final int numOpponents = view.getSliOpponents().getValue();
|
||||||
|
|||||||
@@ -433,8 +433,8 @@ public class SSubmenuQuestUtil {
|
|||||||
forceAnte = qc.isForceAnte();
|
forceAnte = qc.isForceAnte();
|
||||||
}
|
}
|
||||||
|
|
||||||
RegisteredPlayer humanStart = new RegisteredPlayer(deck);
|
RegisteredPlayer humanStart = RegisteredPlayer.fromDeckMutable(deck);
|
||||||
RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck());
|
RegisteredPlayer aiStart = RegisteredPlayer.fromDeck(event.getEventDeck());
|
||||||
|
|
||||||
if (lifeHuman != null) {
|
if (lifeHuman != null) {
|
||||||
humanStart.setStartingLife(lifeHuman);
|
humanStart.setStartingLife(lifeHuman);
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
|
|||||||
|
|
||||||
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||||
for(int i=0;i<view.getNumPlayers();i++) {
|
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) {
|
if (null != errMsg) {
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Player " + i + "'s deck " + errMsg, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Player " + i + "'s deck " + errMsg, "Invalid deck", JOptionPane.ERROR_MESSAGE);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ public enum CSubmenuArchenemy implements ICDoc {
|
|||||||
GuiDialog.message("No deck selected for player " + (i + 1));
|
GuiDialog.message("No deck selected for player " + (i + 1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
playerDecks.add(d.getOriginalDeck());
|
playerDecks.add(d.getDeck());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PaperCard> schemes = null;
|
List<PaperCard> schemes = null;
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ public enum CSubmenuPlanechase implements ICDoc {
|
|||||||
GuiDialog.message("No deck selected for player " + (i + 1));
|
GuiDialog.message("No deck selected for player " + (i + 1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
playerDecks.add(d.getOriginalDeck());
|
playerDecks.add(d.getDeck());
|
||||||
|
|
||||||
|
|
||||||
List<PaperCard> planes = null;
|
List<PaperCard> planes = null;
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ public enum CSubmenuVanguard implements ICDoc {
|
|||||||
GuiDialog.message("No deck selected for player " + (i + 1));
|
GuiDialog.message("No deck selected for player " + (i + 1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
playerDecks.add(d.getOriginalDeck());
|
playerDecks.add(d.getDeck());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PaperCard> playerAvatars = new ArrayList<PaperCard>();
|
List<PaperCard> playerAvatars = new ArrayList<PaperCard>();
|
||||||
|
|||||||
@@ -2,27 +2,13 @@ package forge.gui.match;
|
|||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.Deck;
|
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.GameOutcome;
|
|
||||||
import forge.game.GameType;
|
|
||||||
import forge.game.Match;
|
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.SOverlayUtils;
|
||||||
import forge.gui.framework.FScreen;
|
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
|
* Default controller for a ViewWinLose object. This class can
|
||||||
@@ -72,12 +58,6 @@ public class ControlWinLose {
|
|||||||
SOverlayUtils.hideOverlay();
|
SOverlayUtils.hideOverlay();
|
||||||
saveOptions();
|
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().endCurrentGame();
|
||||||
Singletons.getControl().startGameWithUi(lastGame.getMatch());
|
Singletons.getControl().startGameWithUi(lastGame.getMatch());
|
||||||
}
|
}
|
||||||
@@ -110,62 +90,6 @@ public class ControlWinLose {
|
|||||||
Singletons.getModel().getPreferences().save();
|
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>
|
* <p>
|
||||||
* populateCustomPanel.
|
* populateCustomPanel.
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ public enum CDock implements ICDoc {
|
|||||||
*/
|
*/
|
||||||
public void viewDeckList() {
|
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)
|
* @see forge.game.player.PlayerController#sideboard(forge.deck.Deck)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Deck sideboard(Deck deck, GameType gameType) {
|
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
|
||||||
CardPool sideboard = deck.get(DeckSection.Sideboard);
|
CardPool sideboard = deck.get(DeckSection.Sideboard);
|
||||||
if (sideboard == null) {
|
if (sideboard == null) {
|
||||||
// Use an empty cardpool instead of null for 75/0 sideboarding scenario.
|
// 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);
|
CardPool main = deck.get(DeckSection.Main);
|
||||||
|
|
||||||
boolean conform = Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
|
|
||||||
int mainSize = main.countAll();
|
int mainSize = main.countAll();
|
||||||
int sbSize = sideboard.countAll();
|
int sbSize = sideboard.countAll();
|
||||||
int combinedDeckSize = mainSize + sbSize;
|
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.
|
// Limited doesn't have a sideboard max, so let the Main min take care of things.
|
||||||
int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximum();
|
int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximum();
|
||||||
|
|
||||||
CardPool newSb = new CardPool();
|
|
||||||
List<PaperCard> newMain = null;
|
List<PaperCard> newMain = null;
|
||||||
|
|
||||||
if (sbSize == 0 && mainSize == deckMinSize) {
|
if (sbSize == 0 && mainSize == deckMinSize) {
|
||||||
// Skip sideboard loop if there are no sideboarding opportunities
|
// Skip sideboard loop if there are no sideboarding opportunities
|
||||||
newMain = main.toFlatList();
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// conformance should not be checked here
|
||||||
|
boolean conform = Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY);
|
||||||
do {
|
do {
|
||||||
if (newMain != null) {
|
if (newMain != null) {
|
||||||
if (newMain.size() < deckMinSize) {
|
if (newMain.size() < deckMinSize) {
|
||||||
@@ -225,20 +226,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
newMain = GuiChoose.sideboard(sideboard.toFlatList(), main.toFlatList());
|
newMain = GuiChoose.sideboard(sideboard.toFlatList(), main.toFlatList());
|
||||||
} while (conform && (newMain.size() < deckMinSize || combinedDeckSize - newMain.size() > sbMax));
|
} while (conform && (newMain.size() < deckMinSize || combinedDeckSize - newMain.size() > sbMax));
|
||||||
}
|
}
|
||||||
newSb.clear();
|
return newMain;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@@ -1076,4 +1064,9 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
}
|
}
|
||||||
return GuiChoose.one("Choose a regeneration shield:", c.getShield());
|
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();
|
aiOpponents.clear();
|
||||||
for (int i = 0; i < Math.min(gameRounds, aiDecks.size()); i++) {
|
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();
|
resetCurrentRound();
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class GameWrapper {
|
|||||||
public void runGame() {
|
public void runGame() {
|
||||||
List<RegisteredPlayer> registeredPlayers = new ArrayList<RegisteredPlayer>();
|
List<RegisteredPlayer> registeredPlayers = new ArrayList<RegisteredPlayer>();
|
||||||
for( PlayerSpecification player : players ) {
|
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 );
|
LobbyPlayerForTests lobbyPlayer = new LobbyPlayerForTests( player.getName(), playerActions );
|
||||||
registeredPlayer.setPlayer( lobbyPlayer );
|
registeredPlayer.setPlayer( lobbyPlayer );
|
||||||
registeredPlayers.add( registeredPlayer );
|
registeredPlayers.add( registeredPlayer );
|
||||||
|
|||||||
@@ -116,8 +116,8 @@ public class PlayerControllerForTests extends PlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Deck sideboard(Deck deck, GameType gameType) {
|
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
|
||||||
return deck;
|
return null; // refused to side
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -550,4 +550,10 @@ public class PlayerControllerForTests extends PlayerController {
|
|||||||
public CardShields chooseRegenerationShield(Card c) {
|
public CardShields chooseRegenerationShield(Card c) {
|
||||||
return Iterables.getFirst(c.getShield(), null);
|
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