Merge remote-tracking branch 'core/master' into newBranch

This commit is contained in:
Anthony Calosa
2020-10-23 18:00:36 +08:00
68 changed files with 415 additions and 37 deletions

View File

@@ -124,6 +124,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
private boolean smallSetOverride = false; private boolean smallSetOverride = false;
private String boosterMustContain = ""; private String boosterMustContain = "";
private String boosterReplaceSlotFromPrintSheet = ""; private String boosterReplaceSlotFromPrintSheet = "";
private String[] chaosDraftThemes = new String[0];
private boolean doublePickToStartRound = false; private boolean doublePickToStartRound = false;
private final CardInSet[] cards; private final CardInSet[] cards;
private final Map<String, Integer> tokenNormalized; private final Map<String, Integer> tokenNormalized;
@@ -195,6 +196,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
public boolean getDoublePickToStartRound() { return doublePickToStartRound; } public boolean getDoublePickToStartRound() { return doublePickToStartRound; }
public String getBoosterMustContain() { return boosterMustContain; } public String getBoosterMustContain() { return boosterMustContain; }
public String getBoosterReplaceSlotFromPrintSheet() { return boosterReplaceSlotFromPrintSheet; } public String getBoosterReplaceSlotFromPrintSheet() { return boosterReplaceSlotFromPrintSheet; }
public String[] getChaosDraftThemes() { return chaosDraftThemes; }
public CardInSet[] getCards() { return cards; } public CardInSet[] getCards() { return cards; }
public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others
@@ -385,6 +387,9 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
res.boosterMustContain = section.get("BoosterMustContain", ""); // e.g. Dominaria guaranteed legendary creature res.boosterMustContain = section.get("BoosterMustContain", ""); // e.g. Dominaria guaranteed legendary creature
res.boosterReplaceSlotFromPrintSheet = section.get("BoosterReplaceSlotFromPrintSheet", ""); // e.g. Zendikar Rising guaranteed double-faced card res.boosterReplaceSlotFromPrintSheet = section.get("BoosterReplaceSlotFromPrintSheet", ""); // e.g. Zendikar Rising guaranteed double-faced card
res.chaosDraftThemes = section.get("ChaosDraftThemes", "").split(";"); // semicolon separated list of theme names
return res; return res;
} }

View File

