Add menu item for setting Oathbreaker

Allow double-tapping to set Commander or Oathbreaker if one hasn't yet been set
This commit is contained in:
Dan Demp
2019-08-20 04:34:14 +00:00
committed by Michael Kamensky
parent ce96e64edb
commit f1e0158102
64 changed files with 1227 additions and 542 deletions

View File

@@ -15,6 +15,7 @@ public class ConstructedAchievements extends AchievementCollection {
add(new VariantWins(GameType.MomirBasic, 25, 50, 100));
add(new VariantWins(GameType.MoJhoSto, 25, 50, 100));
add(new VariantWins(GameType.Commander, 25, 50, 100));
add(new VariantWins(GameType.Oathbreaker, 25, 50, 100));
add(new VariantWins(GameType.TinyLeaders, 25, 50, 100));
add(new VariantWins(GameType.Brawl, 25, 50, 100));
add(new VariantWins(GameType.Planechase, 25, 50, 100));

View File

@@ -34,42 +34,34 @@ public final class CardRelationMatrixGenerator {
public static final int MIN_REQUIRED_CONNECTIONS = 14;
public static boolean initialize(){
List<String> formatStrings = new ArrayList<>();
/* formatStrings.add(FModel.getFormats().getStandard().getName());
formatStrings.add(FModel.getFormats().getModern().getName());*/
formatStrings.add(DeckFormat.Commander.toString());
for (String formatString : formatStrings){
if(!initializeFormat(formatString)){
return false;
}
}
return true;
return initializeFormat(DeckFormat.Commander) && initializeFormat(DeckFormat.Oathbreaker);
}
/** Try to load matrix .dat files, otherwise check for deck folders and build .dat, otherwise return false **/
public static boolean initializeFormat(String format){
HashMap<String,List<Map.Entry<PaperCard,Integer>>> formatMap = CardThemedMatrixIO.loadMatrix(format);
if(formatMap==null) {
if (CardThemedMatrixIO.getMatrixFolder(format).exists()) {
if(format.equals(FModel.getFormats().getStandard().getName())){
public static boolean initializeFormat(DeckFormat format){
String formatName = format.toString();
HashMap<String,List<Map.Entry<PaperCard,Integer>>> formatMap = CardThemedMatrixIO.loadMatrix(formatName);
if (formatMap==null) {
if (CardThemedMatrixIO.getMatrixFolder(formatName).exists()) {
if (formatName.equals(FModel.getFormats().getStandard().getName())){
formatMap=initializeFormat(FModel.getFormats().getStandard());
}else if(format.equals(FModel.getFormats().getModern().getName())){
formatMap=initializeFormat(FModel.getFormats().getModern());
}else{
formatMap=initializeCommanderFormat();
}
CardThemedMatrixIO.saveMatrix(format, formatMap);
else if (formatName.equals(FModel.getFormats().getModern().getName())){
formatMap=initializeFormat(FModel.getFormats().getModern());
}
else{
formatMap=initializeCommanderFormat(format);
}
CardThemedMatrixIO.saveMatrix(formatName, formatMap);
} else {
return false;
}
}
cardPools.put(format, formatMap);
cardPools.put(formatName, formatMap);
return true;
}
public static HashMap<String,List<Map.Entry<PaperCard,Integer>>> initializeFormat(GameFormat format){
IStorage<Deck> decks = new StorageImmediatelySerialized<Deck>("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR+ForgeConstants.PATH_SEPARATOR+format.getName()),
ForgeConstants.DECK_GEN_DIR, false),
true);
@@ -100,7 +92,6 @@ public final class CardRelationMatrixGenerator {
//Todo: Not sure what was failing here
}
}
}
}
}
@@ -137,10 +128,9 @@ public final class CardRelationMatrixGenerator {
return cardPools;
}
public static HashMap<String,List<Map.Entry<PaperCard,Integer>>> initializeCommanderFormat(){
public static HashMap<String,List<Map.Entry<PaperCard,Integer>>> initializeCommanderFormat(DeckFormat format){
IStorage<Deck> decks = new StorageImmediatelySerialized<Deck>("Generator",
new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR,DeckFormat.Commander.toString()),
new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR, format.toString()),
ForgeConstants.DECK_GEN_DIR, false),
true);
@@ -164,7 +154,7 @@ public final class CardRelationMatrixGenerator {
new Predicate<CardRules>() {
@Override
public boolean apply(CardRules rules) {
return DeckFormat.Commander.isLegalCommander(rules);
return format.isLegalCommander(rules);
}
}, PaperCard.FN_GET_RULES)));

