diff --git a/Mage.Client/pom.xml b/Mage.Client/pom.xml index 2a2970968a0..5d34b27ea81 100644 --- a/Mage.Client/pom.xml +++ b/Mage.Client/pom.xml @@ -25,6 +25,11 @@ mage-common ${project.version} + + org.mage + mage-deck-constructed + ${project.version} + com.googlecode.jspf jspf-core diff --git a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java index f76efc4af01..cdace71dfa6 100644 --- a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java +++ b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java @@ -13,6 +13,8 @@ import java.util.Map; import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionRepository; import mage.constants.SetType; +import mage.deck.Standard; + /** * Utility class for constructed formats (expansions and other editions). @@ -27,7 +29,8 @@ public class ConstructedFormats { public static final String STANDARD = "- Standard"; public static final String EXTENDED = "- Extended"; public static final String MODERN = "- Modern"; - + public static final Standard STANDARD_CARDS = new Standard(); + private static final Map> underlyingSetCodesPerFormat = new HashMap<>(); private static final List formats = new ArrayList<>(); @@ -41,7 +44,7 @@ public class ConstructedFormats { public static String getDefault() { return STANDARD; } - + public static List getSetsByFormat(final String format) { if(!format.equals(ALL)) { return underlyingSetCodesPerFormat.get(format); @@ -55,23 +58,15 @@ public class ConstructedFormats { buildLists(); } } - + private static void buildLists() { - GregorianCalendar cutoff; - // month is zero based so January = 0 - if (calendar.get(Calendar.MONTH) > 8) { - cutoff = new GregorianCalendar(calendar.get(Calendar.YEAR) - 1, Calendar.SEPTEMBER, 1); - } - else { - cutoff = new GregorianCalendar(calendar.get(Calendar.YEAR) - 2, Calendar.SEPTEMBER, 1); - } final Map expansionInfo = new HashMap<>(); formats.clear(); // prevent NPE on sorting if this is not the first try for (ExpansionInfo set : ExpansionRepository.instance.getAll()) { expansionInfo.put(set.getName(), set); formats.add(set.getName()); if (set.getType().equals(SetType.CORE) || set.getType().equals(SetType.EXPANSION)) { - if (set.getReleaseDate().after(cutoff.getTime())) { + if (STANDARD_CARDS.getSetCodes().contains(set.getCode())) { if(underlyingSetCodesPerFormat.get(STANDARD) == null) { underlyingSetCodesPerFormat.put(STANDARD, new ArrayList()); } @@ -90,13 +85,13 @@ public class ConstructedFormats { underlyingSetCodesPerFormat.get(MODERN).add(set.getCode()); } } - + if(underlyingSetCodesPerFormat.get(set.getName()) == null) { underlyingSetCodesPerFormat.put(set.getName(), new ArrayList()); } - + underlyingSetCodesPerFormat.get(set.getName()).add(set.getCode()); - + if(set.getType().equals(SetType.EXPANSION) && set.getBlockName() != null) { String blockDisplayName = getBlockDisplayName(set.getBlockName()); if(underlyingSetCodesPerFormat.get(blockDisplayName) == null) { @@ -104,84 +99,84 @@ public class ConstructedFormats { } underlyingSetCodesPerFormat.get(blockDisplayName).add(set.getCode()); - + if(expansionInfo.get(blockDisplayName) == null) { expansionInfo.put(blockDisplayName, set); formats.add(blockDisplayName); } - + if(expansionInfo.get(blockDisplayName).getReleaseDate().after(set.getReleaseDate())) { expansionInfo.put(blockDisplayName, set); } } - + if(set.getType().equals(SetType.SUPPLEMENTAL) && set.getBlockName() != null) { if(expansionInfo.get(set.getBlockName()) == null) { expansionInfo.put(set.getBlockName(), set); } - + if(expansionInfo.get(set.getBlockName()).getReleaseDate().before(set.getReleaseDate())) { expansionInfo.put(set.getBlockName(), set); } } } - + Collections.sort(formats, new Comparator() { @Override public int compare(String name1, String name2) { ExpansionInfo expansionInfo1 = expansionInfo.get(name1); ExpansionInfo expansionInfo2 = expansionInfo.get(name2); - + if(expansionInfo1.getType().compareTo(expansionInfo2.getType()) == 0) { SetType setType = expansionInfo1.getType(); if(setType.equals(SetType.EXPANSION)) { - + if(expansionInfo1.getBlockName() == null) { if(expansionInfo2.getBlockName() == null) { return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); } - + return 1; } - + if(expansionInfo2.getBlockName() == null) { return -1; } - + //Block comparison if(name1.endsWith("Block") && name2.endsWith("Block")) { return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); } - + if(name1.endsWith("Block")) { if(expansionInfo1.getBlockName().equals(expansionInfo2.getBlockName())) { return -1; } } - + if(name2.endsWith("Block")) { if(expansionInfo1.getBlockName().equals(expansionInfo2.getBlockName())) { return 1; } } - + return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); - + } else if(setType.equals(SetType.SUPPLEMENTAL)) { if(expansionInfo1.getBlockName() == null) { if(expansionInfo2.getBlockName() == null) { return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); } - + return -1; } - + if(expansionInfo2.getBlockName() == null) { return 1; } - + if(expansionInfo1.getBlockName().equals(expansionInfo2.getBlockName())) { //If release date is the same, sort alphabetically. if(expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()) == 0) { @@ -189,7 +184,7 @@ public class ConstructedFormats { } return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); } - + if(expansionInfo1.getBlockName().startsWith("Duel Decks")) { if(expansionInfo1.getBlockName().startsWith("Duel Decks: Anthology")) { return 1; @@ -199,20 +194,20 @@ public class ConstructedFormats { if(expansionInfo2.getBlockName().startsWith("Duel Decks")) { return -1; } - + ExpansionInfo blockInfo1 = expansionInfo.get(expansionInfo1.getBlockName()); ExpansionInfo blockInfo2 = expansionInfo.get(expansionInfo2.getBlockName()); - + return blockInfo2.getReleaseDate().compareTo(blockInfo1.getReleaseDate()); - - + + } else { return expansionInfo2.getReleaseDate().compareTo(expansionInfo1.getReleaseDate()); } } return expansionInfo1.getType().compareTo(expansionInfo2.getType()); } - + }); if (!formats.isEmpty()) { formats.add(0, MODERN); @@ -221,15 +216,15 @@ public class ConstructedFormats { } formats.add(0, ALL); } - + private static String getBlockDisplayName(String blockName) { StringBuilder builder = new StringBuilder(); builder.append("* ").append(blockName).append(" Block"); - + return builder.toString(); } - + private static final Date extendedDate = new GregorianCalendar(2009, 8, 20).getTime(); private static final Date modernDate = new GregorianCalendar(2003, 7, 20).getTime(); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java index a16f5911702..d29cd6eac1c 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java @@ -28,13 +28,16 @@ package mage.deck; +import java.util.ArrayList; import mage.cards.ExpansionSet; import mage.cards.Sets; import mage.cards.decks.Constructed; -import mage.constants.SetType; - -import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.GregorianCalendar; +import java.util.Iterator; +import java.util.List; +import mage.constants.SetType; /** * @@ -45,18 +48,23 @@ public class Standard extends Constructed { public Standard() { super("Constructed - Standard"); GregorianCalendar current = new GregorianCalendar(); - GregorianCalendar cutoff; - // month is zero based so January = 0 - if (current.get(Calendar.MONTH) > 8) { - cutoff = new GregorianCalendar(current.get(Calendar.YEAR) - 1, Calendar.SEPTEMBER, 1); - } - else { - cutoff = new GregorianCalendar(current.get(Calendar.YEAR) - 2, Calendar.SEPTEMBER, 1); - } - for (ExpansionSet set: Sets.getInstance().values()) { - if (set.getReleaseDate().after(cutoff.getTime()) && - (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION)){ + List sets = new ArrayList(Sets.getInstance().values()); + Collections.sort(sets, new Comparator() { + @Override + public int compare(final ExpansionSet lhs, ExpansionSet rhs) { + return lhs.getReleaseDate().after(rhs.getReleaseDate()) ? -1 : 1; + } + }); + int blocksAdded = 0; + for (Iterator iter = sets.iterator(); iter.hasNext() && blocksAdded < 3; ) { + ExpansionSet set = iter.next(); + if (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION) { // Still adding core sets because of Magic Origins setCodes.add(set.getCode()); + if (set.getReleaseDate().before(current.getTime()) // This stops spoiled sets from counting as "new" blocks + && set.getParentSet() == null + && set.getSetType() == SetType.EXPANSION) { + blocksAdded++; + } } } } diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java index 1120bd55fc1..2eac9006d24 100644 --- a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java +++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java @@ -44,7 +44,7 @@ public class ShadowsOverInnistrad extends ExpansionSet { } private ShadowsOverInnistrad() { - super("Shadows over Innistrad", "SOI", "mage.sets.shadowsoverinnistrad", new GregorianCalendar(2016, 4, 8).getTime(), SetType.EXPANSION); + super("Shadows over Innistrad", "SOI", "mage.sets.shadowsoverinnistrad", new GregorianCalendar(2016, 3, 8).getTime(), SetType.EXPANSION); this.blockName = "Shadows over Innistrad"; this.hasBoosters = true; this.numBoosterLands = 1; diff --git a/Mage/src/main/java/mage/cards/decks/Constructed.java b/Mage/src/main/java/mage/cards/decks/Constructed.java index 85cb94b9afa..7824e178feb 100644 --- a/Mage/src/main/java/mage/cards/decks/Constructed.java +++ b/Mage/src/main/java/mage/cards/decks/Constructed.java @@ -60,6 +60,10 @@ public class Constructed extends DeckValidator { super(name); } + public List getSetCodes() { + return setCodes; + } + @Override public boolean validate(Deck deck) { logger.debug("DECK validate start: " + name + " deckname: " + deck.getName()); @@ -141,7 +145,7 @@ public class Constructed extends DeckValidator { logger.debug("DECK validate end: " + name + " deckname: " + deck.getName() + " invalids:" + invalid.size()); return valid; } - + /** * Checks if the given card is legal in any of the given rarities * @param card - the card to check