@@ -3,23 +3,20 @@ package forge.item.generation;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.item.BoosterPack; import forge.item.BoosterPack;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.BagRandomizer;
import java.util.List; import java.util.List;
public class ChaosBoosterSupplier implements IUnOpenedProduct { public class ChaosBoosterSupplier implements IUnOpenedProduct {
private List<CardEdition> sets; private BagRandomizer<CardEdition> randomizer;
public ChaosBoosterSupplier(List<CardEdition> sets) { public ChaosBoosterSupplier(Iterable<CardEdition> sets) throws IllegalArgumentException {
this.sets = sets; randomizer = new BagRandomizer<>(sets);
} }
@Override @Override
public List<PaperCard> get() { public List<PaperCard> get() {
if (sets.size() == 0) { final CardEdition set = randomizer.getNextItem();
System.out.println("No chaos boosters left to supply.");
return null;
}
final CardEdition set = sets.remove(0);
final BoosterPack pack = new BoosterPack(set.getCode(), set.getBoosterTemplate()); final BoosterPack pack = new BoosterPack(set.getCode(), set.getBoosterTemplate());
return pack.getCards(); return pack.getCards();
} }

View File

@@ -0,0 +1,76 @@
package forge.util;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
/**
* Data structure that allows random draws from a set number of items,
* where all items are returned once before the first will be retrieved.
* The bag will be shuffled after each time all items have been returned.
* @param <T> an object
*/
public class BagRandomizer<T > implements Iterable<T>{
private static Random random = new SecureRandom();
private T[] bag;
private int currentPosition = 0;
public BagRandomizer(T[] items) throws IllegalArgumentException {
if (items.length == 0) {
throw new IllegalArgumentException("Must include at least one item!");
}
bag = items;
shuffleBag();
}
public BagRandomizer(Iterable<T> items) throws IllegalArgumentException {
ArrayList<T> list = new ArrayList<>();
for (T item : items) {
list.add(item);
}
if (list.size() == 0) {
throw new IllegalArgumentException("Must include at least one item!");
}
bag = (T[]) list.toArray();
shuffleBag();
}
public T getNextItem() {
// reset bag if last position is reached
if (currentPosition >= bag.length) {
shuffleBag();
currentPosition = 0;
}
return bag[currentPosition++];
}
private void shuffleBag() {
int n = bag.length;
for (int i = 0; i < n; i++) {
int r = (int) (random.nextDouble() * (i + 1));
T swap = bag[r];
bag[r] = bag[i];
bag[i] = swap;
}
}
@Override
public Iterator<T> iterator() {
return new BagRandomizerIterator<T>();
}
private class BagRandomizerIterator<T> implements Iterator<T> {
@Override
public boolean hasNext() {
return bag.length > 0;
}
@Override
public T next() {
return (T) BagRandomizer.this.getNextItem();
}
}
}

View File

@@ -0,0 +1,10 @@
# Order, Tag, Label
1, DEFAULT, All sets (default)
11, MODERN, Modern legal expansions
12, PIONEER, Pioneer legal expansions
13, STANDARD, Standard legal expansions
21, CORE_SET, Core Sets
22, MASTERS_SET, Masters Sets (paper only)
30, MIRRODIN, Mirrodin (Plane)
30, RAVNICA, Ravnica (Plane)
40, GRAVEYARD_MATTERS, Graveyard matters

View File

@@ -9,6 +9,7 @@ BoosterCovers=5
Booster=10 Common:!fromSheet("AKH Planeswalker Decks and Toolkit"), 3 Uncommon:!fromSheet("AKH Planeswalker Decks and Toolkit"), 1 RareMythic:!fromSheet("AKH Planeswalker Decks and Toolkit"), 1 BasicLand AKH Booster=10 Common:!fromSheet("AKH Planeswalker Decks and Toolkit"), 3 Uncommon:!fromSheet("AKH Planeswalker Decks and Toolkit"), 1 RareMythic:!fromSheet("AKH Planeswalker Decks and Toolkit"), 1 BasicLand AKH
AdditionalSheetForFoils=fromSheet("MPS Amonkhet Invocations") AdditionalSheetForFoils=fromSheet("MPS Amonkhet Invocations")
AdditionalSetUnlockedInQuest=MPS_AKH AdditionalSetUnlockedInQuest=MPS_AKH
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 M Angel of Sanctions 1 M Angel of Sanctions

View File

@@ -7,6 +7,7 @@ MciCode=avr
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
167 C Abundant Growth 167 C Abundant Growth

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
163 U AEther Flash 163 U AEther Flash

View File

@@ -7,6 +7,7 @@ MciCode=dka
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand ISD Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand ISD
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
81 U Afflicted Deserter 81 U Afflicted Deserter

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN
[cards] [cards]
37 R AEther Snap 37 R AEther Snap

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA
[cards] [cards]
1 C Aurora Eidolon 1 C Aurora Eidolon

View File

@@ -7,6 +7,7 @@ BoosterCovers=3
Booster=8 Common, 3 Uncommon, 2 RareMythic, 2 fromSheet("2XM Foils") Booster=8 Common, 3 Uncommon, 2 RareMythic, 2 fromSheet("2XM Foils")
Foil=NotSupported Foil=NotSupported
DoublePick=true DoublePick=true
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 M Karn Liberated 1 M Karn Liberated

View File

@@ -7,6 +7,7 @@ MciCode=dgm
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!land, 3 Uncommon, 1 RareMythic:!land, 1 fromSheet("DGM Lands") Booster=10 Common:!land, 3 Uncommon, 1 RareMythic:!land, 1 fromSheet("DGM Lands")
ChaosDraftThemes=RAVNICA
[cards] [cards]
1 C Boros Mastiff 1 C Boros Mastiff

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=CORE_SET
[cards] [cards]
117 U Abyssal Specter 117 U Abyssal Specter

View File

@@ -9,6 +9,7 @@ BoosterCovers=3
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand SOI Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand SOI
ChanceReplaceCommonWith=.125F dfc:RareMythic ChanceReplaceCommonWith=.125F dfc:RareMythic
TreatAsSmallSet=true TreatAsSmallSet=true
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 U Abundant Maw 1 U Abundant Maw

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 C Aven Riftwatcher 1 C Aven Riftwatcher

View File

@@ -6,6 +6,7 @@ MciCode=frf
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!land, 3 Uncommon, 1 RareMythic, 1 fromSheet("FRF Lands"), 0 fromSheet("FRF Basic Lands") Booster=10 Common:!land, 3 Uncommon, 1 RareMythic, 1 fromSheet("FRF Lands"), 0 fromSheet("FRF Basic Lands")
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 M Ugin, the Spirit Dragon 1 M Ugin, the Spirit Dragon

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN
[cards] [cards]
1 C Abuna's Chant 1 C Abuna's Chant

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
U AEther Storm U AEther Storm

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
U Abomination U Abomination

View File

@@ -7,6 +7,7 @@ MciCode=gtc
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand RTR Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand RTR
ChaosDraftThemes=RAVNICA
[cards] [cards]
29 U AEtherize 29 U AEtherize

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA
[cards] [cards]
22 U AEtherplasm 22 U AEtherplasm

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("GRN Secret Cards"), 3 Uncommon:!fromSheet("GRN Secret Cards"), 1 RareMythic:!fromSheet("GRN Secret Cards"), 1 fromSheet("GRN Lands") Booster=10 Common:!fromSheet("GRN Secret Cards"), 3 Uncommon:!fromSheet("GRN Secret Cards"), 1 RareMythic:!fromSheet("GRN Secret Cards"), 1 fromSheet("GRN Lands")
AdditionalSetUnlockedInQuest=GK1 AdditionalSetUnlockedInQuest=GK1
ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS
[cards] [cards]
1 C Blade Instructor 1 C Blade Instructor

View File

@@ -10,6 +10,7 @@ Booster=10 Common:!fromSheet("HOU Planeswalker Decks and Toolkit"), 3 Uncommon:!
AdditionalSheetForFoils=fromSheet("MPS Hour of Devastation Invocations") AdditionalSheetForFoils=fromSheet("MPS Hour of Devastation Invocations")
AdditionalSetUnlockedInQuest=MPS_AKH AdditionalSetUnlockedInQuest=MPS_AKH
TreatAsSmallSet=true TreatAsSmallSet=true
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 C Act of Heroism 1 C Act of Heroism

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 C Scion of Ugin 1 C Scion of Ugin

View File

@@ -7,6 +7,7 @@ MciCode=isd
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
85 U Abattoir Ghoul 85 U Abattoir Ghoul

View File

@@ -9,6 +9,7 @@ BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 U Ancestor's Chosen 1 U Ancestor's Chosen

View File

@@ -7,6 +7,7 @@ MciCode=ktk
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand KTK Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand KTK
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 U Abzan Battle Priest 1 U Abzan Battle Priest

View File

@@ -8,6 +8,7 @@ Type=Core
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
U Air Elemental U Air Elemental

View File

@@ -7,6 +7,7 @@ MciCode=m10
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
165 U Acidic Slime 165 U Acidic Slime

View File

@@ -7,6 +7,7 @@ MciCode=m11
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
41 C AEther Adept 41 C AEther Adept

View File

@@ -7,6 +7,7 @@ MciCode=m12
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
41 C AEther Adept 41 C AEther Adept

View File

@@ -7,6 +7,7 @@ MciCode=m13
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
159 U Acidic Slime 159 U Acidic Slime

View File

@@ -7,6 +7,7 @@ MciCode=m14
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 M Ajani, Caller of the Pride 1 M Ajani, Caller of the Pride

View File

@@ -7,6 +7,7 @@ MciCode=m15
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("M15 Sample Cards"), 3 Uncommon:!fromSheet("M15 Sample Cards"), 1 RareMythic:!fromSheet("M15 Sample Cards"), 1 BasicLand Booster=10 Common:!fromSheet("M15 Sample Cards"), 3 Uncommon:!fromSheet("M15 Sample Cards"), 1 RareMythic:!fromSheet("M15 Sample Cards"), 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 M Ajani Steadfast 1 M Ajani Steadfast

View File

@@ -7,6 +7,7 @@ MciCode=m19
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Secret Cards"), 1 RareMythic:!fromSheet("M19 Secret Cards"), 1 fromSheet("M19 Lands") Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Secret Cards"), 1 RareMythic:!fromSheet("M19 Secret Cards"), 1 fromSheet("M19 Lands")
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 U Aegis of the Heavens 1 U Aegis of the Heavens

View File

@@ -6,6 +6,7 @@ MciCode=m20
Type=Core Type=Core
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 fromSheet("M20 Lands") Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 fromSheet("M20 Lands")
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 C Aerial Assault 1 C Aerial Assault

View File

@@ -6,6 +6,7 @@ Type=Core
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!fromSheet("M21 Secret Cards"), 3 Uncommon:!fromSheet("M21 Secret Cards"), 1 RareMythic:!fromSheet("M21 Secret Cards"), 1 fromSheet("M21 Lands") Booster=10 Common:!fromSheet("M21 Secret Cards"), 3 Uncommon:!fromSheet("M21 Secret Cards"), 1 RareMythic:!fromSheet("M21 Secret Cards"), 1 fromSheet("M21 Lands")
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 M Ugin, the Spirit Dragon 1 M Ugin, the Spirit Dragon

View File

@@ -7,6 +7,7 @@ MciCode=ori
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("ORI Sample Cards"), 3 Uncommon:!fromSheet("ORI Sample Cards"), 1 RareMythic:!fromSheet("ORI Sample Cards"), 1 BasicLand Booster=10 Common:!fromSheet("ORI Sample Cards"), 3 Uncommon:!fromSheet("ORI Sample Cards"), 1 RareMythic:!fromSheet("ORI Sample Cards"), 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
1 C Akroan Jailer 1 C Akroan Jailer

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 C Act of Heroism 1 C Act of Heroism

View File

@@ -7,6 +7,7 @@ MciCode=mbs
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=MIRRODIN
[cards] [cards]
1 U Accorder Paladin 1 U Accorder Paladin

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN
[cards] [cards]
141 C AEther Spellbomb 141 C AEther Spellbomb

View File

@@ -7,6 +7,7 @@ MciCode=mh1
Type=Other Type=Other
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("MH1 Secret Cards"), 3 Uncommon:!fromSheet("MH1 Secret Cards"), 1 RareMythic:!fromSheet("MH1 Secret Cards"), 1 fromSheet("MH1 Lands") Booster=10 Common:!fromSheet("MH1 Secret Cards"), 3 Uncommon:!fromSheet("MH1 Secret Cards"), 1 RareMythic:!fromSheet("MH1 Secret Cards"), 1 fromSheet("MH1 Lands")
ChaosDraftThemes=MASTERS_SET;GRAVEYARD_MATTERS
[cards] [cards]

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 R All Is Dust 1 R All Is Dust

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET;GRAVEYARD_MATTERS
[cards] [cards]
1 C Attended Knight 1 C Attended Knight

View File

@@ -7,6 +7,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET
[cards] [cards]
1 R Adarkar Valkyrie 1 R Adarkar Valkyrie

View File

@@ -7,6 +7,7 @@ MciCode=nph
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=MIRRODIN
[cards] [cards]
78 U Act of Aggression 78 U Act of Aggression

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=CORE_SET
[cards] [cards]
317 R Adarkar Wastes 317 R Adarkar Wastes

View File

@@ -9,6 +9,7 @@ BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
60 C AEther Burst 60 C AEther Burst

View File

@@ -7,6 +7,7 @@ MciCode=rna
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Secret Cards"), 1 RareMythic:!fromSheet("RNA Secret Cards"), 1 fromSheet("RNA Lands") Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Secret Cards"), 1 RareMythic:!fromSheet("RNA Secret Cards"), 1 fromSheet("RNA Lands")
ChaosDraftThemes=RAVNICA
[cards] [cards]
1 M Angel of Grace 1 M Angel of Grace

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA
[cards] [cards]
190 R Agrus Kos, Wojek Veteran 190 R Agrus Kos, Wojek Veteran