View File

@@ -19,17 +19,19 @@ import java.util.List;
*/
public class CommanderDeckGenerator extends DeckProxy implements Comparable<CommanderDeckGenerator> {
public static List<DeckProxy> getCommanderDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){
if(format.equals(DeckFormat.Brawl)){
if (format.equals(DeckFormat.Brawl)){
return getBrawlDecks(format, isForAi, isCardGen);
}
ItemPool uniqueCards;
if(isCardGen){
if (isCardGen){
uniqueCards = new ItemPool<PaperCard>(PaperCard.class);
Iterable<String> legendNames=CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).keySet();
for(String legendName:legendNames) {
String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders
Iterable<String> legendNames = CardRelationMatrixGenerator.cardPools.get(matrixKey).keySet();
for (String legendName : legendNames) {
uniqueCards.add(FModel.getMagicDb().getCommonCards().getUniqueByName(legendName));
}
}else {
}
else {
uniqueCards = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getUniqueCards(), PaperCard.class);
}
Predicate<CardRules> canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY;
@@ -43,7 +45,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
},
canPlay), PaperCard.FN_GET_RULES));
final List<DeckProxy> decks = new ArrayList<DeckProxy>();
for(PaperCard legend: legends) {
for (PaperCard legend: legends) {
decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen));
}
return decks;
@@ -51,14 +53,15 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
public static List<DeckProxy> getBrawlDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){
ItemPool uniqueCards;
if(isCardGen){
if (isCardGen){
uniqueCards = new ItemPool<PaperCard>(PaperCard.class);
//TODO: upate to actual Brawl model from real Brawl decks
//TODO: update to actual Brawl model from real Brawl decks
Iterable<String> legendNames=CardArchetypeLDAGenerator.ldaPools.get(FModel.getFormats().getStandard().getName()).keySet();
for(String legendName:legendNames) {
for (String legendName : legendNames) {
uniqueCards.add(FModel.getMagicDb().getCommonCards().getUniqueByName(legendName));
}
}else {
}
else {
uniqueCards = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getUniqueCards(), PaperCard.class);
}
Predicate<CardRules> canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY;
@@ -68,7 +71,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER,
canPlay), PaperCard.FN_GET_RULES)));
final List<DeckProxy> decks = new ArrayList<DeckProxy>();
for(PaperCard legend: legends) {
for (PaperCard legend: legends) {
decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen));
}
return decks;
@@ -80,7 +83,6 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
private final boolean isForAi;
private final boolean isCardgen;
private CommanderDeckGenerator(PaperCard legend0, DeckFormat format0, boolean isForAi0, boolean isCardgen0) {
super();
legend = legend0;
@@ -94,7 +96,6 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
return CardEdition.UNKNOWN;
}
@Override
public String getName() {
return legend.getName();
@@ -112,7 +113,6 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable<Comm
@Override
public Deck getDeck() {
return DeckgenUtil.generateRandomCommanderDeck(legend, format,isForAi, isCardgen);
}

View File

@@ -364,6 +364,15 @@ public class DeckProxy implements InventoryItem {
return result;
}
public static Iterable<DeckProxy> getAllOathbreakerDecks() {
return getAllOathbreakerDecks(null);
}
public static Iterable<DeckProxy> getAllOathbreakerDecks(final Predicate<Deck> filter) {
final List<DeckProxy> result = new ArrayList<DeckProxy>();
addDecksRecursivelly("Oathbreaker", GameType.Oathbreaker, result, "", FModel.getDecks().getOathbreaker(), filter);
return result;
}
public static Iterable<DeckProxy> getAllTinyLeadersDecks() {
return getAllTinyLeadersDecks(null);
}

View File

@@ -9,12 +9,13 @@ public enum DeckType {
COMMANDER_DECK("lblCommanderDecks"),
RANDOM_COMMANDER_DECK("lblRandomCommanderDecks"),
RANDOM_CARDGEN_COMMANDER_DECK("lblRandomCommanderCard-basedDecks"),
TINY_LEADERS_DECKS("lblTinyLeadersDecks"),
BRAWL_DECKS("lblBrawlDecks"),
SCHEME_DECKS("lblSchemeDecks"),
PLANAR_DECKS("lblPlanarDecks"),
DRAFT_DECKS("lblDraftDecks"),
SEALED_DECKS("lblSealedDecks"),
OATHBREAKER_DECK("lblOathbreakerDecks"),
TINY_LEADERS_DECK("lblTinyLeadersDecks"),
BRAWL_DECK("lblBrawlDecks"),
SCHEME_DECK("lblSchemeDecks"),
PLANAR_DECK("lblPlanarDecks"),
DRAFT_DECK("lblDraftDecks"),
SEALED_DECK("lblSealedDecks"),
PRECONSTRUCTED_DECK("lblPreconstructedDecks"),
QUEST_OPPONENT_DECK("lblQuestOpponentDecks"),
COLOR_DECK("lblRandomColorDecks"),

View File

@@ -603,7 +603,7 @@ public class DeckgenUtil {
final Deck deck;
IDeckGenPool cardDb;
DeckGeneratorBase gen = null;
PaperCard selectedPartner=null;
PaperCard selectedPartner = null;
List<PaperCard> preSelectedCards = new ArrayList<>();
if(isCardGen){
if(format.equals(DeckFormat.Brawl)){//TODO: replace with actual Brawl based data
@@ -623,7 +623,8 @@ public class DeckgenUtil {
}
}else {
List<Map.Entry<PaperCard,Integer>> potentialCards = new ArrayList<>();
potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName()));
String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders
potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(matrixKey).get(commander.getName()));
Collections.shuffle(potentialCards, MyRandom.getRandom());
for(Map.Entry<PaperCard,Integer> pair:potentialCards){
if(format.isLegalCard(pair.getKey())) {
@@ -632,18 +633,33 @@ public class DeckgenUtil {
}
}
if (format.equals(DeckFormat.Oathbreaker)) {
//check for signature spells
List<PaperCard> signatureSpells = new ArrayList<>();
for (PaperCard c : preSelectedCards) {
if (c.getRules().canBeSignatureSpell()) {
signatureSpells.add(c);
}
}
//check for partner commanders
List<PaperCard> partners=new ArrayList<>();
for(PaperCard c:preSelectedCards){
if(c.getRules().canBePartnerCommander()){
partners.add(c);
if (signatureSpells.size() > 0) { //pass signature spell as partner for simplicity
selectedPartner = signatureSpells.get(MyRandom.getRandom().nextInt(signatureSpells.size()));
preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName()));
}
}
else if (commander.getRules().canBePartnerCommander()) {
//check for partner commanders
List<PaperCard> partners = new ArrayList<>();
for (PaperCard c : preSelectedCards) {
if (c.getRules().canBePartnerCommander()) {
partners.add(c);
}
}
if(partners.size()>0&&commander.getRules().canBePartnerCommander()){
selectedPartner=partners.get(MyRandom.getRandom().nextInt(partners.size()));
preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName()));
if (partners.size() > 0) {
selectedPartner = partners.get(MyRandom.getRandom().nextInt(partners.size()));
preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName()));
}
}
//randomly remove cards
int removeCount=0;
@@ -666,7 +682,7 @@ public class DeckgenUtil {
}
preSelectedCards.removeAll(toRemove);
preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName()));
gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,preSelectedCards,forAi,format);
gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner, preSelectedCards, forAi, format);
}else{
cardDb = FModel.getMagicDb().getCommonCards();
//shuffle first 400 random cards
@@ -674,9 +690,38 @@ public class DeckgenUtil {
Predicates.and(format.isLegalCardPredicate(),Predicates.compose(Predicates.or(
new CardThemedDeckBuilder.MatchColorIdentity(commander.getRules().getColorIdentity()),
DeckGeneratorBase.COLORLESS_CARDS), PaperCard.FN_GET_RULES)));
if(format.equals(DeckFormat.Brawl)){//for Brawl - add additional filterprinted rule to remove old reprints for a consistent look
Iterable<PaperCard> colorListFiltered = Iterables.filter(colorList,FModel.getFormats().getStandard().getFilterPrinted());
colorList=colorListFiltered;
switch (format) {
case Brawl: //for Brawl - add additional filterprinted rule to remove old reprints for a consistent look
colorList = Iterables.filter(colorList,FModel.getFormats().getStandard().getFilterPrinted());
break;
case Oathbreaker:
//check for signature spells
List<PaperCard> signatureSpells = new ArrayList<>();
for (PaperCard c : colorList) {
if (c.getRules().canBeSignatureSpell()) {
signatureSpells.add(c);
}
}
if (signatureSpells.size() > 0) { //pass signature spell as partner for simplicity
selectedPartner = signatureSpells.get(MyRandom.getRandom().nextInt(signatureSpells.size()));
}
break;
default:
if (commander.getRules().canBePartnerCommander()) {
//check for partner commanders
List<PaperCard> partners = new ArrayList<>();
for (PaperCard c : colorList) {
if (c.getRules().canBePartnerCommander()) {
partners.add(c);
}
}
if (partners.size() > 0) {
selectedPartner = partners.get(MyRandom.getRandom().nextInt(partners.size()));
}
}
break;
}
List<PaperCard> cardList = Lists.newArrayList(colorList);
Collections.shuffle(cardList, MyRandom.getRandom());
@@ -684,15 +729,16 @@ public class DeckgenUtil {
if(cardList.size()<shortlistlength){
shortlistlength=cardList.size();
}
List<PaperCard> shortList = cardList.subList(1, shortlistlength);
List<PaperCard> shortList = cardList.subList(0, shortlistlength);
shortList.remove(commander);
shortList.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName()));
gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,shortList,forAi,format);
if (selectedPartner != null) {
shortList.remove(selectedPartner);
shortList.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName()));
}
gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner, shortList, forAi, format);
}
gen.setSingleton(true);
gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
CardPool cards = gen.getDeck(format.getMainRange().getMaximum(), forAi);
@@ -707,8 +753,8 @@ public class DeckgenUtil {
deck.setDirectory("generated/commander");
deck.getMain().addAll(cards);
deck.getOrCreate(DeckSection.Commander).add(commander);
if(selectedPartner!=null){
deck.getOrCreate(DeckSection.Commander).add(selectedPartner);
if (selectedPartner!=null){
deck.get(DeckSection.Commander).add(selectedPartner);
}
return deck;

View File

@@ -78,6 +78,8 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
switch (lstDecks.getGameType()) {
case Commander:
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Commander);
case Oathbreaker:
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Oathbreaker);
case TinyLeaders:
return DeckgenUtil.generateCommanderDeck(isAi, GameType.TinyLeaders);
case Brawl:
@@ -138,6 +140,9 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
case Commander:
decks = DeckProxy.getAllCommanderDecks(DeckFormat.Commander.isLegalDeckPredicate());
break;
case Oathbreaker:
decks = DeckProxy.getAllOathbreakerDecks(DeckFormat.Oathbreaker.isLegalDeckPredicate());
break;
case TinyLeaders:
decks = DeckProxy.getAllTinyLeadersDecks(DeckFormat.TinyLeaders.isLegalDeckPredicate());
break;
@@ -166,6 +171,9 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
case Commander:
decks = DeckProxy.getAllCommanderDecks();
break;
case Oathbreaker:
decks = DeckProxy.getAllOathbreakerDecks();
break;
case TinyLeaders:
decks = DeckProxy.getAllTinyLeadersDecks();
break;

View File

@@ -1,6 +1,7 @@
package forge.deck.io;
import forge.deck.DeckProxy;
import forge.deck.DeckType;
import forge.properties.ForgeConstants;
import forge.util.XmlUtil;
@@ -21,9 +22,20 @@ import org.w3c.dom.NodeList;
*
*/
public class DeckPreferences {
private static String currentDeck = "", draftDeck = "", sealedDeck = "", commanderDeck = "", tinyLeadersDeck = "", brawlDeck = "", planarDeck = "", schemeDeck = "";
private static String selectedDeckType = "", currentDeck = "", draftDeck = "", sealedDeck = "", commanderDeck = "",
oathbreakerDeck = "", tinyLeadersDeck = "", brawlDeck = "", planarDeck = "", schemeDeck = "";
private static Map<String, DeckPreferences> allPrefs = new HashMap<String, DeckPreferences>();
public static DeckType getSelectedDeckType() {
return selectedDeckType.isEmpty() ? DeckType.CONSTRUCTED_DECK : DeckType.valueOf(selectedDeckType);
}
public static void setSelectedDeckType(DeckType selectedDeckType0) {
String selectedDeckTypeStr = selectedDeckType0 == DeckType.CONSTRUCTED_DECK ? "" : selectedDeckType0.name();
if (selectedDeckTypeStr.equals(selectedDeckType)) { return; }
selectedDeckType = selectedDeckTypeStr;
save();
}
public static String getCurrentDeck() {
return currentDeck;
}
@@ -60,6 +72,15 @@ public class DeckPreferences {
save();
}
public static String getOathbreakerDeck() {
return oathbreakerDeck;
}
public static void setOathbreakerDeck(String oathbreakerDeck0) {
if (oathbreakerDeck.equals(oathbreakerDeck0)) { return; }
oathbreakerDeck = oathbreakerDeck0;
save();
}
public static String getTinyLeadersDeck() {
return tinyLeadersDeck;
}
@@ -114,10 +135,12 @@ public class DeckPreferences {
final Document document = builder.parse(new File(ForgeConstants.DECK_PREFS_FILE));
final Element root = (Element)document.getElementsByTagName("preferences").item(0);
selectedDeckType = root.getAttribute("selectedDeckType");
currentDeck = root.getAttribute("currentDeck");
draftDeck = root.getAttribute("draftDeck");
sealedDeck = root.getAttribute("sealedDeck");
commanderDeck = root.getAttribute("commanderDeck");
oathbreakerDeck = root.getAttribute("oathbreakerDeck");
brawlDeck = root.getAttribute("brawlDeck");
tinyLeadersDeck = root.getAttribute("tinyLeadersDeck");
planarDeck = root.getAttribute("planarDeck");
@@ -145,10 +168,12 @@ public class DeckPreferences {
Document document = builder.newDocument();
Element root = document.createElement("preferences");
root.setAttribute("type", "decks");
root.setAttribute("selectedDeckType", selectedDeckType);
root.setAttribute("currentDeck", currentDeck);
root.setAttribute("draftDeck", draftDeck);
root.setAttribute("sealedDeck", sealedDeck);
root.setAttribute("commanderDeck", commanderDeck);
root.setAttribute("oathbreakerDeck", oathbreakerDeck);
root.setAttribute("brawlDeck", brawlDeck);
root.setAttribute("tinyLeadersDeck", tinyLeadersDeck);
root.setAttribute("planarDeck", planarDeck);

View File

@@ -70,6 +70,8 @@ public enum ItemManagerConfig {
null, null, 4, 0),
COMMANDER_SECTION(SColumnUtil.getCatalogDefaultColumns(true), true, false, true,
null, null, 1, 1),
OATHBREAKER_SECTION(SColumnUtil.getCatalogDefaultColumns(true), true, false, true,
null, null, 2, 1),
WORKSHOP_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, true, false,
null, null, 4, 0),
DECK_VIEWER(SColumnUtil.getDeckViewerDefaultColumns(), false, false, false,

View File

@@ -34,13 +34,13 @@ public class CardThemedCommanderDeckBuilder extends CardThemedDeckBuilder {
targetSize=format.getMainRange().getMinimum();
colors = keyCard.getRules().getColorIdentity();
colors = ColorSet.fromMask(colors.getColor() | keyCard.getRules().getColorIdentity().getColor());
if(secondKeyCard!=null) {
if (secondKeyCard != null && !format.equals(DeckFormat.Oathbreaker)) {
colors = ColorSet.fromMask(colors.getColor() | secondKeyCard.getRules().getColorIdentity().getColor());
targetSize--;
}
numSpellsNeeded = ((Double)Math.floor(targetSize*(getCreaturePercentage()+getSpellPercentage()))).intValue();
numCreaturesToStart = ((Double)Math.ceil(targetSize*(getCreaturePercentage()))).intValue();
landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();;
landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();
if (logColorsToConsole) {
System.out.println(keyCard.getName());
System.out.println("Pre Colors: " + colors.toEnumSet().toString());

View File

@@ -231,6 +231,14 @@ public abstract class GameLobby implements IHasGameType {
data.appliedVariants.remove(GameType.Archenemy);
break;
case Commander:
data.appliedVariants.remove(GameType.Oathbreaker);
data.appliedVariants.remove(GameType.TinyLeaders);
data.appliedVariants.remove(GameType.Brawl);
data.appliedVariants.remove(GameType.MomirBasic);
data.appliedVariants.remove(GameType.MoJhoSto);
break;
case Oathbreaker:
data.appliedVariants.remove(GameType.Commander);
data.appliedVariants.remove(GameType.TinyLeaders);
data.appliedVariants.remove(GameType.Brawl);
data.appliedVariants.remove(GameType.MomirBasic);
@@ -238,12 +246,14 @@ public abstract class GameLobby implements IHasGameType {
break;
case TinyLeaders:
data.appliedVariants.remove(GameType.Commander);
data.appliedVariants.remove(GameType.Oathbreaker);
data.appliedVariants.remove(GameType.Brawl);
data.appliedVariants.remove(GameType.MomirBasic);
data.appliedVariants.remove(GameType.MoJhoSto);
break;
case Brawl:
data.appliedVariants.remove(GameType.Commander);
data.appliedVariants.remove(GameType.Oathbreaker);
data.appliedVariants.remove(GameType.TinyLeaders);
data.appliedVariants.remove(GameType.MomirBasic);
data.appliedVariants.remove(GameType.MoJhoSto);
@@ -254,6 +264,7 @@ public abstract class GameLobby implements IHasGameType {
break;
case MomirBasic:
data.appliedVariants.remove(GameType.Commander);
data.appliedVariants.remove(GameType.Oathbreaker);
data.appliedVariants.remove(GameType.TinyLeaders);
data.appliedVariants.remove(GameType.Brawl);
data.appliedVariants.remove(GameType.Vanguard);
@@ -261,6 +272,7 @@ public abstract class GameLobby implements IHasGameType {
break;
case MoJhoSto:
data.appliedVariants.remove(GameType.Commander);
data.appliedVariants.remove(GameType.Oathbreaker);
data.appliedVariants.remove(GameType.TinyLeaders);
data.appliedVariants.remove(GameType.Brawl);
data.appliedVariants.remove(GameType.Vanguard);
@@ -281,6 +293,8 @@ public abstract class GameLobby implements IHasGameType {
if (variant == currentGameType) {
if (hasVariant(GameType.Commander)) {
currentGameType = GameType.Commander;
} else if (hasVariant(GameType.Oathbreaker)) {
currentGameType = GameType.Oathbreaker;
} else if (hasVariant(GameType.TinyLeaders)) {
currentGameType = GameType.TinyLeaders;
} else if (hasVariant(GameType.Brawl)) {
@@ -348,7 +362,7 @@ public abstract class GameLobby implements IHasGameType {
SOptionPane.showMessageDialog(TextUtil.concatNoSpace("Please specify a deck for ", slot.getName()));
return null;
}
if (hasVariant(GameType.Commander) || hasVariant(GameType.TinyLeaders) || hasVariant(GameType.Brawl)) {
if (hasVariant(GameType.Commander) || hasVariant(GameType.Oathbreaker) || hasVariant(GameType.TinyLeaders) || hasVariant(GameType.Brawl)) {
if (!slot.getDeck().has(DeckSection.Commander)) {
SOptionPane.showMessageDialog(TextUtil.concatNoSpace(slot.getName(), " doesn't have a commander"));
return null;
@@ -360,12 +374,14 @@ public abstract class GameLobby implements IHasGameType {
GameType autoGenerateVariant = null;
boolean isCommanderMatch = false;
boolean isOathbreakerMatch = false;
boolean isTinyLeadersMatch = false;
boolean isBrawlMatch = false;
if (!variantTypes.isEmpty()) {
isOathbreakerMatch = variantTypes.contains(GameType.Oathbreaker);
isTinyLeadersMatch = variantTypes.contains(GameType.TinyLeaders);
isBrawlMatch = variantTypes.contains(GameType.Brawl);
isCommanderMatch = isBrawlMatch || isTinyLeadersMatch || variantTypes.contains(GameType.Commander);
isCommanderMatch = isBrawlMatch || isTinyLeadersMatch || isOathbreakerMatch || variantTypes.contains(GameType.Commander);
if (!isCommanderMatch) {
for (final GameType variant : variantTypes) {
if (variant.isAutoGenerated()) {
@@ -426,7 +442,11 @@ public abstract class GameLobby implements IHasGameType {
}
else {
if (isCommanderMatch) {
final GameType commanderGameType = isTinyLeadersMatch ? GameType.TinyLeaders : isBrawlMatch ? GameType.Brawl : GameType.Commander;
final GameType commanderGameType =
isOathbreakerMatch ? GameType.Oathbreaker :
isTinyLeadersMatch ? GameType.TinyLeaders :
isBrawlMatch ? GameType.Brawl :
GameType.Commander;
if (checkLegality) {
final String errMsg = commanderGameType.getDeckFormat().getDeckConformanceProblem(deck);
if (errMsg != null) {

View File

@@ -41,6 +41,7 @@ public class CardCollections {
private IStorage<Deck> scheme;
private IStorage<Deck> plane;
private IStorage<Deck> commander;
private IStorage<Deck> oathbreaker;
private IStorage<Deck> tinyLeaders;
private IStorage<Deck> brawl;
@@ -112,6 +113,14 @@ public class CardCollections {
return commander;
}
public IStorage<Deck> getOathbreaker() {
if (oathbreaker == null) {
oathbreaker = new StorageImmediatelySerialized<Deck>("Oathbreaker decks",
new DeckStorage(new File(ForgeConstants.DECK_OATHBREAKER_DIR), ForgeConstants.DECK_BASE_DIR));
}
return oathbreaker;
}
public IStorage<Deck> getTinyLeaders() {
if (tinyLeaders == null) {
tinyLeaders = new StorageImmediatelySerialized<Deck>("Tiny Leaders decks",

View File

@@ -166,8 +166,10 @@ public final class FModel {
new File(ForgeConstants.USER_FORMATS_DIR), preferences.getPrefBoolean(FPref.LOAD_HISTORIC_FORMATS)));
magicDb.setStandardPredicate(formats.getStandard().getFilterRules());
magicDb.setBrawlPredicate(formats.get("Brawl").getFilterRules());
magicDb.setModernPredicate(formats.getModern().getFilterRules());
magicDb.setCommanderPredicate(formats.get("Commander").getFilterRules());
magicDb.setOathbreakerPredicate(formats.get("Oathbreaker").getFilterRules());
magicDb.setBrawlPredicate(formats.get("Brawl").getFilterRules());
magicDb.setFilteredHandsEnabled(preferences.getPrefBoolean(FPref.FILTERED_HANDS));
magicDb.setMulliganRule(MulliganDefs.MulliganRule.valueOf(preferences.getPref(FPref.MULLIGAN_RULE)));

View File

@@ -143,7 +143,7 @@ public class ConquestUtil {
//remove any cards that aren't allowed in deck due to color identity
if (colorIdentity != MagicColor.ALL_COLORS) {
Predicate<PaperCard> pred = DeckFormat.Commander.isLegalCardForCommanderOrLegalPartnerPredicate(deck.getCommanders());
Predicate<PaperCard> pred = DeckFormat.Commander.isLegalCardForCommanderPredicate(deck.getCommanders());
availableCards.retainAll(Lists.newArrayList(Iterables.filter(availableCards, pred)));
}

View File

@@ -217,6 +217,7 @@ public final class ForgeConstants {
public static final String DECK_SCHEME_DIR = DECK_BASE_DIR + "scheme" + PATH_SEPARATOR;
public static final String DECK_PLANE_DIR = DECK_BASE_DIR + "planar" + PATH_SEPARATOR;
public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander" + PATH_SEPARATOR;
public static final String DECK_OATHBREAKER_DIR = DECK_BASE_DIR + "oathbreaker" + PATH_SEPARATOR;
public static final String DECK_NET_DIR = DECK_BASE_DIR + "net" + PATH_SEPARATOR;
public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR;
public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves" + PATH_SEPARATOR;
@@ -268,6 +269,7 @@ public final class ForgeConstants {
DECK_SCHEME_DIR,
DECK_PLANE_DIR,
DECK_COMMANDER_DIR,
DECK_OATHBREAKER_DIR,
DECK_NET_DIR,
QUEST_SAVE_DIR,
CACHE_TOKEN_PICS_DIR,

View File

@@ -43,6 +43,14 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
COMMANDER_P6_DECK_STATE(""),
COMMANDER_P7_DECK_STATE(""),
COMMANDER_P8_DECK_STATE(""),
OATHBREAKER_P1_DECK_STATE(""),
OATHBREAKER_P2_DECK_STATE(""),
OATHBREAKER_P3_DECK_STATE(""),
OATHBREAKER_P4_DECK_STATE(""),
OATHBREAKER_P5_DECK_STATE(""),
OATHBREAKER_P6_DECK_STATE(""),
OATHBREAKER_P7_DECK_STATE(""),
OATHBREAKER_P8_DECK_STATE(""),
TINY_LEADER_P1_DECK_STATE(""),
TINY_LEADER_P2_DECK_STATE(""),
TINY_LEADER_P3_DECK_STATE(""),
@@ -252,6 +260,12 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
COMMANDER_P5_DECK_STATE, COMMANDER_P6_DECK_STATE,
COMMANDER_P7_DECK_STATE, COMMANDER_P8_DECK_STATE };
public static FPref[] OATHBREAKER_DECK_STATES = {
OATHBREAKER_P1_DECK_STATE, OATHBREAKER_P2_DECK_STATE,
OATHBREAKER_P3_DECK_STATE, OATHBREAKER_P4_DECK_STATE,
OATHBREAKER_P5_DECK_STATE, OATHBREAKER_P6_DECK_STATE,
OATHBREAKER_P7_DECK_STATE, OATHBREAKER_P8_DECK_STATE };
public static FPref[] TINY_LEADER_DECK_STATES = {
TINY_LEADER_P1_DECK_STATE, TINY_LEADER_P2_DECK_STATE,
TINY_LEADER_P3_DECK_STATE, TINY_LEADER_P4_DECK_STATE,