e : main2sort) {
- final CardPrinted card = e.getKey();
- final boolean hasBadSetInfo = "???".equals(card.getEdition()) || StringUtils.isBlank(card.getEdition());
- if (hasBadSetInfo) {
- out.add(String.format("%d %s", e.getValue(), card.getName()));
- } else {
- out.add(String.format("%d %s|%s", e.getValue(), card.getName(), card.getEdition()));
- }
+ out.add(serializeSingleCard(e.getKey(), e.getValue()));
}
return out;
}
+
+ private static String serializeSingleCard(CardPrinted card, Integer n) {
+
+ final boolean hasBadSetInfo = "???".equals(card.getEdition()) || StringUtils.isBlank(card.getEdition());
+ if (hasBadSetInfo) {
+ return String.format("%d %s", n, card.getName());
+ } else {
+ return String.format("%d %s|%s", n, card.getName(), card.getEdition());
+ }
+ }
/**
*
@@ -270,6 +285,17 @@ public class Deck extends DeckBase {
out.add(String.format("%s", "[sideboard]"));
out.addAll(Deck.writeCardPool(this.getSideboard()));
+
+ if ( getCommander() != null ) {
+ out.add(String.format("%s", "[commander]"));
+ out.add(Deck.serializeSingleCard(getCommander(), 1));
+ }
+
+ out.add(String.format("%s", "[planes]"));
+ out.addAll(Deck.writeCardPool(this.getPlanes()));
+
+ out.add(String.format("%s", "[schemes]"));
+ out.addAll(Deck.writeCardPool(this.getSchemes()));
return out;
}
@@ -326,9 +352,70 @@ public class Deck extends DeckBase {
return false;
}
+ if(type == GameType.Commander)
+ {//Must contain exactly 1 legendary Commander and no sideboard.
+ //TODO:Enforce color identity
+ if ( null == getCommander())
+ return false;
+
+ if(!getCommander().getCard().getType().isLegendary())
+ return false;
+
+ //No sideboarding in Commander
+ if(!getSideboard().isEmpty())
+ return false;
+ }
+ else if(type == GameType.Planechase)
+ {//Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton.
+ if(getPlanes().countAll() < 10)
+ return false;
+ int phenoms = 0;
+ for(CardPrinted cp : getPlanes().toFlatList())
+ {
+ if(cp.getType().contains("Phenomenon"))
+ phenoms++;
+ if(getPlanes().count(cp) > 1)
+ return false;
+ }
+ if(phenoms > 2)
+ return false;
+ }
+ else if(type == GameType.Archenemy)
+ {//Must contain at least 20 schemes, max 2 of each.
+ if(getSchemes().countAll() < 20)
+ return false;
+
+ for(CardPrinted cp : getSchemes().toFlatList())
+ {
+ if(getSchemes().count(cp) > 2)
+ return false;
+ }
+ }
+
return true;
}
+ /**
+ * @return the commander
+ */
+ public CardPrinted getCommander() {
+ return commander;
+ }
+
+ /**
+ * @return the planes
+ */
+ public DeckSection getPlanes() {
+ return planes;
+ }
+
+ /**
+ * @return the schemes
+ */
+ public DeckSection getSchemes() {
+ return schemes;
+ }
+
public static final Function FN_NAME_SELECTOR = new Function() {
@Override
public String apply(Deck arg1) {
diff --git a/src/main/java/forge/deck/DeckRecognizer.java b/src/main/java/forge/deck/DeckRecognizer.java
index 6b236800db7..29c86a68a5b 100644
--- a/src/main/java/forge/deck/DeckRecognizer.java
+++ b/src/main/java/forge/deck/DeckRecognizer.java
@@ -245,6 +245,18 @@ public class DeckRecognizer {
if (line.toLowerCase().contains("main")) {
return true;
}
+ if (line.toLowerCase().contains("commander")) {
+ return true;
+ }
+ if (line.toLowerCase().contains("planes")) {
+ return true;
+ }
+ if (line.toLowerCase().contains("schemes")) {
+ return true;
+ }
+ if (line.toLowerCase().contains("vanguard")) {
+ return true;
+ }
return false;
}
diff --git a/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java b/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java
index bb450bb3263..fd34e709d75 100644
--- a/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java
+++ b/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java
@@ -220,7 +220,7 @@ public abstract class GenerateColoredDeckBase {
if (!Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)) {
hasColor = Predicates.or(hasColor, GenerateDeckUtil.COLORLESS_CARDS);
}
- return Iterables.filter(CardDb.instance().getAllCards(), Predicates.compose(Predicates.and(canPlay, hasColor), CardPrinted.FN_GET_RULES));
+ return Iterables.filter(CardDb.instance().getAllTraditionalCards(), Predicates.compose(Predicates.and(canPlay, hasColor), CardPrinted.FN_GET_RULES));
}
protected static Map countLands(ItemPool outList) {
diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java
index b80590fa9c1..05b684573e8 100644
--- a/src/main/java/forge/game/GameNew.java
+++ b/src/main/java/forge/game/GameNew.java
@@ -20,6 +20,7 @@ import forge.CardPredicates;
import forge.CardUtil;
import forge.GameAction;
import forge.Singletons;
+import forge.card.cardfactory.CardFactoryUtil;
import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType;
import forge.control.input.InputControl;
@@ -33,6 +34,7 @@ import forge.game.player.Player;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.gui.match.views.VAntes;
+import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.properties.ForgePreferences.FPref;
import forge.util.Aggregates;
@@ -53,9 +55,9 @@ public class GameNew {
for (int i = 0; i < stackOfCards.getValue(); i++) {
final Card card = cardPrinted.toForgeCard(player);
-
+
// apply random pictures for cards
- if (player.isComputer()) {
+ if ( player.isComputer() ) {
final int cntVariants = cardPrinted.getCard().getEditionInfo(cardPrinted.getEdition()).getCopiesCount();
if (cntVariants > 1) {
card.setRandomPicture(generator.nextInt(cntVariants - 1) + 1);
@@ -70,43 +72,41 @@ public class GameNew {
}
if (!useAnte && card.hasKeyword("Remove CARDNAME from your deck before playing if you're not playing for ante.")) {
- if (!removedAnteCards.containsKey(player)) {
+ if(!removedAnteCards.containsKey(player))
removedAnteCards.put(player, new ArrayList());
- }
removedAnteCards.get(player).add(card.getName());
} else {
library.add(card);
}
-
+
// mark card as difficult for AI to play
- if (player.isComputer() && card.getSVar("RemAIDeck").equals("True") && !rAICards.contains(card.getName())) {
+ if ( player.isComputer() && card.getSVar("RemAIDeck").equals("True") && !rAICards.contains(card.getName())) {
rAICards.add(card.getName());
// get card picture so that it is in the image cache
// ImageCache.getImage(card);
}
}
- }
-
+ }
+
// Shuffling
- // Ai may cheat
- if (player.isComputer() && Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SMOOTH_LAND)) {
+ // Ai may cheat
+ if ( player.isComputer() && Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SMOOTH_LAND) ) {
// do this instead of shuffling Computer's deck
final Iterable c1 = GameNew.smoothComputerManaCurve(player.getCardsIn(ZoneType.Library));
player.getZone(ZoneType.Library).setCards(c1);
- } else {
+ } else
player.shuffle();
- }
}
-
-
+
+
/**
* 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.
+ * TODO: Accept something like match state as parameter. Match should be aware of players,
+ * their decks and other special starting conditions.
*/
- public static void newGame(final Map playersConditions, final GameState game, final boolean canRandomFoil) {
+ public static void newGame(final Map playersConditions, final GameState game, final boolean canRandomFoil ) {
Singletons.getModel().getMatch().getInput().clearInput();
Card.resetUniqueNumber();
@@ -120,15 +120,15 @@ public class GameNew {
final Map> removedAnteCards = new HashMap>();
final List rAICards = new ArrayList();
- for (Entry p : playersConditions.entrySet()) {
+ for( Entry p : playersConditions.entrySet() ) {
final Player player = p.getKey();
player.setStartingLife(p.getValue().getStartingLife());
+ player.setMaxHandSize(p.getValue().getStartingHand());
// what if I call it for AI player?
PlayerZone bf = player.getZone(ZoneType.Battlefield);
- Iterable onTable = p.getValue().getCardsOnTable();
+ Iterable onTable = p.getValue().getCardsOnBattlefield();
if (onTable != null) {
for (final Card c : onTable) {
- c.addController(player);
c.setOwner(player);
bf.add(c, false);
c.setSickness(true);
@@ -136,23 +136,36 @@ public class GameNew {
c.refreshUniqueNumber();
}
}
-
+
+ PlayerZone com = player.getZone(ZoneType.Command);
+ Iterable inCommand = p.getValue().getCardsInCommand();
+ if (inCommand != null) {
+ for (final Card c : inCommand) {
+ c.setOwner(player);
+ com.add(c, false);
+ c.refreshUniqueNumber();
+ }
+ }
+
prepareSingleLibrary(player, p.getValue().getDeck(), removedAnteCards, rAICards, canRandomFoil);
player.updateObservers();
bf.updateObservers();
player.getZone(ZoneType.Hand).updateObservers();
+ player.getZone(ZoneType.Command).updateObservers();
+ player.getZone(ZoneType.Battlefield).updateObservers();
}
-
-
+
+
+
if (rAICards.size() > 0) {
String message = buildFourColumnList("AI deck contains the following cards that it can't play or may be buggy:", rAICards);
JOptionPane.showMessageDialog(null, message, "", JOptionPane.INFORMATION_MESSAGE);
}
-
+
if (!removedAnteCards.isEmpty()) {
StringBuilder ante = new StringBuilder("The following ante cards were removed:\n\n");
- for (Entry> ants : removedAnteCards.entrySet()) {
- ante.append(buildFourColumnList("From the " + ants.getKey().getName() + "'s deck:", ants.getValue()));
+ for(Entry> ants : removedAnteCards.entrySet() ) {
+ ante.append(buildFourColumnList( "From the " + ants.getKey().getName() + "'s deck:", ants.getValue()));
}
JOptionPane.showMessageDialog(null, ante.toString(), "", JOptionPane.INFORMATION_MESSAGE);
}
@@ -162,14 +175,14 @@ public class GameNew {
public static void restartGame(final GameState game, final Player startingTurn, Map> playerLibraries) {
MatchController match = Singletons.getModel().getMatch();
-
+
Map players = match.getPlayers();
Map playersConditions = new HashMap();
-
+
for (Player p : game.getPlayers()) {
playersConditions.put(p, players.get(p.getLobbyPlayer()));
}
-
+
match.getInput().clearInput();
//Card.resetUniqueNumber();
@@ -180,18 +193,18 @@ public class GameNew {
trigHandler.clearDelayedTrigger();
trigHandler.cleanUpTemporaryTriggers();
trigHandler.suppressMode(TriggerType.ChangesZone);
-
+
game.getStack().reset();
GameAction action = game.getAction();
+
-
- for (Entry p : playersConditions.entrySet()) {
+ for( Entry p : playersConditions.entrySet() ) {
final Player player = p.getKey();
player.setStartingLife(p.getValue().getStartingLife());
player.setNumLandsPlayed(0);
// what if I call it for AI player?
PlayerZone bf = player.getZone(ZoneType.Battlefield);
- Iterable onTable = p.getValue().getCardsOnTable();
+ Iterable onTable = p.getValue().getCardsOnBattlefield();
if (onTable != null) {
for (final Card c : onTable) {
c.addController(player);
@@ -205,7 +218,7 @@ public class GameNew {
PlayerZone library = player.getZone(ZoneType.Library);
List newLibrary = playerLibraries.get(player);
- for (Card c : newLibrary) {
+ for(Card c : newLibrary) {
action.moveTo(library, c);
}
@@ -216,7 +229,7 @@ public class GameNew {
}
trigHandler.clearSuppression(TriggerType.ChangesZone);
-
+
PhaseHandler phaseHandler = game.getPhaseHandler();
phaseHandler.setPlayerTurn(startingTurn);
@@ -233,16 +246,17 @@ public class GameNew {
*/
private static void actuateGame(final GameState game, boolean isRestartedGame) {
if (!isRestartedGame) {
- // Deciding which cards go to ante
+ // Deciding which cards go to ante
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE)) {
final String nl = System.getProperty("line.separator");
final StringBuilder msg = new StringBuilder();
for (final Player p : game.getPlayers()) {
+
final List lib = p.getCardsIn(ZoneType.Library);
Predicate goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS);
Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte));
if (ante == null) {
- throw new RuntimeException(p + " library is empty.");
+ throw new RuntimeException(p + " library is empty.");
}
game.getGameLog().add("Ante", p + " anted " + ante, 0);
VAntes.SINGLETON_INSTANCE.addAnteCard(p, ante);
@@ -252,7 +266,7 @@ public class GameNew {
JOptionPane.showMessageDialog(null, msg, "Ante", JOptionPane.INFORMATION_MESSAGE);
}
- GameOutcome lastGameOutcome = Singletons.getModel().getMatch().getLastGameOutcome();
+ GameOutcome lastGameOutcome = Singletons.getModel().getMatch().getLastGameOutcome();
// Only cut/coin toss if it's the first game of the match
if (lastGameOutcome == null) {
GameNew.seeWhoPlaysFirstDice();
@@ -263,18 +277,17 @@ public class GameNew {
}
}
- // Draw 7 cards
+ // Draw cards
for (final Player p : game.getPlayers()) {
- // Should this be p.getMaxHandSize() for Vanguard compatibility?
- p.drawCards(7);
+ p.drawCards(p.getMaxHandSize());
}
-
+
game.getPhaseHandler().setPhaseState(PhaseType.MULLIGAN);
InputControl control = Singletons.getModel().getMatch().getInput();
control.setInput(new InputMulligan());
} // newGame()
-
- private static String buildFourColumnList(String firstLine, List cAnteRemoved) {
+
+ private static String buildFourColumnList(String firstLine, List cAnteRemoved ) {
StringBuilder sb = new StringBuilder(firstLine);
sb.append("\n");
for (int i = 0; i < cAnteRemoved.size(); i++) {
@@ -353,34 +366,33 @@ public class GameNew {
private static void seeWhoPlaysFirstDice() {
int playerDie = 0;
int computerDie = 0;
-
+
while (playerDie == computerDie) {
playerDie = MyRandom.getRandom().nextInt(20);
computerDie = MyRandom.getRandom().nextInt(20);
}
-
+
// Play the Flip Coin sound
Singletons.getModel().getGame().getEvents().post(new FlipCoinEvent());
-
+
List allPlayers = Singletons.getModel().getGame().getPlayers();
setPlayersFirstTurn(allPlayers.get(MyRandom.getRandom().nextInt(allPlayers.size())), true);
}
-
+
private static void setPlayersFirstTurn(Player goesFirst, boolean firstGame) {
StringBuilder sb = new StringBuilder(goesFirst.toString());
if (firstGame) {
sb.append(" has won the coin toss.");
}
else {
- sb.append(" lost the last game.");
+ sb.append(" lost the last game.");
}
- if (goesFirst.isHuman()) {
- if (!humanPlayOrDraw(sb.toString())) {
+ if ( goesFirst.isHuman() ) {
+ if( !humanPlayOrDraw(sb.toString()) )
goesFirst = goesFirst.getOpponent();
- }
} else {
sb.append("\nComputer Going First");
- JOptionPane.showMessageDialog(null, sb.toString(),
+ JOptionPane.showMessageDialog(null, sb.toString(),
"Play or Draw?", JOptionPane.INFORMATION_MESSAGE);
}
Singletons.getModel().getGame().getPhaseHandler().setPlayerTurn(goesFirst);
@@ -388,11 +400,11 @@ public class GameNew {
private static boolean humanPlayOrDraw(String message) {
final String[] possibleValues = { "Play", "Draw" };
-
- final Object playDraw = JOptionPane.showOptionDialog(null, message + "\n\nWould you like to play or draw?",
- "Play or Draw?", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
+
+ final Object playDraw = JOptionPane.showOptionDialog(null, message + "\n\nWould you like to play or draw?",
+ "Play or Draw?", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
possibleValues, possibleValues[0]);
-
+
return !playDraw.equals(1);
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java
index 7b26fe21c4c..c758e17e4c4 100644
--- a/src/main/java/forge/game/GameState.java
+++ b/src/main/java/forge/game/GameState.java
@@ -434,6 +434,7 @@ public class GameState {
all.addAll(player.getZone(ZoneType.Library).getCards());
all.addAll(player.getZone(ZoneType.Battlefield).getCards(false));
all.addAll(player.getZone(ZoneType.Exile).getCards());
+ all.addAll(player.getZone(ZoneType.Command).getCards());
}
all.addAll(getStackZone().getCards());
return all;
diff --git a/src/main/java/forge/game/GameType.java b/src/main/java/forge/game/GameType.java
index 202fa4f6427..7454a3a4b4f 100644
--- a/src/main/java/forge/game/GameType.java
+++ b/src/main/java/forge/game/GameType.java
@@ -32,6 +32,12 @@ public enum GameType {
Commander(false, 100, 100, true),
/** The Quest. */
Quest(true, 40),
+ /** The Vanguard. */
+ Vanguard(false, 60),
+ /** The Planechase. */
+ Planechase(false, 60),
+ /** The Archenemy. */
+ Archenemy(false, 60),
/** */
Gauntlet(true, 40);
diff --git a/src/main/java/forge/game/MatchStartHelper.java b/src/main/java/forge/game/MatchStartHelper.java
index df075061a3d..df4947ad72a 100644
--- a/src/main/java/forge/game/MatchStartHelper.java
+++ b/src/main/java/forge/game/MatchStartHelper.java
@@ -1,10 +1,17 @@
package forge.game;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import com.google.common.base.Supplier;
+
+import forge.Card;
+import forge.card.CardRules;
import forge.deck.Deck;
import forge.game.player.LobbyPlayer;
+import forge.item.CardPrinted;
/**
* TODO: Write javadoc for this type.
@@ -13,18 +20,39 @@ import forge.game.player.LobbyPlayer;
public class MatchStartHelper {
private final Map players = new HashMap();
- public void addPlayer(LobbyPlayer player, PlayerStartConditions c) {
- players.put(player, c);
+ public void addPlayer(final LobbyPlayer player, final PlayerStartConditions c) {
+ players.put(player,c);
}
-
- public void addPlayer(LobbyPlayer player, Deck deck) {
- players.put(player, new PlayerStartConditions(deck));
+
+ public void addPlayer(final LobbyPlayer player, final Deck deck) {
+ PlayerStartConditions start = new PlayerStartConditions(deck);
+ players.put(player, start);
}
+
+ public void addVanguardPlayer(final LobbyPlayer player, final Deck deck, final CardPrinted avatar)
+ {
+ PlayerStartConditions start = new PlayerStartConditions(deck);
+
+ start.setStartingLife(start.getStartingLife() + avatar.getCard().getLife());
+ start.setStartingHand(start.getStartingHand() + avatar.getCard().getHand());
+
+ start.setCardsInCommand(new Supplier>() {
- public Map getPlayerMap() {
-
+ @Override
+ public Iterable get() {
+ List res = new ArrayList();
+ res.add(avatar.toForgeCard());
+ return res;
+ }
+
+ });
+
+ players.put(player, start);
+ }
+
+ public Map getPlayerMap()
+ {
return players;
}
-
}
diff --git a/src/main/java/forge/game/PlayerStartConditions.java b/src/main/java/forge/game/PlayerStartConditions.java
index ba9f330fef1..a7f225dea3e 100644
--- a/src/main/java/forge/game/PlayerStartConditions.java
+++ b/src/main/java/forge/game/PlayerStartConditions.java
@@ -3,13 +3,17 @@ package forge.game;
import com.google.common.base.Supplier;
import forge.Card;
+import forge.card.CardRules;
import forge.deck.Deck;
+import forge.item.CardPrinted;
public class PlayerStartConditions {
private final Deck deck;
private int startingLife = 20;
- private Supplier> cardsOnTable = null;
+ private int startingHand = 7;
+ private Supplier> cardsOnBattlefield = null;
+ private Supplier> cardsInCommand = null;
public PlayerStartConditions(Deck deck0) {
deck = deck0;
@@ -21,16 +25,44 @@ public class PlayerStartConditions {
public final int getStartingLife() {
return startingLife;
}
- public final Iterable getCardsOnTable() {
- return cardsOnTable == null ? null : cardsOnTable.get();
+ public final Iterable getCardsOnBattlefield() {
+ return cardsOnBattlefield == null ? null : cardsOnBattlefield.get();
}
public final void setStartingLife(int startingLife) {
this.startingLife = startingLife;
}
- public final void setCardsOnTable(Supplier> cardsOnTable) {
- this.cardsOnTable = cardsOnTable;
+ public final void setCardsOnBattlefield(Supplier> cardsOnTable) {
+ this.cardsOnBattlefield = cardsOnTable;
+ }
+
+ /**
+ * @return the startingHand
+ */
+ public int getStartingHand() {
+ return startingHand;
+ }
+
+ /**
+ * @param startingHand0 the startingHand to set
+ */
+ public void setStartingHand(int startingHand0) {
+ this.startingHand = startingHand0;
+ }
+
+ /**
+ * @return the cardsInCommand
+ */
+ public Iterable getCardsInCommand() {
+ return cardsInCommand == null ? null : cardsInCommand.get();
+ }
+
+ /**
+ * @param cardsInCommand0 the cardsInCommand to set
+ */
+ public void setCardsInCommand(Supplier> cardsInCommand0) {
+ this.cardsInCommand = cardsInCommand0;
}
diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java
index 254a772bcba..e1fd2b4507a 100644
--- a/src/main/java/forge/game/phase/CombatUtil.java
+++ b/src/main/java/forge/game/phase/CombatUtil.java
@@ -960,7 +960,7 @@ public class CombatUtil {
}
// CantBeActivated static abilities
- for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) {
+ for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) {
final ArrayList staticAbilities = ca.getStaticAbilities();
for (final StaticAbility stAb : staticAbilities) {
if (stAb.applyAbility("CantAttack", c, defender)) {
diff --git a/src/main/java/forge/game/player/ComputerAIGeneral.java b/src/main/java/forge/game/player/ComputerAIGeneral.java
index 2f10983be59..a9bcff7234b 100644
--- a/src/main/java/forge/game/player/ComputerAIGeneral.java
+++ b/src/main/java/forge/game/player/ComputerAIGeneral.java
@@ -139,6 +139,7 @@ public class ComputerAIGeneral implements Computer {
all.addAll(player.getCardsIn(ZoneType.Battlefield));
all.addAll(player.getCardsIn(ZoneType.Exile));
all.addAll(player.getCardsIn(ZoneType.Graveyard));
+ all.addAll(player.getCardsIn(ZoneType.Command));
if (!player.getCardsIn(ZoneType.Library).isEmpty()) {
all.add(player.getCardsIn(ZoneType.Library).get(0));
}
diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java
index a97f5df3f54..e5832e4fbe9 100644
--- a/src/main/java/forge/game/player/Player.java
+++ b/src/main/java/forge/game/player/Player.java
@@ -679,7 +679,7 @@ public abstract class Player extends GameEntity implements Comparable {
}
// Prevent Damage static abilities
- for (final Card ca : game.getCardsIn(ZoneType.Battlefield)) {
+ for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) {
final ArrayList staticAbilities = ca.getStaticAbilities();
for (final StaticAbility stAb : staticAbilities) {
restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat);
@@ -1898,7 +1898,7 @@ public abstract class Player extends GameEntity implements Comparable {
}
// CantBeCast static abilities
- for (final Card ca : game.getCardsIn(ZoneType.Battlefield)) {
+ for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) {
final ArrayList staticAbilities = ca.getStaticAbilities();
for (final StaticAbility stAb : staticAbilities) {
if (stAb.applyAbility("CantPlayLand", null, this)) {
diff --git a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
index ae86483c86a..3f0ed46b928 100644
--- a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
+++ b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
@@ -84,7 +84,7 @@ public class PlayerZoneBattlefield extends PlayerZone {
c.setTapped(true);
} else {
// ETBTapped static abilities
- for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) {
+ for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) {
for (final StaticAbility stAb : ca.getStaticAbilities()) {
if (stAb.applyAbility("ETBTapped", c)) {
// it enters the battlefield this way, and should
diff --git a/src/main/java/forge/game/zone/ZoneType.java b/src/main/java/forge/game/zone/ZoneType.java
index d074768308a..143690851fc 100644
--- a/src/main/java/forge/game/zone/ZoneType.java
+++ b/src/main/java/forge/game/zone/ZoneType.java
@@ -34,7 +34,7 @@ public enum ZoneType {
/** Ante. */
Ante(false);
- public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile/*, Hand*/});
+ public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile, Command/*, Hand*/});
private final boolean holdsHiddenInfo;
private ZoneType(boolean holdsHidden) {
diff --git a/src/main/java/forge/gui/GuiMigrateLocalMWSSetPicturesHQ.java b/src/main/java/forge/gui/GuiMigrateLocalMWSSetPicturesHQ.java
index 03a9ebc0684..150ac42e7c2 100644
--- a/src/main/java/forge/gui/GuiMigrateLocalMWSSetPicturesHQ.java
+++ b/src/main/java/forge/gui/GuiMigrateLocalMWSSetPicturesHQ.java
@@ -491,7 +491,7 @@ public final class GuiMigrateLocalMWSSetPicturesHQ extends DefaultBoundedRangeMo
final String urlBase = "C:\\MTGForge\\HQPICS\\";
String imgFN = "";
- for (final CardPrinted cp : CardDb.instance().getAllCards())
+ for (final CardPrinted cp : CardDb.instance().getAllTraditionalCards())
{
// String url = c.getSVar("Picture");
// String[] URLs = url.split("\\\\");
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
index a3249903465..1e2395c4a7c 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
@@ -121,7 +121,7 @@ public final class CEditorConstructed extends ACEditorBase {
@Override
public void resetTables() {
// Constructed mode can use all cards, no limitations.
- this.getTableCatalog().setDeck(ItemPool.createFrom(CardDb.instance().getAllCards(), CardPrinted.class));
+ this.getTableCatalog().setDeck(ItemPool.createFrom(CardDb.instance().getAllTraditionalCards(), CardPrinted.class));
this.getTableDeck().setDeck(this.controller.getModel().getMain());
}
diff --git a/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java b/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java
index 6c1b14d85d6..46965cc4020 100644
--- a/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java
+++ b/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java
@@ -22,6 +22,8 @@ import java.util.ArrayList;
import org.apache.commons.lang3.StringUtils;
+import com.google.common.collect.Iterables;
+
import forge.CardUtil;
import forge.Singletons;
import forge.card.CardEdition;
@@ -90,7 +92,9 @@ public class GuiDownloadSetPicturesLQ extends GuiDownloader {
// read token names and urls
final ArrayList cList = new ArrayList();
- for (final CardPrinted c : CardDb.instance().getAllCards()) {
+ Iterable allPrinted = Iterables.concat(CardDb.instance().getAllTraditionalCards(),CardDb.instance().getAllNonTraditionalCards());
+
+ for (final CardPrinted c : allPrinted) {
final String setCode3 = c.getEdition();
if (StringUtils.isBlank(setCode3) || "???".equals(setCode3)) {
continue; // we don't want cards from unknown sets
diff --git a/src/main/java/forge/gui/framework/EDocID.java b/src/main/java/forge/gui/framework/EDocID.java
index fbecafe3c2c..fe9e7c20851 100644
--- a/src/main/java/forge/gui/framework/EDocID.java
+++ b/src/main/java/forge/gui/framework/EDocID.java
@@ -15,7 +15,6 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild;
import forge.gui.home.gauntlet.VSubmenuGauntletContests;
import forge.gui.home.gauntlet.VSubmenuGauntletLoad;
import forge.gui.home.gauntlet.VSubmenuGauntletQuick;
-import forge.gui.home.multiplayer.VSubmenuArchenemy;
import forge.gui.home.quest.VSubmenuChallenges;
import forge.gui.home.quest.VSubmenuDuels;
import forge.gui.home.quest.VSubmenuQuestData;
@@ -27,6 +26,8 @@ import forge.gui.home.sanctioned.VSubmenuSealed;
import forge.gui.home.settings.VSubmenuAvatars;
import forge.gui.home.settings.VSubmenuDownloaders;
import forge.gui.home.settings.VSubmenuPreferences;
+import forge.gui.home.variant.VSubmenuArchenemy;
+import forge.gui.home.variant.VSubmenuVanguard;
import forge.gui.match.views.VAntes;
import forge.gui.match.views.VCombat;
import forge.gui.match.views.VDetail;
@@ -74,6 +75,7 @@ public enum EDocID { /** */
HOME_CONSTRUCTED (VSubmenuConstructed.SINGLETON_INSTANCE), /** */
HOME_DRAFT (VSubmenuDraft.SINGLETON_INSTANCE), /** */
HOME_SEALED (VSubmenuSealed.SINGLETON_INSTANCE), /** */
+ HOME_VANGUARD (VSubmenuVanguard.SINGLETON_INSTANCE), /** */
REPORT_MESSAGE (VMessage.SINGLETON_INSTANCE), /** */
REPORT_STACK (VStack.SINGLETON_INSTANCE), /** */
@@ -98,7 +100,16 @@ public enum EDocID { /** */
HAND_0 (null), /** */
HAND_1 (null), /** */
HAND_2 (null), /** */
- HAND_3 (null);
+ HAND_3 (null), /** */
+
+ COMMAND_0 (null), /** */
+ COMMAND_1 (null), /** */
+ COMMAND_2 (null), /** */
+ COMMAND_3 (null), /** */
+ COMMAND_4 (null), /** */
+ COMMAND_5 (null), /** */
+ COMMAND_6 (null), /** */
+ COMMAND_7 (null); /** */
// End enum declarations, start enum methods.
private IVDoc extends ICDoc> vDoc;
diff --git a/src/main/java/forge/gui/home/EMenuGroup.java b/src/main/java/forge/gui/home/EMenuGroup.java
index d86f494e2a5..b705cb6b935 100644
--- a/src/main/java/forge/gui/home/EMenuGroup.java
+++ b/src/main/java/forge/gui/home/EMenuGroup.java
@@ -11,7 +11,7 @@ public enum EMenuGroup { /** */
SANCTIONED ("Sanctioned Formats"), /** */
QUEST ("Quest Mode"), /** */
GAUNTLET ("Gauntlets"), /** */
- MULTIPLAYER ("Multiplayer"), /** */
+ VARIANT ("Variant"), /** */
SETTINGS ("Game Settings");
private final String strTitle;
diff --git a/src/main/java/forge/gui/home/VHomeUI.java b/src/main/java/forge/gui/home/VHomeUI.java
index 592e89237ac..f2913f807d4 100644
--- a/src/main/java/forge/gui/home/VHomeUI.java
+++ b/src/main/java/forge/gui/home/VHomeUI.java
@@ -43,7 +43,6 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild;
import forge.gui.home.gauntlet.VSubmenuGauntletContests;
import forge.gui.home.gauntlet.VSubmenuGauntletLoad;
import forge.gui.home.gauntlet.VSubmenuGauntletQuick;
-import forge.gui.home.multiplayer.VSubmenuArchenemy;
import forge.gui.home.quest.VSubmenuChallenges;
import forge.gui.home.quest.VSubmenuDuels;
import forge.gui.home.quest.VSubmenuQuestData;
@@ -55,6 +54,8 @@ import forge.gui.home.sanctioned.VSubmenuSealed;
import forge.gui.home.settings.VSubmenuAvatars;
import forge.gui.home.settings.VSubmenuDownloaders;
import forge.gui.home.settings.VSubmenuPreferences;
+import forge.gui.home.variant.VSubmenuArchenemy;
+import forge.gui.home.variant.VSubmenuVanguard;
import forge.gui.toolbox.ExperimentalLabel;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
@@ -118,6 +119,8 @@ public enum VHomeUI implements IVTopLevelUI {
//allSubmenus.add(VSubmenuExit.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuArchenemy.SINGLETON_INSTANCE);
+
+ allSubmenus.add(VSubmenuVanguard.SINGLETON_INSTANCE);
// For each group: init its panel
final SortedMap allGroupPanels = new TreeMap();
diff --git a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java
index 78863254074..61aa6f691d7 100644
--- a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java
+++ b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java
@@ -321,9 +321,9 @@ public class SSubmenuQuestUtil {
humanStart.setStartingLife(qData.getAssets().getLife(qData.getMode()) + extraLifeHuman);
aiStart.setStartingLife(lifeAI);
- humanStart.setCardsOnTable(new Supplier>() {
+ humanStart.setCardsOnBattlefield(new Supplier>() {
@Override public Iterable get() { return QuestUtil.getHumanStartingCards(qData, event); } });
- aiStart.setCardsOnTable(new Supplier>() {
+ aiStart.setCardsOnBattlefield(new Supplier>() {
@Override public Iterable get() { return QuestUtil.getComputerStartingCards(event); } });
} // End isFantasy
diff --git a/src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
similarity index 98%
rename from src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java
rename to src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
index 62f415a81e4..7064fc64fdd 100644
--- a/src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java
+++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
@@ -1,4 +1,4 @@
-package forge.gui.home.multiplayer;
+package forge.gui.home.variant;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
diff --git a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java
new file mode 100644
index 00000000000..4ac46cf4ac6
--- /dev/null
+++ b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java
@@ -0,0 +1,200 @@
+package forge.gui.home.variant;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
+
+import com.google.common.collect.Iterables;
+
+import forge.Command;
+import forge.GameActionUtil;
+import forge.Singletons;
+import forge.control.Lobby;
+import forge.deck.Deck;
+import forge.game.GameType;
+import forge.game.MatchController;
+import forge.game.MatchStartHelper;
+import forge.game.PlayerStartConditions;
+import forge.game.player.LobbyPlayer;
+import forge.game.player.PlayerType;
+import forge.gui.SOverlayUtils;
+import forge.gui.framework.ICDoc;
+import forge.gui.toolbox.FDeckChooser;
+import forge.gui.toolbox.FList;
+import forge.item.CardPrinted;
+import forge.properties.ForgePreferences;
+import forge.properties.ForgePreferences.FPref;
+
+/**
+ * Controls the constructed submenu in the home UI.
+ *
+ *
(C at beginning of class name denotes a control class.)
+ *
+ */
+public enum CSubmenuVanguard implements ICDoc {
+ /** */
+ SINGLETON_INSTANCE;
+ private final VSubmenuVanguard view = VSubmenuVanguard.SINGLETON_INSTANCE;
+
+
+ /* (non-Javadoc)
+ * @see forge.gui.home.ICSubmenu#initialize()
+ */
+ @Override
+ public void update() {
+ // Nothing to see here...
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.home.ICSubmenu#initialize()
+ */
+ @Override
+ public void initialize() {
+ final ForgePreferences prefs = Singletons.getModel().getPreferences();
+ for(FDeckChooser fdc : view.getDeckChoosers())
+ {
+ fdc.initialize();
+ }
+
+ // Checkbox event handling
+ view.getBtnStart().addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {
+ startGame();
+ }
+ });
+
+ // Checkbox event handling
+ view.getCbSingletons().addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {
+ prefs.setPref(FPref.DECKGEN_SINGLETONS,
+ String.valueOf(view.getCbSingletons().isSelected()));
+ prefs.save();
+ }
+ });
+
+ view.getCbArtifacts().addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {
+ prefs.setPref(
+ FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected()));
+ prefs.save();
+ }
+ });
+
+ view.getCbRemoveSmall().addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {
+ prefs.setPref(
+ FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected()));
+ prefs.save();
+ }
+ });
+
+ // Pre-select checkboxes
+ view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS));
+ view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
+ view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL));
+ }
+
+
+
+ /** @param lists0 {@link java.util.List}<{@link javax.swing.JList}> */
+ private void startGame() {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ SOverlayUtils.startGameOverlay();
+ SOverlayUtils.showOverlay();
+ }
+ });
+
+ final SwingWorker