View File

@@ -7,6 +7,7 @@ MciCode=rtr
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS
[cards] [cards]
141 R Abrupt Decay 141 R Abrupt Decay

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
U Air Elemental U Air Elemental

View File

@@ -7,6 +7,7 @@ MciCode=som
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
ChaosDraftThemes=MIRRODIN
[cards] [cards]
1 U Abuna Acolyte 1 U Abuna Acolyte

View File

@@ -9,6 +9,7 @@ BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
109 C Accelerated Mutation 109 C Accelerated Mutation

View File

@@ -10,6 +10,7 @@ BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=CORE_SET
[cards] [cards]
172 U AEther Flash 172 U AEther Flash

View File

@@ -8,6 +8,7 @@ MciCode=soi
BoosterCovers=5 BoosterCovers=5
Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand Booster=9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc:!Rare:!Mythic, 1 BasicLand
ChanceReplaceCommonWith=.125F dfc:RareMythic ChanceReplaceCommonWith=.125F dfc:RareMythic
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]

View File

@@ -7,6 +7,7 @@ MciCode=10e
Type=Core Type=Core
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand
ChaosDraftThemes=CORE_SET
[cards] [cards]
249 R Abundance 249 R Abundance

View File

@@ -7,6 +7,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!fromSheet("THB Secret Cards"), 3 Uncommon:!fromSheet("THB Secret Cards"), 1 RareMythic:!fromSheet("THB Secret Cards"), 1 BasicLand Booster=10 Common:!fromSheet("THB Secret Cards"), 3 Uncommon:!fromSheet("THB Secret Cards"), 1 RareMythic:!fromSheet("THB Secret Cards"), 1 BasicLand
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
1 U Alseid of Life's Bounty 1 U Alseid of Life's Bounty

