Merge remote-tracking branch 'upstream/master' into collector-number-in-card-list-and-card-db-refactoring

This commit is contained in:
leriomaggio
2021-07-25 08:09:09 +01:00
116 changed files with 263 additions and 254 deletions

View File

@@ -291,14 +291,12 @@ public class ComputerUtilCombat {
* @return a int. * @return a int.
*/ */
public static int lifeThatWouldRemain(final Player ai, final Combat combat) { public static int lifeThatWouldRemain(final Player ai, final Combat combat) {
int damage = 0; int damage = 0;
final List<Card> attackers = combat.getAttackersOf(ai); final List<Card> attackers = combat.getAttackersOf(ai);
final List<Card> unblocked = Lists.newArrayList(); final List<Card> unblocked = Lists.newArrayList();
for (final Card attacker : attackers) { for (final Card attacker : attackers) {
final List<Card> blockers = combat.getBlockers(attacker); final List<Card> blockers = combat.getBlockers(attacker);
if ((blockers.size() == 0) if ((blockers.size() == 0)
@@ -418,7 +416,6 @@ public class ComputerUtilCombat {
final List<Card> threateningCommanders = getLifeThreateningCommanders(ai,combat); final List<Card> threateningCommanders = getLifeThreateningCommanders(ai,combat);
for (final Card attacker : attackers) { for (final Card attacker : attackers) {
final List<Card> blockers = combat.getBlockers(attacker); final List<Card> blockers = combat.getBlockers(attacker);
if (blockers.isEmpty()) { if (blockers.isEmpty()) {
@@ -2266,7 +2263,7 @@ public class ComputerUtilCombat {
if (!re.matchesValidParam("ValidSource", source)) { if (!re.matchesValidParam("ValidSource", source)) {
continue; continue;
} }
if (!re.matchesValidParam("ValidTarget", source)) { if (!re.matchesValidParam("ValidTarget", target)) {
continue; continue;
} }
if (re.hasParam("IsCombat")) { if (re.hasParam("IsCombat")) {

View File

@@ -138,7 +138,7 @@ public class CardStorageReader {
final CardRules.Reader rulesReader = new CardRules.Reader(); final CardRules.Reader rulesReader = new CardRules.Reader();
final List<CardRules> result = new ArrayList<>(); final List<CardRules> result = new ArrayList<>();
for(int i = from; i < to; i++) { for (int i = from; i < to; i++) {
final ZipEntry ze = files.get(i); final ZipEntry ze = files.get(i);
// if (ze.getName().endsWith(CardStorageReader.CARD_FILE_DOT_EXTENSION)) // already filtered! // if (ze.getName().endsWith(CardStorageReader.CARD_FILE_DOT_EXTENSION)) // already filtered!
result.add(this.loadCard(rulesReader, ze)); result.add(this.loadCard(rulesReader, ze));
@@ -315,11 +315,11 @@ public class CardStorageReader {
final List<Future<List<CardRules>>> parts = executor.invokeAll(tasks); final List<Future<List<CardRules>>> parts = executor.invokeAll(tasks);
executor.shutdown(); executor.shutdown();
cdl.await(); cdl.await();
for(final Future<List<CardRules>> pp : parts) { for (final Future<List<CardRules>> pp : parts) {
result.addAll(pp.get()); result.addAll(pp.get());
} }
} else { } else {
for(final Callable<List<CardRules>> c : tasks) { for (final Callable<List<CardRules>> c : tasks) {
result.addAll(c.call()); result.addAll(c.call());
} }
} }

View File

@@ -240,7 +240,6 @@ public class StaticData {
private void tryToLoadCard(String requestInfo){ private void tryToLoadCard(String requestInfo){
CardDb.CardRequest r = CardRequest.fromString(requestInfo); CardDb.CardRequest r = CardRequest.fromString(requestInfo);
String cardName = r.cardName; String cardName = r.cardName;
String setCode = r.edition;
CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); CardRules rules = cardReader.attemptToLoadCard(cardName, setCode);
CardRules customRules = null; CardRules customRules = null;
if (customCardReader != null) { if (customCardReader != null) {
@@ -258,14 +257,6 @@ public class StaticData {
} }
} }
// TODO Remove these in favor of them being associated to the Edition
/** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */
public IStorage<FatPack.Template> getFatPacks() {
if (fatPacks == null)
fatPacks = new StorageBase<>("Fat packs", new FatPack.Template.Reader(blockDataFolder + "fatpacks.txt"));
return fatPacks;
}
/** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */
public final IStorage<SealedProduct.Template> getTournamentPacks() { public final IStorage<SealedProduct.Template> getTournamentPacks() {
if (tournaments == null) if (tournaments == null)

View File

@@ -84,6 +84,16 @@ public final class CardEdition implements Comparable<CardEdition> {
} }
} }
public String getFatPackDefault() {
switch (this) {
case CORE:
case EXPANSION:
return "10";
default:
return "0";
}
}
public String toString(){ public String toString(){
String[] names = TextUtil.splitWithParenthesis(this.name().toLowerCase(), '_'); String[] names = TextUtil.splitWithParenthesis(this.name().toLowerCase(), '_');
for (int i = 0; i < names.length; i++) for (int i = 0; i < names.length; i++)
@@ -128,7 +138,8 @@ public final class CardEdition implements Comparable<CardEdition> {
BUY_A_BOX("buy a box"), BUY_A_BOX("buy a box"),
PROMO("promo"), PROMO("promo"),
BUNDLE("bundle"), BUNDLE("bundle"),
BOX_TOPPER("box topper"); BOX_TOPPER("box topper"),
DUNGEONS("dungeons");
private final String name; private final String name;
@@ -242,6 +253,8 @@ public final class CardEdition implements Comparable<CardEdition> {
// SealedProduct // SealedProduct
private String prerelease = null; private String prerelease = null;
private int boosterBoxCount = 36; private int boosterBoxCount = 36;
private int fatPackCount = 10;
private String fatPackExtraSlots = "";
// Booster/draft info // Booster/draft info
private boolean smallSetOverride = false; private boolean smallSetOverride = false;
@@ -332,6 +345,8 @@ public final class CardEdition implements Comparable<CardEdition> {
public String getPrerelease() { return prerelease; } public String getPrerelease() { return prerelease; }
public int getBoosterBoxCount() { return boosterBoxCount; } public int getBoosterBoxCount() { return boosterBoxCount; }
public int getFatPackCount() { return fatPackCount; }
public String getFatPackExtraSlots() { return fatPackExtraSlots; }
public FoilType getFoilType() { return foilType; } public FoilType getFoilType() { return foilType; }
public double getFoilChanceInBooster() { return foilChanceInBooster; } public double getFoilChanceInBooster() { return foilChanceInBooster; }
@@ -441,11 +456,11 @@ public final class CardEdition implements Comparable<CardEdition> {
Map<String, Integer> cardToIndex = new HashMap<>(); Map<String, Integer> cardToIndex = new HashMap<>();
List<PrintSheet> sheets = Lists.newArrayList(); List<PrintSheet> sheets = Lists.newArrayList();
for(String sectionName : cardMap.keySet()) { for (String sectionName : cardMap.keySet()) {
PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sectionName)); PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sectionName));
List<CardInSet> cards = cardMap.get(sectionName); List<CardInSet> cards = cardMap.get(sectionName);
for(CardInSet card : cards) { for (CardInSet card : cards) {
int index = 1; int index = 1;
if (cardToIndex.containsKey(card.name)) { if (cardToIndex.containsKey(card.name)) {
index = cardToIndex.get(card.name); index = cardToIndex.get(card.name);
@@ -460,7 +475,7 @@ public final class CardEdition implements Comparable<CardEdition> {
sheets.add(sheet); sheets.add(sheet);
} }
for(String sheetName : customPrintSheetsToParse.keySet()) { for (String sheetName : customPrintSheetsToParse.keySet()) {
List<String> sheetToParse = customPrintSheetsToParse.get(sheetName); List<String> sheetToParse = customPrintSheetsToParse.get(sheetName);
CardPool sheetPool = CardPool.fromCardList(sheetToParse); CardPool sheetPool = CardPool.fromCardList(sheetToParse);
PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sheetName), sheetPool); PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sheetName), sheetPool);
@@ -543,7 +558,7 @@ public final class CardEdition implements Comparable<CardEdition> {
// parse tokens section // parse tokens section
if (contents.containsKey("tokens")) { if (contents.containsKey("tokens")) {
for(String line : contents.get("tokens")) { for (String line : contents.get("tokens")) {
if (StringUtils.isBlank(line)) if (StringUtils.isBlank(line))
continue; continue;
@@ -571,11 +586,11 @@ public final class CardEdition implements Comparable<CardEdition> {
res.mciCode = res.code2.toLowerCase(); res.mciCode = res.code2.toLowerCase();
} }
res.scryfallCode = section.get("ScryfallCode"); res.scryfallCode = section.get("ScryfallCode");
if (res.scryfallCode == null){ if (res.scryfallCode == null) {
res.scryfallCode = res.code; res.scryfallCode = res.code;
} }
res.cardsLanguage = section.get("CardLang"); res.cardsLanguage = section.get("CardLang");
if (res.cardsLanguage == null){ if (res.cardsLanguage == null) {
res.cardsLanguage = "en"; res.cardsLanguage = "en";
} }
@@ -617,8 +632,10 @@ public final class CardEdition implements Comparable<CardEdition> {
res.type = enumType; res.type = enumType;
res.prerelease = section.get("Prerelease", null); res.prerelease = section.get("Prerelease", null);
res.boosterBoxCount = Integer.parseInt(section.get("BoosterBox", enumType.getBoosterBoxDefault())); res.boosterBoxCount = Integer.parseInt(section.get("BoosterBox", enumType.getBoosterBoxDefault()));
res.fatPackCount = Integer.parseInt(section.get("FatPack", enumType.getFatPackDefault()));
res.fatPackExtraSlots = section.get("FatPackExtraSlots", "");
switch(section.get("foil", "newstyle").toLowerCase()) { switch (section.get("foil", "newstyle").toLowerCase()) {
case "notsupported": case "notsupported":
res.foilType = FoilType.NOT_SUPPORTED; res.foilType = FoilType.NOT_SUPPORTED;
break; break;
@@ -751,7 +768,7 @@ public final class CardEdition implements Comparable<CardEdition> {
@Override @Override
public Map<String, SealedProduct.Template> readAll() { public Map<String, SealedProduct.Template> readAll() {
Map<String, SealedProduct.Template> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); Map<String, SealedProduct.Template> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for(CardEdition ce : Collection.this) { for (CardEdition ce : Collection.this) {
List<String> boosterTypes = Lists.newArrayList(ce.getAvailableBoosterTypes()); List<String> boosterTypes = Lists.newArrayList(ce.getAvailableBoosterTypes());
for (String type : boosterTypes) { for (String type : boosterTypes) {
String setAffix = type.equals("Draft") ? "" : type; String setAffix = type.equals("Draft") ? "" : type;
@@ -805,14 +822,14 @@ public final class CardEdition implements Comparable<CardEdition> {
strictness = CardArtPreference.ORIGINAL_ART_ALL_EDITIONS; // card is not found in core and expansions only (probably something CMD or C13) strictness = CardArtPreference.ORIGINAL_ART_ALL_EDITIONS; // card is not found in core and expansions only (probably something CMD or C13)
cp = StaticData.instance().getCommonCards().getCardFromEditions(k.getKey().getName(), strictness); cp = StaticData.instance().getCommonCards().getCardFromEditions(k.getKey().getName(), strictness);
} }
if ( cp == null ) if (cp == null)
cp = k.getKey(); // it's unlikely, this code will ever run cp = k.getKey(); // it's unlikely, this code will ever run
minEditions.add(cp.getEdition()); minEditions.add(cp.getEdition());
} }
for(CardEdition ed : getOrderedEditions()) { for (CardEdition ed : getOrderedEditions()) {
if(minEditions.contains(ed.getCode())) if (minEditions.contains(ed.getCode()))
return ed; return ed;
} }
return UNKNOWN; return UNKNOWN;
@@ -854,7 +871,7 @@ public final class CardEdition implements Comparable<CardEdition> {
private static class CanMakeFatPack implements Predicate<CardEdition> { private static class CanMakeFatPack implements Predicate<CardEdition> {
@Override @Override
public boolean apply(final CardEdition subject) { public boolean apply(final CardEdition subject) {
return StaticData.instance().getFatPacks().contains(subject.getCode()); return subject.getFatPackCount() > 0;
} }
} }

View File

@@ -513,14 +513,14 @@ public final class CardRules implements ICardCharacteristics {
case 'S': case 'S':
if ("S".equals(key)) { if ("S".equals(key)) {
this.faces[this.curFace].addStaticAbility(value); this.faces[this.curFace].addStaticAbility(value);
} else if ( "SVar".equals(key) ) { } else if ("SVar".equals(key)) {
if ( null == value ) throw new IllegalArgumentException("SVar has no variable name"); if (null == value) throw new IllegalArgumentException("SVar has no variable name");
colonPos = value.indexOf(':'); colonPos = value.indexOf(':');
String variable = colonPos > 0 ? value.substring(0, colonPos) : value; String variable = colonPos > 0 ? value.substring(0, colonPos) : value;
value = colonPos > 0 ? value.substring(1+colonPos) : null; value = colonPos > 0 ? value.substring(1+colonPos) : null;
if ( "Picture".equals(variable) ) { if ("Picture".equals(variable)) {
this.pictureUrl[this.curFace] = value; this.pictureUrl[this.curFace] = value;
} else } else
this.faces[curFace].addSVar(variable, value); this.faces[curFace].addSVar(variable, value);

View File

@@ -451,8 +451,7 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
if (calculatedType == null) { if (calculatedType == null) {
if (subtypes.isEmpty()) { if (subtypes.isEmpty()) {
calculatedType = StringUtils.join(getTypesBeforeDash(), ' '); calculatedType = StringUtils.join(getTypesBeforeDash(), ' ');
} } else {
else {
calculatedType = StringUtils.join(getTypesBeforeDash(), ' ') + " - " + StringUtils.join(subtypes, " "); calculatedType = StringUtils.join(getTypesBeforeDash(), ' ') + " - " + StringUtils.join(subtypes, " ");
} }
} }

View File

@@ -84,7 +84,7 @@ public final class MagicColor {
} }
public static String toShortString(final byte color) { public static String toShortString(final byte color) {
switch (color){ switch (color) {
case WHITE: return "W"; case WHITE: return "W";
case BLUE: return "U"; case BLUE: return "U";
case BLACK: return "B"; case BLACK: return "B";
@@ -95,7 +95,7 @@ public final class MagicColor {
} }
public static String toLongString(final byte color) { public static String toLongString(final byte color) {
switch (color){ switch (color) {
case WHITE: return Constant.WHITE; case WHITE: return Constant.WHITE;
case BLUE: return Constant.BLUE; case BLUE: return Constant.BLUE;
case BLACK: return Constant.BLACK; case BLACK: return Constant.BLACK;

View File

@@ -29,8 +29,8 @@ public class PrintSheet {
public static final IStorage<PrintSheet> initializePrintSheets(File sheetsFile, CardEdition.Collection editions) { public static final IStorage<PrintSheet> initializePrintSheets(File sheetsFile, CardEdition.Collection editions) {
IStorage<PrintSheet> sheets = new StorageExtendable<>("Special print runs", new PrintSheet.Reader(sheetsFile)); IStorage<PrintSheet> sheets = new StorageExtendable<>("Special print runs", new PrintSheet.Reader(sheetsFile));
for(CardEdition edition : editions) { for (CardEdition edition : editions) {
for(PrintSheet ps : edition.getPrintSheetsBySection()) { for (PrintSheet ps : edition.getPrintSheetsBySection()) {
sheets.add(ps.name, ps); sheets.add(ps.name, ps);
} }
} }
@@ -64,7 +64,7 @@ public class PrintSheet {
} }
public void addAll(Iterable<PaperCard> cards, int weight) { public void addAll(Iterable<PaperCard> cards, int weight) {
for(PaperCard card : cards) for (PaperCard card : cards)
cardsWithWeights.add(card, weight); cardsWithWeights.add(card, weight);
} }
@@ -78,15 +78,15 @@ public class PrintSheet {
private PaperCard fetchRoulette(int start, int roulette, Collection<PaperCard> toSkip) { private PaperCard fetchRoulette(int start, int roulette, Collection<PaperCard> toSkip) {
int sum = start; int sum = start;
boolean isSecondRun = start > 0; boolean isSecondRun = start > 0;
for(Entry<PaperCard, Integer> cc : cardsWithWeights ) { for (Entry<PaperCard, Integer> cc : cardsWithWeights ) {
sum += cc.getValue(); sum += cc.getValue();
if( sum > roulette ) { if (sum > roulette) {
if( toSkip != null && toSkip.contains(cc.getKey())) if (toSkip != null && toSkip.contains(cc.getKey()))
continue; continue;
return cc.getKey(); return cc.getKey();
} }
} }
if( isSecondRun ) if (isSecondRun)
throw new IllegalStateException("Print sheet does not have enough unique cards"); throw new IllegalStateException("Print sheet does not have enough unique cards");
return fetchRoulette(sum + 1, roulette, toSkip); // start over from beginning, in case last cards were to skip return fetchRoulette(sum + 1, roulette, toSkip); // start over from beginning, in case last cards were to skip
@@ -94,8 +94,8 @@ public class PrintSheet {
public List<PaperCard> all() { public List<PaperCard> all() {
List<PaperCard> result = new ArrayList<>(); List<PaperCard> result = new ArrayList<>();
for(Entry<PaperCard, Integer> kv : cardsWithWeights) { for (Entry<PaperCard, Integer> kv : cardsWithWeights) {
for(int i = 0; i < kv.getValue(); i++) { for (int i = 0; i < kv.getValue(); i++) {
result.add(kv.getKey()); result.add(kv.getKey());
} }
} }
@@ -106,26 +106,26 @@ public class PrintSheet {
List<PaperCard> result = new ArrayList<>(); List<PaperCard> result = new ArrayList<>();
int totalWeight = cardsWithWeights.countAll(); int totalWeight = cardsWithWeights.countAll();
if( totalWeight == 0) { if (totalWeight == 0) {
System.err.println("No cards were found on sheet " + name); System.err.println("No cards were found on sheet " + name);
return result; return result;
} }
// If they ask for 40 unique basic lands (to make a fatpack) out of 20 distinct possible, add the whole print run N times. // If they ask for 40 unique basic lands (to make a fatpack) out of 20 distinct possible, add the whole print run N times.
int uniqueCards = cardsWithWeights.countDistinct(); int uniqueCards = cardsWithWeights.countDistinct();
while ( number >= uniqueCards ) { while (number >= uniqueCards) {
for(Entry<PaperCard, Integer> kv : cardsWithWeights) { for (Entry<PaperCard, Integer> kv : cardsWithWeights) {
result.add(kv.getKey()); result.add(kv.getKey());
} }
number -= uniqueCards; number -= uniqueCards;
} }
List<PaperCard> uniques = wantUnique ? new ArrayList<>() : null; List<PaperCard> uniques = wantUnique ? new ArrayList<>() : null;
for(int iC = 0; iC < number; iC++) { for (int iC = 0; iC < number; iC++) {
int index = MyRandom.getRandom().nextInt(totalWeight); int index = MyRandom.getRandom().nextInt(totalWeight);
PaperCard toAdd = fetchRoulette(0, index, wantUnique ? uniques : null); PaperCard toAdd = fetchRoulette(0, index, wantUnique ? uniques : null);
result.add(toAdd); result.add(toAdd);
if( wantUnique ) if (wantUnique)
uniques.add(toAdd); uniques.add(toAdd);
} }
return result; return result;

View File

@@ -257,7 +257,7 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
// I used to store planes and schemes under sideboard header, so this will assign them to a correct section // I used to store planes and schemes under sideboard header, so this will assign them to a correct section
IPaperCard sample = pool.get(0); IPaperCard sample = pool.get(0);
if (sample != null && ( sample.getRules().getType().isPlane() || sample.getRules().getType().isPhenomenon())) if (sample != null && (sample.getRules().getType().isPlane() || sample.getRules().getType().isPhenomenon()))
sec = DeckSection.Planes; sec = DeckSection.Planes;
if (sample != null && sample.getRules().getType().isScheme()) if (sample != null && sample.getRules().getType().isScheme())
sec = DeckSection.Schemes; sec = DeckSection.Schemes;
@@ -339,7 +339,7 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
Date releaseDateReferenceEdition = cal.getTime(); Date releaseDateReferenceEdition = cal.getTime();
CardPool newPool = new CardPool(); CardPool newPool = new CardPool();
for(Entry<PaperCard, Integer> cp : pool) { for (Entry<PaperCard, Integer> cp : pool) {
PaperCard card = cp.getKey(); PaperCard card = cp.getKey();
int count = cp.getValue(); int count = cp.getValue();
if (!cardNamesWithNoEditionInSection.contains(card.getName())) if (!cardNamesWithNoEditionInSection.contains(card.getName()))

View File

@@ -18,10 +18,8 @@
package forge.item; package forge.item;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function; import com.google.common.base.Function;
@@ -30,16 +28,17 @@ import forge.ImageKeys;
import forge.StaticData; import forge.StaticData;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.item.generation.BoosterGenerator; import forge.item.generation.BoosterGenerator;
import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile;
public class FatPack extends BoxedProduct { public class FatPack extends BoxedProduct {
public static final Function<CardEdition, FatPack> FN_FROM_SET = new Function<CardEdition, FatPack>() { public static final Function<CardEdition, FatPack> FN_FROM_SET = new Function<CardEdition, FatPack>() {
@Override @Override
public FatPack apply(final CardEdition arg1) { public FatPack apply(final CardEdition edition) {
FatPack.Template d = StaticData.instance().getFatPacks().get(arg1.getCode()); int boosters = edition.getFatPackCount();
if (boosters <= 0) { return null; }
FatPack.Template d = new Template(edition);
if (d == null) { return null; } if (d == null) { return null; }
return new FatPack(arg1.getName(), d, d.cntBoosters); return new FatPack(edition.getName(), d, d.cntBoosters);
} }
}; };
@@ -68,17 +67,6 @@ public class FatPack extends BoxedProduct {
return BoosterGenerator.getBoosterPack(fpData); return BoosterGenerator.getBoosterPack(fpData);
} }
/*@Override
protected List<PaperCard> generate() {
List<PaperCard> result = new ArrayList<PaperCard>();
for (int i = 0; i < fpData.getCntBoosters(); i++) {
result.addAll(super.generate());
}
// Add any extra cards that may come in the fatpack after Boosters
result.addAll(BoosterGenerator.getBoosterPack(fpData));
return result;
}*/
@Override @Override
public final Object clone() { public final Object clone() {
return new FatPack(name, fpData, fpData.cntBoosters); return new FatPack(name, fpData, fpData.cntBoosters);
@@ -92,38 +80,12 @@ public class FatPack extends BoxedProduct {
public static class Template extends SealedProduct.Template { public static class Template extends SealedProduct.Template {
private final int cntBoosters; private final int cntBoosters;
public int getCntBoosters() { return cntBoosters; } public int getCntBoosters() { return cntBoosters; }
private Template(String edition, int boosters, Iterable<Pair<String, Integer>> itrSlots) private Template(CardEdition edition) {
{ super(edition.getCode(), edition.getFatPackExtraSlots());
super(edition, itrSlots);
cntBoosters = boosters;
}
public static final class Reader extends StorageReaderFile<Template> { cntBoosters = edition.getFatPackCount();
public Reader(String pathname) {
super(pathname, FN_GET_NAME);
}
@Override
protected Template read(String line, int i) {
String[] headAndData = TextUtil.split(line, ':', 2);
final String edition = headAndData[0];
final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ',');
int nBoosters = 6;
List<Pair<String, Integer>> slots = new ArrayList<>();
for(String slotDesc : data) {
String[] kv = TextUtil.split(slotDesc, ' ', 2);
if (kv[1].startsWith("Booster"))
nBoosters = Integer.parseInt(kv[0]);
else
slots.add(ImmutablePair.of(kv[1], Integer.parseInt(kv[0])));
}
return new FatPack.Template(edition, nBoosters, slots);
}
} }
@Override @Override

View File

@@ -60,7 +60,7 @@ public abstract class SealedProduct implements InventoryItemFromSet {
public SealedProduct(String name0, Template boosterData) { public SealedProduct(String name0, Template boosterData) {
if (null == name0) { throw new IllegalArgumentException("name0 must not be null"); } if (null == name0) { throw new IllegalArgumentException("name0 must not be null"); }
if (null == boosterData) { if (null == boosterData) {
throw new IllegalArgumentException("boosterData must not be null"); throw new IllegalArgumentException("boosterData for " + name0 + " must not be null");
} }
contents = boosterData; contents = boosterData;
name = name0; name = name0;

View File

@@ -545,7 +545,7 @@ public class GameAction {
if (fromBattlefield && !zoneFrom.getPlayer().equals(zoneTo.getPlayer())) { if (fromBattlefield && !zoneFrom.getPlayer().equals(zoneTo.getPlayer())) {
final Map<AbilityKey, Object> runParams2 = AbilityKey.mapFromCard(lastKnownInfo); final Map<AbilityKey, Object> runParams2 = AbilityKey.mapFromCard(lastKnownInfo);
runParams2.put(AbilityKey.OriginalController, zoneFrom.getPlayer()); runParams2.put(AbilityKey.OriginalController, zoneFrom.getPlayer());
if(params != null) { if (params != null) {
runParams2.putAll(params); runParams2.putAll(params);
} }
game.getTriggerHandler().runTrigger(TriggerType.ChangesController, runParams2, false); game.getTriggerHandler().runTrigger(TriggerType.ChangesController, runParams2, false);
@@ -2196,6 +2196,22 @@ public class GameAction {
} }
} }
if (cause != null) {
// Remember objects as needed
final Card sourceLKI = game.getChangeZoneLKIInfo(cause.getHostCard());
final boolean rememberCard = cause.hasParam("RememberDamaged") || cause.hasParam("RememberDamagedCreature");
final boolean rememberPlayer = cause.hasParam("RememberDamaged") || cause.hasParam("RememberDamagedPlayer");
if (rememberCard || rememberPlayer) {
for (GameEntity e : damageMap.row(sourceLKI).keySet()) {
if (e instanceof Card && rememberCard) {
cause.getHostCard().addRemembered(e);
} else if (e instanceof Player && rememberPlayer) {
cause.getHostCard().addRemembered(e);
}
}
}
}
preventMap.triggerPreventDamage(isCombat); preventMap.triggerPreventDamage(isCombat);
preventMap.clear(); preventMap.clear();

View File

@@ -3,7 +3,6 @@ package forge.game.ability.effects;
import java.util.List; import java.util.List;
import forge.game.Game; import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable; import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.card.Card; import forge.game.card.Card;
@@ -61,9 +60,7 @@ public class DamageAllEffect extends DamageBaseEffect {
final String damage = sa.getParam("NumDmg"); final String damage = sa.getParam("NumDmg");
final int dmg = AbilityUtils.calculateAmount(source, damage, sa); final int dmg = AbilityUtils.calculateAmount(source, damage, sa);
final boolean rememberCard = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedCreature"); //Remember params from this effect have been moved to dealDamage in GameAction
final boolean rememberPlayer = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedPlayer");
Player targetPlayer = sa.getTargets().getFirstTargetedPlayer(); Player targetPlayer = sa.getTargets().getFirstTargetedPlayer();
String players = ""; String players = "";
@@ -75,8 +72,7 @@ public class DamageAllEffect extends DamageBaseEffect {
CardCollectionView list; CardCollectionView list;
if (sa.hasParam("ValidCards")) { if (sa.hasParam("ValidCards")) {
list = game.getCardsIn(ZoneType.Battlefield); list = game.getCardsIn(ZoneType.Battlefield);
} } else {
else {
list = CardCollection.EMPTY; list = CardCollection.EMPTY;
} }
@@ -114,17 +110,6 @@ public class DamageAllEffect extends DamageBaseEffect {
game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa);
} }
// do Remember there
if (rememberCard || rememberPlayer) {
for (GameEntity e : damageMap.row(sourceLKI).keySet()) {
if (e instanceof Card && rememberCard) {
source.addRemembered(e);
} else if (e instanceof Player && rememberPlayer) {
source.addRemembered(e);
}
}
}
replaceDying(sa); replaceDying(sa);
} }
} }

View File

@@ -166,8 +166,7 @@ public class DamageDealEffect extends DamageBaseEffect {
final CardCollection untargetedCards = CardUtil.getRadiance(sa); final CardCollection untargetedCards = CardUtil.getRadiance(sa);
final boolean remember = sa.hasParam("RememberDamaged"); //Remember params from this effect have been moved to dealDamage in GameAction
boolean usedDamageMap = true; boolean usedDamageMap = true;
CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap damageMap = sa.getDamageMap();
CardDamageMap preventMap = sa.getPreventMap(); CardDamageMap preventMap = sa.getPreventMap();
@@ -252,10 +251,6 @@ public class DamageDealEffect extends DamageBaseEffect {
internalDamageDeal(sa, sourceLKI, unTgtC, dmg, damageMap); internalDamageDeal(sa, sourceLKI, unTgtC, dmg, damageMap);
} }
} }
if (remember) {
source.addRemembered(damageMap.row(sourceLKI).keySet());
}
} }
if (!usedDamageMap) { if (!usedDamageMap) {
game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa);

View File

@@ -22,6 +22,8 @@ public class DamageResolveEffect extends SpellAbilityEffect {
GameEntityCounterTable counterTable = sa.getCounterTable(); GameEntityCounterTable counterTable = sa.getCounterTable();
sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa);
replaceDying(sa);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -36,8 +36,7 @@ public class ManaConversionMatrix {
rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx;
if (additive) { if (additive) {
colorConversionMatrix[rowIdx] |= replacementColor; colorConversionMatrix[rowIdx] |= replacementColor;
} } else {
else {
colorRestrictionMatrix[rowIdx] &= replacementColor; colorRestrictionMatrix[rowIdx] &= replacementColor;
} }
} }

View File

@@ -258,8 +258,7 @@ public class ManaCostBeingPaid {
ManaCostShard shard; ManaCostShard shard;
if (StringUtils.isEmpty(xColor)) { if (StringUtils.isEmpty(xColor)) {
shard = ManaCostShard.GENERIC; shard = ManaCostShard.GENERIC;
} } else {
else {
shard = ManaCostShard.parseNonGeneric(xColor); shard = ManaCostShard.parseNonGeneric(xColor);
} }
increaseShard(shard, xCost, true); increaseShard(shard, xCost, true);

View File

@@ -137,18 +137,15 @@ public class ManaPool extends ManaConversionMatrix implements Iterable<Mana> {
if (convertToColorless) { if (convertToColorless) {
convertManaColor(b, (byte)ManaAtom.COLORLESS); convertManaColor(b, (byte)ManaAtom.COLORLESS);
cm.addAll(pMana); cm.addAll(pMana);
} } else {
else {
cleared.addAll(cm); cleared.addAll(cm);
cm.clear(); cm.clear();
floatingMana.putAll(b, pMana); floatingMana.putAll(b, pMana);
} }
} } else {
else {
if (convertToColorless) { if (convertToColorless) {
convertManaColor(b, (byte)ManaAtom.COLORLESS); convertManaColor(b, (byte)ManaAtom.COLORLESS);
} } else {
else {
cleared.addAll(cm); cleared.addAll(cm);
cm.clear(); cm.clear();
} }
@@ -261,8 +258,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable<Mana> {
if (poolLane != null && poolLane.contains(mana)) { if (poolLane != null && poolLane.contains(mana)) {
removeFloating.add(mana); removeFloating.add(mana);
} } else {
else {
manaNotAccountedFor = true; manaNotAccountedFor = true;
break; break;
} }
@@ -319,7 +315,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable<Mana> {
// TODO Debug this for Paying Gonti, // TODO Debug this for Paying Gonti,
byte line = getPossibleColorUses(color); byte line = getPossibleColorUses(color);
for(byte outColor : ManaAtom.MANATYPES) { for (byte outColor : ManaAtom.MANATYPES) {
if ((line & outColor) != 0 && shard.canBePaidWithManaOfColor(outColor)) { if ((line & outColor) != 0 && shard.canBePaidWithManaOfColor(outColor)) {
return true; return true;
} }

View File

@@ -63,7 +63,7 @@ public class MulliganService {
boolean allKept; boolean allKept;
do { do {
allKept = true; allKept = true;
for(AbstractMulligan mulligan : mulligans) { for (AbstractMulligan mulligan : mulligans) {
if (mulligan.hasKept()) { if (mulligan.hasKept()) {
continue; continue;
} }
@@ -85,7 +85,7 @@ public class MulliganService {
} }
} while (!allKept); } while (!allKept);
for(AbstractMulligan mulligan : mulligans) { for (AbstractMulligan mulligan : mulligans) {
mulligan.afterMulligan(); mulligan.afterMulligan();
} }
} }

View File

@@ -136,7 +136,7 @@ public class RegisteredPlayer {
} }
if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic) if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic)
|| appliedVariants.contains(GameType.MoJhoSto)) { //fix the crash, if somehow the avatar is null, get it directly from the deck || appliedVariants.contains(GameType.MoJhoSto)) { //fix the crash, if somehow the avatar is null, get it directly from the deck
start.setVanguardAvatars(vanguardAvatar == null ? deck.get(DeckSection.Avatar).toFlatList():vanguardAvatar.toFlatList()); start.setVanguardAvatars(vanguardAvatar == null ? deck.get(DeckSection.Avatar).toFlatList() : vanguardAvatar.toFlatList());
} }
return start; return start;
} }
@@ -167,7 +167,7 @@ public class RegisteredPlayer {
private void setVanguardAvatars(List<PaperCard> vanguardAvatars0) { private void setVanguardAvatars(List<PaperCard> vanguardAvatars0) {
vanguardAvatars = vanguardAvatars0; vanguardAvatars = vanguardAvatars0;
if (vanguardAvatars == null) { return; } if (vanguardAvatars == null) { return; }
for(PaperCard avatar: vanguardAvatars){ for (PaperCard avatar: vanguardAvatars) {
setStartingLife(getStartingLife() + avatar.getRules().getLife()); setStartingLife(getStartingLife() + avatar.getRules().getLife());
setStartingHand(getStartingHand() + avatar.getRules().getHand()); setStartingHand(getStartingHand() + avatar.getRules().getHand());
} }

View File

@@ -163,7 +163,6 @@ public class StaticAbilityCantBeCast {
return false; return false;
} }
if (stAb.hasParam("AffectedZone") && !card.isInZone(ZoneType.smartValueOf(stAb.getParam("AffectedZone")))) { if (stAb.hasParam("AffectedZone") && !card.isInZone(ZoneType.smartValueOf(stAb.getParam("AffectedZone")))) {
return false; return false;
} }

View File

@@ -48,11 +48,7 @@ public class StaticAbilityCastWithFlash {
return false; return false;
} }
public static boolean commonParts(final StaticAbility stAb, final SpellAbility sa, final Card card, final Player activator) { public static boolean commonParts(final StaticAbility stAb, final SpellAbility sa, final Card card, final Player activator) {
if (!stAb.matchesValidParam("ValidCard", card)) { if (!stAb.matchesValidParam("ValidCard", card)) {
return false; return false;
} }

View File

@@ -535,14 +535,12 @@ public abstract class Trigger extends TriggerReplacementBase {
return this.numberTurnActivations; return this.numberTurnActivations;
} }
public void triggerRun() public void triggerRun() {
{
this.numberTurnActivations++; this.numberTurnActivations++;
} }
// Resets the state stored each turn for per-turn and per-instance restriction // Resets the state stored each turn for per-turn and per-instance restriction
public void resetTurnState() public void resetTurnState() {
{
this.numberTurnActivations = 0; this.numberTurnActivations = 0;
} }

View File

@@ -839,7 +839,7 @@ public class VLobby implements ILobbyView {
} }
private boolean isPlayerAI(final int playernum) { private boolean isPlayerAI(final int playernum) {
if(playernum < activePlayersNum){ if (playernum < activePlayersNum) {
return playerPanels.get(playernum).isAi(); return playerPanels.get(playernum).isAi();
} }
return true; return true;

View File

@@ -1,84 +0,0 @@
MMQ: 6 Boosters, 30 BasicLands
NMS: 6 Boosters
PCY: 6 Boosters
INV: 6 Boosters
PLS: 6 Boosters
APC: 6 Boosters
ODY: 6 Boosters
TOR: 6 Boosters
JUD: 6 Boosters
ONS: 9 Boosters, 30 BasicLands
LGN: 6 Boosters
SCG: 6 Boosters
MRD: 6 Boosters
DST: 6 Boosters
5DN: 6 Boosters
CHK: 6 Boosters
BOK: 6 Boosters
SOK: 6 Boosters
9ED: 6 Boosters, 40 BasicLands
RAV: 6 Boosters, 40 BasicLands
GPT: 6 Boosters, 40 BasicLands RAV
DIS: 6 Boosters, 40 BasicLands RAV
CSP: 6 Boosters, 40 BasicLands
TSP: 6 Boosters, 40 BasicLands
PLC: 6 Boosters, 40 BasicLands TSP
FUT: 6 Boosters, 40 BasicLands TSP
10E: 6 Boosters, 40 BasicLands
LRW: 6 Boosters, 40 BasicLands
MOR: 6 Boosters, 40 BasicLands LRW
SHM: 8 Boosters, 40 BasicLands
EVE: 8 Boosters, 40 BasicLands SHM
ALA: 8 Boosters, 40 BasicLands
CFX: 8 Boosters, 40 BasicLands ALA
ARB: 8 Boosters, 40 BasicLands ALA
M10: 8 Boosters, 40 BasicLands
ZEN: 8 Boosters, 40 BasicLands
WWK: 8 Boosters, 40 BasicLands ZEN
ROE: 8 Boosters, 40 BasicLands
M11: 8 Boosters, 40 BasicLands
SOM: 8 Boosters, 40 BasicLands
MBS: 9 Boosters, 80 BasicLands MBS
NPH: 9 Boosters, 80 BasicLands NPH
M12: 9 Boosters, 80 BasicLands
ISD: 9 Boosters, 70 BasicLands
DKA: 9 Boosters, 70 BasicLands ISD
AVR: 9 Boosters, 80 BasicLands
M13: 9 Boosters, 80 BasicLands
RTR: 9 Boosters, 80 BasicLands
GTC: 9 Boosters, 80 BasicLands RTR
DGM: 9 Boosters, 80 BasicLands RTR
M14: 9 Boosters, 80 BasicLands
THS: 9 Boosters, 80 BasicLands
BNG: 9 Boosters, 80 BasicLands THS
JOU: 9 Boosters, 80 BasicLands THS
M15: 9 Boosters, 80 BasicLands
KTK: 9 Boosters, 80 BasicLands
FRF: 9 Boosters, 80 BasicLands
DTK: 9 Boosters, 80 BasicLands
ORI: 9 Boosters, 80 BasicLands
BFZ: 9 Boosters, 80 BasicLands
OGW: 9 Boosters, 66 BasicLands BFZ, 14 name("Wastes")
SOI: 9 Boosters, 80 BasicLands
EMN: 9 Boosters, 80 BasicLands SOI
KLD: 10 Boosters, 80 BasicLands
AER: 10 Boosters, 80 BasicLands KLD
AKH: 10 Boosters, 80 BasicLands
HOU: 10 Boosters, 80 BasicLands
XLN: 10 Boosters, 80 BasicLands
RIX: 10 Boosters, 80 BasicLands
DOM: 10 Boosters, 80 BasicLands
M19: 10 Boosters, 80 BasicLands
GRN: 10 Boosters, 80 BasicLands
RNA: 10 Boosters, 80 BasicLands
WAR: 10 Boosters, 80 BasicLands
ELD: 10 Boosters, 40 BasicLands
#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Piper of the Swarm+|ELD|3
THB: 10 Boosters, 40 BasicLands
#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Arasta of the Endless Web+|THB|3
IKO: 10 Boosters, 40 BasicLands
#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Colossification+|IKO|3
M21: 10 Boosters, 40 BasicLands
#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Pack Leader+|M21|3
ZNR: 10 Boosters, 40 BasicLands
#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Charix, the Raging Isle+|ZNR|3

View File

@@ -1,7 +1,6 @@
Name:Anger of the Gods Name:Anger of the Gods
ManaCost:1 R R ManaCost:1 R R
Types:Sorcery Types:Sorcery
A:SP$ DamageAll | Cost$ 1 R R | ValidCards$ Creature | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals 3 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead. A:SP$ DamageAll | ValidCards$ Creature | NumDmg$ 3 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals 3 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/anger_of_the_gods.jpg
Oracle:Anger of the Gods deals 3 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead. Oracle:Anger of the Gods deals 3 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead.

View File

@@ -3,7 +3,7 @@ ManaCost:B
Types:Sorcery Types:Sorcery
K:Kicker:2 B K:Kicker:2 B
A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.cmcLE2,Planeswalker.cmcLE2 | TargetMin$ X | TargetMax$ X | TgtPrompt$ Select target creature or planeswalker with mana value 2 or less | SubAbility$ DBDestroy | AILogic$ AssumeAtLeastOneTarget | StackDescription$ SpellDescription | SpellDescription$ Destroy target creature or planeswalker with mana value 2 or less. If this spell was kicked, instead destroy target creature or planeswalker. A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.cmcLE2,Planeswalker.cmcLE2 | TargetMin$ X | TargetMax$ X | TgtPrompt$ Select target creature or planeswalker with mana value 2 or less | SubAbility$ DBDestroy | AILogic$ AssumeAtLeastOneTarget | StackDescription$ SpellDescription | SpellDescription$ Destroy target creature or planeswalker with mana value 2 or less. If this spell was kicked, instead destroy target creature or planeswalker.
SVar:DBDestroy:DB$ Destroy | TargetMin$ Y | TargetMax$ Y | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | StackDescription$ None SVar:DBDestroy:DB$ Destroy | TargetMin$ Y | TargetMax$ Y | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | StackDescription$ [{c:ThisTargetedCard}]
SVar:X:Count$Kicked.0.1 SVar:X:Count$Kicked.0.1
SVar:Y:Count$Kicked.1.0 SVar:Y:Count$Kicked.1.0
Oracle:Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.)\nDestroy target creature or planeswalker with mana value 2 or less. If this spell was kicked, instead destroy target creature or planeswalker. Oracle:Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.)\nDestroy target creature or planeswalker with mana value 2 or less. If this spell was kicked, instead destroy target creature or planeswalker.

View File

@@ -2,7 +2,7 @@ Name:Price of Loyalty
ManaCost:2 R ManaCost:2 R
Types:Sorcery Types:Sorcery
A:SP$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If mana from a Treasure was spent to cast this spell, that creature gets +2/+0 until end of turn. A:SP$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If mana from a Treasure was spent to cast this spell, that creature gets +2/+0 until end of turn.
SVar:DBPump:DB$ Pump | CheckSVar$ TreasureCheck | Defined$ Targeted | NumAtt$ 2 SVar:DBPump:DB$ Pump | ConditionCheckSVar$ TreasureCheck | Defined$ Targeted | NumAtt$ 2
SVar:TreasureCheck:Count$CastTotalManaSpent Treasure SVar:TreasureCheck:Count$CastTotalManaSpent Treasure
SVar:AIPreference:ManaFrom$Treasure SVar:AIPreference:ManaFrom$Treasure
Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If mana from a Treasure was spent to cast this spell, that creature gets +2/+0 until end of turn. Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If mana from a Treasure was spent to cast this spell, that creature gets +2/+0 until end of turn.

View File

@@ -2,10 +2,9 @@ Name:Serpentine Spike
ManaCost:5 R R ManaCost:5 R R
Types:Sorcery Types:Sorcery
K:Devoid K:Devoid
A:SP$ DealDamage | Cost$ 5 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature to deal 2 damage to | NumDmg$ 2 | RememberDamaged$ True | DamageMap$ True | SubAbility$ DBDamageTwo | SpellDescription$ CARDNAME deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature. If a creature dealt damage this way would die this turn, exile it instead. A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to deal 2 damage to | NumDmg$ 2 | DamageMap$ True | SubAbility$ DBDamageTwo | StackDescription$ CARDNAME deals 2 damage to {c:ThisTargetedCard}, | SpellDescription$ CARDNAME deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBDamageTwo:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 3 damage to | NumDmg$ 3 | RememberDamaged$ True | TargetUnique$ True | SubAbility$ DBDamageThree SVar:DBDamageTwo:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 3 damage to | NumDmg$ 3 | TargetUnique$ True | SubAbility$ DBDamageThree | StackDescription$ 3 damage to {c:ThisTargetedCard},
SVar:DBDamageThree:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 4 damage to | NumDmg$ 4 | RememberDamaged$ True | TargetUnique$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBDamageResolve SVar:DBDamageThree:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 4 damage to | NumDmg$ 4 | TargetUnique$ True | SubAbility$ DBDamageResolve | StackDescription$ and 4 damage to {c:ThisTargetedCard}. If a creature dealt damage this way would die this turn, exile it instead.
SVar:DBDamageResolve:DB$ DamageResolve | SubAbility$ DBCleanup SVar:DBDamageResolve:DB$ DamageResolve | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/serpentine_spike.jpg
Oracle:Devoid (This card has no color.)\nSerpentine Spike deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature. If a creature dealt damage this way would die this turn, exile it instead. Oracle:Devoid (This card has no color.)\nSerpentine Spike deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature. If a creature dealt damage this way would die this turn, exile it instead.

View File

@@ -8,6 +8,8 @@ MciCode=aer
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:fromSheet("AER cards"), 3 Uncommon:fromSheet("AER cards"), 1 RareMythic:fromSheet("AER cards"), 1 BasicLand KLD Booster=10 Common:fromSheet("AER cards"), 3 Uncommon:fromSheet("AER cards"), 1 RareMythic:fromSheet("AER cards"), 1 BasicLand KLD
AdditionalSheetForFoils=fromSheet("AER Aether Revolt Inventions") AdditionalSheetForFoils=fromSheet("AER Aether Revolt Inventions")
FatPack=10
FatPackExtraSlots=80 BasicLands KLD
AdditionalSetUnlockedInQuest=MPS_KLD AdditionalSetUnlockedInQuest=MPS_KLD
ScryfallCode=AER ScryfallCode=AER

View File

@@ -7,6 +7,8 @@ MciCode=arb
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA
FatPack=8
FatPackExtraSlots=40 BasicLands ALA
ScryfallCode=ARB ScryfallCode=ARB
[cards] [cards]

View File

@@ -8,6 +8,8 @@ MciCode=akh
BoosterCovers=5 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")
FatPack=10
FatPackExtraSlots=80 BasicLands
AdditionalSetUnlockedInQuest=MPS_AKH AdditionalSetUnlockedInQuest=MPS_AKH
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=AKH ScryfallCode=AKH

View File

@@ -7,6 +7,7 @@ MciCode=ap
Type=Expansion Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=APC ScryfallCode=APC

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=AVR ScryfallCode=AVR

View File

@@ -7,6 +7,8 @@ MciCode=bfz
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand BFZ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand BFZ
FatPack=9
FatPackExtraSlots=80 BasicLands
AdditionalSheetForFoils=fromSheet("EXP Lands") AdditionalSheetForFoils=fromSheet("EXP Lands")
AdditionalSetUnlockedInQuest=EXP AdditionalSetUnlockedInQuest=EXP
ScryfallCode=BFZ ScryfallCode=BFZ

View File

@@ -7,6 +7,7 @@ MciCode=bok
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=BOK ScryfallCode=BOK

View File

@@ -6,6 +6,8 @@ MciCode=bng
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand THS Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand THS
FatPack=9
FatPackExtraSlots=80 BasicLands THS
ScryfallCode=BNG ScryfallCode=BNG
[cards] [cards]

View File

@@ -7,6 +7,7 @@ MciCode=chk
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=CHK ScryfallCode=CHK

View File

@@ -7,6 +7,8 @@ MciCode=cs
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands
ScryfallCode=CSP ScryfallCode=CSP
[cards] [cards]

View File

@@ -8,6 +8,8 @@ MciCode=cfx
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA
FatPack=8
FatPackExtraSlots=40 BasicLands ALA
ScryfallCode=CON ScryfallCode=CON
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=70 BasicLands ISD
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=DKA ScryfallCode=DKA

View File

@@ -7,6 +7,7 @@ MciCode=ds
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=DST ScryfallCode=DST

View File

@@ -7,6 +7,8 @@ MciCode=di
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands RAV
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=DIS ScryfallCode=DIS

View File

@@ -7,6 +7,8 @@ MciCode=dom
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 3 Uncommon:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 1 RareMythic:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 1 BasicLand DOM Booster=10 Common:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 3 Uncommon:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 1 RareMythic:!fromSheet("DOM Planeswalker Decks and Additional Promo"), 1 BasicLand DOM
BoosterMustContain=Legendary Creature BoosterMustContain=Legendary Creature
FatPack=10
FatPackExtraSlots=80 BasicLands
ScryfallCode=DOM ScryfallCode=DOM
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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")
FatPack=9
FatPackExtraSlots=80 BasicLands RTR
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=DGM ScryfallCode=DGM

View File

@@ -7,6 +7,8 @@ MciCode=dtk
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand DTK Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand DTK
FatPack=9
FatPackExtraSlots=80 BasicLands
ScryfallCode=DTK ScryfallCode=DTK
[cards] [cards]

View File

@@ -9,6 +9,7 @@ ScryfallCode=AFR
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
FatPackExtraSlots=20 BasicLands, 20 BasicLands+
[cards] [cards]
1 C +2 Mace 1 C +2 Mace

View File

@@ -7,6 +7,8 @@ Type=Expansion
MciCode=emn MciCode=emn
BoosterCovers=3 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
FatPack=9
FatPackExtraSlots=80 BasicLands SOI
ChanceReplaceCommonWith=.125F dfc:RareMythic ChanceReplaceCommonWith=.125F dfc:RareMythic
TreatAsSmallSet=true TreatAsSmallSet=true
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS

View File

@@ -8,6 +8,8 @@ MciCode=eve
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=8
FatPackExtraSlots=40 BasicLands SHM
ScryfallCode=EVE ScryfallCode=EVE
[cards] [cards]

View File

@@ -6,6 +6,8 @@ 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")
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=FRF ScryfallCode=FRF

View File

@@ -7,6 +7,7 @@ MciCode=5dn
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=5DN ScryfallCode=5DN

View File

@@ -7,6 +7,8 @@ MciCode=fut
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands TSP
ScryfallCode=FUT ScryfallCode=FUT
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands RTR
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=GTC ScryfallCode=GTC

View File

@@ -7,6 +7,8 @@ MciCode=gp
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands RAV
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=GPT ScryfallCode=GPT

View File

@@ -8,6 +8,8 @@ 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
FatPack=10
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS
ScryfallCode=GRN ScryfallCode=GRN

View File

@@ -8,6 +8,8 @@ MciCode=hou
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:!fromSheet("HOU Planeswalker Decks and Toolkit"), 3 Uncommon:!fromSheet("HOU Planeswalker Decks and Toolkit"), 1 RareMythic:!fromSheet("HOU Planeswalker Decks and Toolkit"), 1 BasicLand Booster=10 Common:!fromSheet("HOU Planeswalker Decks and Toolkit"), 3 Uncommon:!fromSheet("HOU Planeswalker Decks and Toolkit"), 1 RareMythic:!fromSheet("HOU Planeswalker Decks and Toolkit"), 1 BasicLand
AdditionalSheetForFoils=fromSheet("MPS Hour of Devastation Invocations") AdditionalSheetForFoils=fromSheet("MPS Hour of Devastation Invocations")
FatPack=10
FatPackExtraSlots=80 BasicLands
AdditionalSetUnlockedInQuest=MPS_AKH AdditionalSetUnlockedInQuest=MPS_AKH
TreatAsSmallSet=true TreatAsSmallSet=true
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS

View File

@@ -8,6 +8,7 @@ Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:fromSheet("IKO cards"):!fromSheet("IKO Lands"), 3 Uncommon:fromSheet("IKO cards"), 1 RareMythic:fromSheet("IKO cards"), 1 fromSheet("IKO Lands") Booster=10 Common:fromSheet("IKO cards"):!fromSheet("IKO Lands"), 3 Uncommon:fromSheet("IKO cards"), 1 RareMythic:fromSheet("IKO cards"), 1 fromSheet("IKO Lands")
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
FatPackExtraSlots=20 BasicLands, 20 BasicLands+, 1 Colossification+|IKO|3
ScryfallCode=IKO ScryfallCode=IKO
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=70 BasicLands
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=ISD ScryfallCode=ISD

View File

@@ -7,6 +7,7 @@ MciCode=in
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=INV ScryfallCode=INV

View File

@@ -7,6 +7,8 @@ Type=Expansion
MciCode=xln MciCode=xln
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:fromSheet("XLN cards"), 3 Uncommon:fromSheet("XLN cards"), 1 RareMythic:fromSheet("XLN cards"), 1 BasicLand Booster=10 Common:fromSheet("XLN cards"), 3 Uncommon:fromSheet("XLN cards"), 1 RareMythic:fromSheet("XLN cards"), 1 BasicLand
FatPack=10
FatPackExtraSlots=80 BasicLands
ScryfallCode=XLN ScryfallCode=XLN
[cards] [cards]

View File

@@ -6,6 +6,8 @@ MciCode=jou
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand THS Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand THS
FatPack=9
FatPackExtraSlots=80 BasicLands THS
ScryfallCode=JOU ScryfallCode=JOU
[cards] [cards]

View File

@@ -7,6 +7,7 @@ MciCode=ju
Type=Expansion Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS

View File

@@ -8,6 +8,8 @@ MciCode=kld
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:fromSheet("KLD cards"), 3 Uncommon:fromSheet("KLD cards"), 1 RareMythic:fromSheet("KLD cards"), 1 BasicLand Booster=10 Common:fromSheet("KLD cards"), 3 Uncommon:fromSheet("KLD cards"), 1 RareMythic:fromSheet("KLD cards"), 1 BasicLand
AdditionalSheetForFoils=fromSheet("KLD Kaladesh Inventions") AdditionalSheetForFoils=fromSheet("KLD Kaladesh Inventions")
FatPack=10
FatPackExtraSlots=80 BasicLands
AdditionalSetUnlockedInQuest=MPS_KLD AdditionalSetUnlockedInQuest=MPS_KLD
ScryfallCode=KLD ScryfallCode=KLD

View File

@@ -9,6 +9,7 @@ BoosterCovers=3
Booster=10 Common:!fromSheet("KHM Snow Lands"):fromsheet("KHM cards"), 3 Uncommon:fromSheet("KHM cards"), 1 RareMythic:fromSheet("KHM cards"), 1 fromSheet("KHM Snow Lands") Booster=10 Common:!fromSheet("KHM Snow Lands"):fromsheet("KHM cards"), 3 Uncommon:fromSheet("KHM cards"), 1 RareMythic:fromSheet("KHM cards"), 1 fromSheet("KHM Snow Lands")
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
#BoosterBox=36 Boosters, 1 fromSheet('KHM buy a box')+ #BoosterBox=36 Boosters, 1 fromSheet('KHM buy a box')+
FatPackExtraSlots=20 BasicLands, 20 BasicLands+
ScryfallCode=KHM ScryfallCode=KHM
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS
ScryfallCode=KTK ScryfallCode=KTK

View File

@@ -7,6 +7,7 @@ MciCode=le
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=LGN ScryfallCode=LGN

View File

@@ -7,6 +7,8 @@ MciCode=lw
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands
ScryfallCode=LRW ScryfallCode=LRW
[cards] [cards]

View File

@@ -4,7 +4,7 @@ Date=2018-11-16
Name=M19 Gift Pack Name=M19 Gift Pack
Code2=G18 Code2=G18
MciCode=g18 MciCode=g18
Type=Core Type=Promo
ScryfallCode=g18 ScryfallCode=g18
[cards] [cards]

View File

@@ -7,6 +7,8 @@ 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
FatPack=8
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M10 ScryfallCode=M10

View File

@@ -7,6 +7,8 @@ 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
FatPack=8
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M11 ScryfallCode=M11

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M12 ScryfallCode=M12

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M13 ScryfallCode=M13

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M14 ScryfallCode=M14

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M15 ScryfallCode=M15

View File

@@ -8,6 +8,8 @@ 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 ChaosDraftThemes=CORE_SET
FatPack=10
FatPackExtraSlots=80 BasicLands
ScryfallCode=M19 ScryfallCode=M19
[cards] [cards]

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")
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M20 ScryfallCode=M20

View File

@@ -6,6 +6,7 @@ Type=Core
BoosterCovers=3 BoosterCovers=3
Booster=10 Common:fromSheet("M21 cards"):!fromSheet("M21 Lands"), 3 Uncommon:fromSheet("M21 cards"), 1 RareMythic:fromSheet("M21 cards"), 1 fromSheet("M21 Lands") Booster=10 Common:fromSheet("M21 cards"):!fromSheet("M21 Lands"), 3 Uncommon:fromSheet("M21 cards"), 1 RareMythic:fromSheet("M21 cards"), 1 fromSheet("M21 Lands")
Prerelease=6 Boosters, 1 RareMythic+ Prerelease=6 Boosters, 1 RareMythic+
FatPackExtraSlots=20 BasicLands, 20 BasicLands+, 1 Pack Leader+|M21|3
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=M21 ScryfallCode=M21

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=ORI ScryfallCode=ORI

View File

@@ -4,12 +4,14 @@ Date=1999-10-04
Name=Mercadian Masques Name=Mercadian Masques
Code2=MM Code2=MM
MciCode=mm MciCode=mm
ScryfallCode=MMQ
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=30 BasicLands
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=MMQ
[cards] [cards]
58 R Aerial Caravan 58 R Aerial Caravan

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=MBS ScryfallCode=MBS

View File

@@ -7,6 +7,7 @@ MciCode=mi
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=MRD ScryfallCode=MRD

View File

@@ -7,6 +7,8 @@ MciCode=mt
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands LRW
ScryfallCode=MOR ScryfallCode=MOR
[cards] [cards]

View File

@@ -5,12 +5,13 @@ Name=Nemesis
Code2=NE Code2=NE
Alias=NEM Alias=NEM
MciCode=ne MciCode=ne
ScryfallCode=NEM
Type=Expansion Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=NEM
[cards] [cards]
27 R AEther Barrier 27 R AEther Barrier

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=NPH ScryfallCode=NPH

View File

@@ -8,6 +8,8 @@ Type=Core
Border=White Border=White
BoosterCovers=5 BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand Booster=10 Common, 3 Uncommon, 1 Rare, 1 BasicLand
FatPack=6
FatPackExtraSlots=40 BasicLands
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=CORE_SET ChaosDraftThemes=CORE_SET
ScryfallCode=9ED ScryfallCode=9ED

View File

@@ -7,6 +7,8 @@ MciCode=ogw
Type=Expansion Type=Expansion
BoosterCovers=4 BoosterCovers=4
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand BFZ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand BFZ
FatPack=9
FatPackExtraSlots=66 BasicLands BFZ, 14 name("Wastes")
AdditionalSheetForFoils=fromSheet("EXP Lands 2") AdditionalSheetForFoils=fromSheet("EXP Lands 2")
AdditionalSetUnlockedInQuest=EXP AdditionalSetUnlockedInQuest=EXP
ScryfallCode=OGW ScryfallCode=OGW

View File

@@ -7,6 +7,7 @@ MciCode=od
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS

View File

@@ -7,6 +7,8 @@ MciCode=on
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=9
FatPackExtraSlots=30 BasicLands
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=ONS ScryfallCode=ONS

View File

@@ -7,6 +7,8 @@ MciCode=pc
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=40 BasicLands TSP
ScryfallCode=PLC ScryfallCode=PLC
[cards] [cards]

View File

@@ -7,6 +7,7 @@ MciCode=ps
Type=Expansion Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare, 0 Special Booster=11 Common, 3 Uncommon, 1 Rare, 0 Special
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=PLS ScryfallCode=PLS

View File

@@ -4,12 +4,13 @@ Date=2000-06-05
Name=Prophecy Name=Prophecy
Code2=PY Code2=PY
MciCode=pr MciCode=pr
ScryfallCode=PCY
Type=Expansion Type=Expansion
BoosterCovers=1 BoosterCovers=1
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=PCY
[cards] [cards]
1 U Abolish 1 U Abolish

View File

@@ -7,6 +7,8 @@ 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")
FatPack=10
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=RNA ScryfallCode=RNA

View File

@@ -7,6 +7,8 @@ MciCode=rav
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FatPackExtraSlots=30 BasicLands
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=RAVNICA ChaosDraftThemes=RAVNICA
ScryfallCode=RAV ScryfallCode=RAV

View File

@@ -7,6 +7,8 @@ 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
FatPack=9
FatPackExtraSlots=80 BasicLands
ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS ChaosDraftThemes=RAVNICA;GRAVEYARD_MATTERS
ScryfallCode=RTR ScryfallCode=RTR

View File

@@ -7,6 +7,8 @@ MciCode=roe
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
FatPack=8
FatPackExtraSlots=40 BasicLands
ScryfallCode=ROE ScryfallCode=ROE
[cards] [cards]

View File

@@ -7,6 +7,8 @@ Type=Expansion
MciCode=rix MciCode=rix
BoosterCovers=5 BoosterCovers=5
Booster=10 Common:fromSheet("RIX cards"), 3 Uncommon:fromSheet("RIX cards"), 1 RareMythic:fromSheet("RIX cards"), 1 BasicLand:fromSheet("RIX Basic Lands") Booster=10 Common:fromSheet("RIX cards"), 3 Uncommon:fromSheet("RIX cards"), 1 RareMythic:fromSheet("RIX cards"), 1 BasicLand:fromSheet("RIX Basic Lands")
FatPack=10
FatPackExtraSlots=80 BasicLands
TreatAsSmallSet=true TreatAsSmallSet=true
ScryfallCode=RIX ScryfallCode=RIX

View File

@@ -7,6 +7,7 @@ MciCode=sok
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ScryfallCode=SOK ScryfallCode=SOK

View File

@@ -7,6 +7,8 @@ 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
FatPack=8
FatPackExtraSlots=40 BasicLands
ChaosDraftThemes=MIRRODIN ChaosDraftThemes=MIRRODIN
ScryfallCode=SOM ScryfallCode=SOM

View File

@@ -7,6 +7,7 @@ MciCode=sc
Type=Expansion Type=Expansion
BoosterCovers=3 BoosterCovers=3
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=6
Foil=OldStyle Foil=OldStyle
FoilAlwaysInCommonSlot=False FoilAlwaysInCommonSlot=False
ChaosDraftThemes=GRAVEYARD_MATTERS ChaosDraftThemes=GRAVEYARD_MATTERS

View File

@@ -7,6 +7,8 @@ MciCode=shm
Type=Expansion Type=Expansion
BoosterCovers=5 BoosterCovers=5
Booster=11 Common, 3 Uncommon, 1 Rare Booster=11 Common, 3 Uncommon, 1 Rare
FatPack=8
FatPackExtraSlots=40 BasicLands
ScryfallCode=SHM ScryfallCode=SHM
[cards] [cards]

Some files were not shown because too many files have changed in this diff Show More