mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
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:
committed by
Michael Kamensky
parent
ce96e64edb
commit
f1e0158102
@@ -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));
|
||||
|
||||
@@ -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)));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user