View File

@@ -9,6 +9,7 @@ BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
90 C Accelerate 90 C Accelerate

View File

@@ -8,6 +8,7 @@ Type=Reprint
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 RareMythic Booster=11 Common, 3 Uncommon, 1 RareMythic
FoilChanceInBooster=100 FoilChanceInBooster=100
ChaosDraftThemes=MASTERS_SET;GRAVEYARD_MATTERS
[cards] [cards]
1 R All Is Dust 1 R All Is Dust

View File

@@ -9,6 +9,7 @@ Border=White
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=CORE_SET
[cards] [cards]
U Air Elemental U Air Elemental

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:!fromSheet("WAR Secret Cards"), 3 Uncommon:!fromSheet("WAR Secret Cards"), 1 RareMythic:!fromSheet("WAR Secret Cards"), 1 BasicLand Booster=10 Common:!fromSheet("WAR Secret Cards"), 3 Uncommon:!fromSheet("WAR Secret Cards"), 1 RareMythic:!fromSheet("WAR Secret Cards"), 1 BasicLand
BoosterMustContain=Planeswalker BoosterMustContain=Planeswalker
ChaosDraftThemes=RAVNICA
[cards] [cards]
1 R Karn, the Great Creator 1 R Karn, the Great Creator

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
Foil=NotSupported Foil=NotSupported
ChaosDraftThemes=GRAVEYARD_MATTERS
[cards] [cards]
U AEther Flash U AEther Flash

View File

@@ -1929,6 +1929,7 @@ lblPlanarDeckZone=Weltendeck
lblNoneZone=Keine lblNoneZone=Keine
#BoosterDraft.java #BoosterDraft.java
lblChooseBlock=Wähle Block lblChooseBlock=Wähle Block
lblChooseChaosTheme=Wähle ein Chaos-Draft-Thema
lblBlockNotContainSetCombinations={0} enthält keine Set-Auswahl. lblBlockNotContainSetCombinations={0} enthält keine Set-Auswahl.
lblChooseSetCombination=Treffe Set-Auswahl lblChooseSetCombination=Treffe Set-Auswahl
lblNotFoundCustomDraftFiles=Keine angepaßte Draft-Datei gefunden. lblNotFoundCustomDraftFiles=Keine angepaßte Draft-Datei gefunden.

View File

@@ -1929,6 +1929,7 @@ lblPlanarDeckZone=planardeck
lblNoneZone=none lblNoneZone=none
#BoosterDraft.java #BoosterDraft.java
lblChooseBlock=Choose Block lblChooseBlock=Choose Block
lblChooseChaosTheme=Choose Chaos Draft Theme
lblBlockNotContainSetCombinations={0} does not contain any set combinations. lblBlockNotContainSetCombinations={0} does not contain any set combinations.
lblChooseSetCombination=Choose Set Combination lblChooseSetCombination=Choose Set Combination
lblNotFoundCustomDraftFiles=No custom draft files found. lblNotFoundCustomDraftFiles=No custom draft files found.

View File

@@ -20,7 +20,6 @@ package forge.limited;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.StaticData; import forge.StaticData;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.deck.CardPool; import forge.deck.CardPool;
@@ -41,7 +40,6 @@ import forge.util.gui.SGuiChoose;
import forge.util.gui.SOptionPane; import forge.util.gui.SOptionPane;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;
import forge.util.Localizer; import forge.util.Localizer;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import java.io.File; import java.io.File;
@@ -181,34 +179,40 @@ public class BoosterDraft implements IBoosterDraft {
break; break;
case Chaos: case Chaos:
/**
* A chaos draft consists of boosters from many different sets.
* Default settings are boosters from all sets with a booster size of 15 cards.
* Alternatively, the sets can be restricted to a format like Modern or to a theme.
* Examples for themes: sets that take place on a certain plane, core sets, masters sets,
* or sets that share a mechanic.
*/
// Get chaos draft themes
final List<ThemedChaosDraft> themes = new ArrayList<>();
final IStorage<ThemedChaosDraft> themeStorage = FModel.getThemedChaosDrafts();
for (final ThemedChaosDraft theme : themeStorage) {
themes.add(theme);
}
Collections.sort(themes); // sort for user interface
// Ask user to select theme
final String dialogQuestion = Localizer.getInstance().getMessage("lblChooseChaosTheme");
final ThemedChaosDraft theme = SGuiChoose.oneOrNone(dialogQuestion, themes);
if (theme == null) {
return false; // abort if no theme is selected
}
// Filter all sets by theme restrictions
final Predicate<CardEdition> themeFilter = theme.getEditionFilter();
final CardEdition.Collection allEditions = StaticData.instance().getEditions(); final CardEdition.Collection allEditions = StaticData.instance().getEditions();
final Iterable<CardEdition> chaosDraftEditions = Iterables.filter(allEditions.getOrderedEditions(), new Predicate<CardEdition>() { final Iterable<CardEdition> chaosDraftEditions = Iterables.filter(
@Override allEditions.getOrderedEditions(),
public boolean apply(final CardEdition cardEdition) { themeFilter);
boolean isExpansion = cardEdition.getType().equals(CardEdition.Type.EXPANSION); // Add chaos "boosters" as special suppliers
boolean isCoreSet = cardEdition.getType().equals(CardEdition.Type.CORE); final Supplier<List<PaperCard>> ChaosDraftSupplier;
boolean isReprintSet = cardEdition.getType().equals(CardEdition.Type.REPRINT); try {
if (isExpansion || isCoreSet || isReprintSet) { ChaosDraftSupplier = new ChaosBoosterSupplier(chaosDraftEditions);
// Only allow sets with 15 cards in booster packs } catch(IllegalArgumentException e) {
if (cardEdition.hasBoosterTemplate()) { System.out.println(e.getMessage());
final List<Pair<String, Integer>> slots = cardEdition.getBoosterTemplate().getSlots();
int boosterSize = 0;
for (Pair<String, Integer> slot : slots) {
boosterSize += slot.getRight();
}
return boosterSize == 15;
}
}
return false; return false;
} }
});
// Randomize order of sets
List<CardEdition> shuffled = Lists.newArrayList(chaosDraftEditions);
Collections.shuffle(shuffled);
final Supplier<List<PaperCard>> ChaosDraftSupplier = new ChaosBoosterSupplier(shuffled);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
this.product.add(ChaosDraftSupplier); this.product.add(ChaosDraftSupplier);
} }

View File

@@ -0,0 +1,218 @@
package forge.limited;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import forge.card.CardEdition;
import forge.game.GameFormat;
import forge.model.FModel;
import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile;
import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
/**
* Themed chaos draft allows limiting the pool of available random boosters for a draft to a certain theme.
*/
public class ThemedChaosDraft implements Comparable<ThemedChaosDraft> {
private final String tag;
private final String label;
private final int orderNumber;
/**
* @param tag Tag name used in edition files.
* @param label Label used in user interface.
* @param orderNumber Number used to order entries in user interface.
*/
public ThemedChaosDraft(String tag, String label, int orderNumber) {
this.tag = tag;
this.label = label;
this.orderNumber = orderNumber;
}
/**
* @return theme tag
*/
public String getTag() { return tag; }
/**
* @return theme label
*/
public String getLabel() { return label; }
/**
* @return theme order number
*/
public int getOrderNumber() { return orderNumber; }
/**
* @return Predicate to sort out editions not belonging to the chaos draft theme
*/
public Predicate<CardEdition> getEditionFilter() {
Predicate<CardEdition> filter;
switch(tag) {
case "DEFAULT":
filter = DEFAULT_FILTER;
break;
case "MODERN":
case "PIONEER":
case "STANDARD":
filter = getFormatFilter(tag);
break;
default:
filter = themedFilter;
}
return filter;
}
/**
* Filter to select editions by ChaosDraftThemes tag defined in edition files.
* Tag must be defined in res/blockdata/chaosdraftthemes.txt
*/
private final Predicate<CardEdition> themedFilter = new Predicate<CardEdition>() {
@Override
public boolean apply(final CardEdition cardEdition) {
String[] themes = cardEdition.getChaosDraftThemes();
for (String theme : themes) {
if (tag.equals(theme)) return true;
}
return false;
}
};
/**
* @param formatName format to filter by, currently supported: MODERN, PIONEER, STANDARD
* @return Filter to select editions belonging to a certain constructed format.
*/
private Predicate<CardEdition> getFormatFilter(String formatName) {
GameFormat.Collection formats = FModel.getFormats();
GameFormat format;
switch(formatName) {
case "MODERN":
format = formats.getModern();
break;
case "PIONEER":
format = formats.getPioneer();
break;
case "STANDARD":
default:
format = formats.getStandard();
}
return new Predicate<CardEdition>() {
@Override
public boolean apply(final CardEdition cardEdition){
return DEFAULT_FILTER.apply(cardEdition) && format.isSetLegal(cardEdition.getCode());
}
};
}
/**
* Default filter that only allows actual sets that were printed as 15-card boosters
*/
private static final Predicate<CardEdition> DEFAULT_FILTER = new Predicate<CardEdition>() {
@Override
public boolean apply(final CardEdition cardEdition) {
boolean isExpansion = cardEdition.getType().equals(CardEdition.Type.EXPANSION);
boolean isCoreSet = cardEdition.getType().equals(CardEdition.Type.CORE);
boolean isReprintSet = cardEdition.getType().equals(CardEdition.Type.REPRINT);
if (isExpansion || isCoreSet || isReprintSet) {
// Only allow sets with 15 cards in booster packs
if (cardEdition.hasBoosterTemplate()) {
final List<Pair<String, Integer>> slots = cardEdition.getBoosterTemplate().getSlots();
int boosterSize = 0;
for (Pair<String, Integer> slot : slots) {
boosterSize += slot.getRight();
}
return boosterSize == 15;
}
}
return false;
}
};
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return this.label;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + ((this.tag == null) ? 0 : this.tag.hashCode());
result = (prime * result) + ((this.label == null) ? 0 : this.label.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(ThemedChaosDraft other) {
return (this.orderNumber != other.orderNumber)
? this.orderNumber - other.orderNumber
: this.label.compareTo(other.label);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
final ThemedChaosDraft other = (ThemedChaosDraft) obj;
if (!this.label.equals(other.label)) {
return false;
}
if (!this.tag.equals(other.tag)) {
return false;
}
return true;
}
public static final Function<ThemedChaosDraft, String> FN_GET_TAG = new Function<ThemedChaosDraft, String>() {
@Override
public String apply(ThemedChaosDraft themedChaosBooster) {
return themedChaosBooster.getTag();
}
};
public static class Reader extends StorageReaderFile<ThemedChaosDraft> {
public Reader(String pathname) {
super(pathname, ThemedChaosDraft.FN_GET_TAG);
}
@Override
protected ThemedChaosDraft read(String line, int idx) {
final String[] sParts = TextUtil.splitWithParenthesis(line, ',', 3);
int orderNumber = Integer.parseInt(sParts[0].trim(), 10);
String tag = sParts[1].trim();
String label = sParts[2].trim();
return new ThemedChaosDraft(tag, label, orderNumber);
}
}
}

View File

@@ -37,6 +37,7 @@ import forge.gauntlet.GauntletData;
import forge.interfaces.IProgressBar; import forge.interfaces.IProgressBar;
import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.ItemManagerConfig;
import forge.limited.GauntletMini; import forge.limited.GauntletMini;
import forge.limited.ThemedChaosDraft;
import forge.planarconquest.ConquestController; import forge.planarconquest.ConquestController;
import forge.planarconquest.ConquestPlane; import forge.planarconquest.ConquestPlane;
import forge.planarconquest.ConquestPreferences; import forge.planarconquest.ConquestPreferences;
@@ -91,6 +92,7 @@ public final class FModel {
private static IStorage<CardBlock> blocks; private static IStorage<CardBlock> blocks;
private static IStorage<CardBlock> fantasyBlocks; private static IStorage<CardBlock> fantasyBlocks;
private static IStorage<ThemedChaosDraft> themedChaosDrafts;
private static IStorage<ConquestPlane> planes; private static IStorage<ConquestPlane> planes;
private static IStorage<QuestWorld> worlds; private static IStorage<QuestWorld> worlds;
private static GameFormat.Collection formats; private static GameFormat.Collection formats;
@@ -187,6 +189,7 @@ public final class FModel {
questPreferences = new QuestPreferences(); questPreferences = new QuestPreferences();
conquestPreferences = new ConquestPreferences(); conquestPreferences = new ConquestPreferences();
fantasyBlocks = new StorageBase<>("Custom blocks", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "fantasyblocks.txt", magicDb.getEditions())); fantasyBlocks = new StorageBase<>("Custom blocks", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "fantasyblocks.txt", magicDb.getEditions()));
themedChaosDrafts = new StorageBase<>("Themed Chaos Drafts", new ThemedChaosDraft.Reader(ForgeConstants.BLOCK_DATA_DIR + "chaosdraftthemes.txt"));
planes = new StorageBase<>("Conquest planes", new ConquestPlane.Reader(ForgeConstants.CONQUEST_PLANES_DIR + "planes.txt")); planes = new StorageBase<>("Conquest planes", new ConquestPlane.Reader(ForgeConstants.CONQUEST_PLANES_DIR + "planes.txt"));
Map<String, QuestWorld> standardWorlds = new QuestWorld.Reader(ForgeConstants.QUEST_WORLD_DIR + "worlds.txt").readAll(); Map<String, QuestWorld> standardWorlds = new QuestWorld.Reader(ForgeConstants.QUEST_WORLD_DIR + "worlds.txt").readAll();
Map<String, QuestWorld> customWorlds = new QuestWorld.Reader(ForgeConstants.USER_QUEST_WORLD_DIR + "customworlds.txt").readAll(); Map<String, QuestWorld> customWorlds = new QuestWorld.Reader(ForgeConstants.USER_QUEST_WORLD_DIR + "customworlds.txt").readAll();
@@ -383,6 +386,10 @@ public final class FModel {
return fantasyBlocks; return fantasyBlocks;
} }
public static IStorage<ThemedChaosDraft> getThemedChaosDrafts() {
return themedChaosDrafts;
}
public static TournamentData getTournamentData() { return tournamentData; } public static TournamentData getTournamentData() { return tournamentData; }
public static void setTournamentData(TournamentData tournamentData) { FModel.tournamentData = tournamentData; } public static void setTournamentData(TournamentData tournamentData) { FModel.tournamentData = tournamentData; }