From 2fffb11d72df8a843c3b589f1321ef0d103c417f Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 10:00:05 -0400 Subject: [PATCH 01/14] anger_of_the_gods.txt tidy up --- forge-gui/res/cardsfolder/a/anger_of_the_gods.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/anger_of_the_gods.txt b/forge-gui/res/cardsfolder/a/anger_of_the_gods.txt index f44537f3f89..a63a81b722b 100644 --- a/forge-gui/res/cardsfolder/a/anger_of_the_gods.txt +++ b/forge-gui/res/cardsfolder/a/anger_of_the_gods.txt @@ -1,7 +1,6 @@ Name:Anger of the Gods ManaCost:1 R R 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: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. From 589f714d70443e02ea9c823a4c123953fdee9696 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 11:13:12 -0400 Subject: [PATCH 02/14] improve StackDescription to show target when kicked (band-aid) --- forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt b/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt index 1bed5d6ee38..2c018165d4d 100644 --- a/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt +++ b/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt @@ -3,7 +3,7 @@ ManaCost:B Types:Sorcery 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. -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: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. From 911511d0392d35c00401e033ab29cab64f0ba7dd Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 23 Jul 2021 21:33:25 +0200 Subject: [PATCH 03/14] Add Dungeon to EditionSectionWithCollectorNumbers --- .../main/java/forge/CardStorageReader.java | 6 ++-- .../src/main/java/forge/StaticData.java | 3 -- .../src/main/java/forge/card/CardDb.java | 27 +++++++-------- .../src/main/java/forge/card/CardEdition.java | 33 ++++++++++--------- .../src/main/java/forge/card/CardRules.java | 6 ++-- .../src/main/java/forge/card/CardType.java | 3 +- .../src/main/java/forge/card/MagicColor.java | 4 +-- .../src/main/java/forge/card/PrintSheet.java | 28 ++++++++-------- forge-core/src/main/java/forge/deck/Deck.java | 8 ++--- .../src/main/java/forge/game/GameAction.java | 2 +- .../game/ability/effects/DamageAllEffect.java | 3 +- .../game/combat/AttackRestrictionType.java | 2 +- .../forge/game/mana/ManaConversionMatrix.java | 3 +- .../forge/game/mana/ManaCostBeingPaid.java | 3 +- .../main/java/forge/game/mana/ManaPool.java | 14 +++----- .../forge/game/mulligan/MulliganService.java | 4 +-- .../forge/game/player/RegisteredPlayer.java | 4 +-- .../StaticAbilityCantBeCast.java | 1 - .../StaticAbilityCastWithFlash.java | 4 --- .../main/java/forge/game/trigger/Trigger.java | 6 ++-- .../forge/game/trigger/TriggerHandler.java | 2 +- .../main/java/forge/screens/home/VLobby.java | 2 +- 22 files changed, 74 insertions(+), 94 deletions(-) diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index d83f642b715..3f6c89288df 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -138,7 +138,7 @@ public class CardStorageReader { final CardRules.Reader rulesReader = new CardRules.Reader(); final List result = new ArrayList<>(); - for(int i = from; i < to; i++) { + for (int i = from; i < to; i++) { final ZipEntry ze = files.get(i); // if (ze.getName().endsWith(CardStorageReader.CARD_FILE_DOT_EXTENSION)) // already filtered! result.add(this.loadCard(rulesReader, ze)); @@ -315,11 +315,11 @@ public class CardStorageReader { final List>> parts = executor.invokeAll(tasks); executor.shutdown(); cdl.await(); - for(final Future> pp : parts) { + for (final Future> pp : parts) { result.addAll(pp.get()); } } else { - for(final Callable> c : tasks) { + for (final Callable> c : tasks) { result.addAll(c.call()); } } diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 4dc8e927706..a58d286a0cd 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -322,7 +322,6 @@ public class StaticData { } public PaperCard getCardByEditionDate(PaperCard card, Date editionDate) { - PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), editionDate, CardDb.SetPreference.LatestCoreExp, card.getArtIndex()); if (null != c) { @@ -346,7 +345,6 @@ public class StaticData { } public PaperCard getCardFromLatestorEarliest(PaperCard card) { - PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.Latest, card.getArtIndex()); if (null != c && c.hasImage()) { @@ -376,7 +374,6 @@ public class StaticData { } public PaperCard getCardFromEarliestCoreExp(PaperCard card) { - PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.EarliestCoreExp, card.getArtIndex()); if (null != c && c.hasImage()) { diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 9d260c6eabe..8a1ca7e0290 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -212,16 +212,14 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { CardRules cr = rulesByName.get(cis.name); if (cr != null) { addSetCard(e, cis, cr); - } - else { + } else { missingCards.add(cis.name); } } if (isCoreExpSet && logMissingPerEdition) { if (missingCards.isEmpty()) { System.out.println(" ... 100% "); - } - else { + } else { int missing = (e.getAllCardsInSet().size() - missingCards.size()) * 10000 / e.getAllCardsInSet().size(); System.out.printf(" ... %.2f%% (%s missing: %s)%n", missing * 0.01f, Lang.nounWithAmount(missingCards.size(), "card"), StringUtils.join(missingCards, " | ")); } @@ -245,7 +243,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (!contains(cr.getName())) { if (upcomingSet != null) { addCard(new PaperCard(cr, upcomingSet.getCode(), CardRarity.Unknown, 1)); - } else if(enableUnknownCards) { + } else if (enableUnknownCards) { System.err.println("The card " + cr.getName() + " was not assigned to any set. Adding it to UNKNOWN set... to fix see res/editions/ folder. "); addCard(new PaperCard(cr, CardEdition.UNKNOWN.getCode(), CardRarity.Special, 1)); } @@ -505,17 +503,16 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (pc.hasImage()) { return pc; } - else { - if (firstWithoutImage == null) { - firstWithoutImage = pc; //ensure first without image returns if none have image - } - if (cardsListReadOnly) { //ensure we don't modify a cached collection - cards = new ArrayList<>(cards); - cardsListReadOnly = false; - } - cards.remove(randomIndex); //remove card from collection and try another random card - sz--; + if (firstWithoutImage == null) { + firstWithoutImage = pc; //ensure first without image returns if none have image } + if (cardsListReadOnly) { //ensure we don't modify a cached collection + cards = new ArrayList<>(cards); + cardsListReadOnly = false; + } + cards.remove(randomIndex); //remove card from collection and try another random card + sz--; + } } } diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 533f425c466..be8e277b372 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -146,7 +146,8 @@ public final class CardEdition implements Comparable { BUY_A_BOX("buy a box"), PROMO("promo"), BUNDLE("bundle"), - BOX_TOPPER("box topper"); + BOX_TOPPER("box topper"), + DUNGEONS("dungeons"); private final String name; @@ -216,11 +217,11 @@ public final class CardEdition implements Comparable { try { collNr = Integer.parseInt(onlyNumeric); } catch (NumberFormatException exon) { - collNr = 0; // this is the case of ONLY-letters collector numbers + collNr = 0; // this is the case of ONLY-letters collector numbers } if ((collNr > 0) && (sortableCollNr.startsWith(onlyNumeric))) // e.g. 12a, 37+, 2018f, sortableCollNr = String.format("%05d", collNr) + nonNumeric; - else // e.g. WS6, S1 + else // e.g. WS6, S1 sortableCollNr = nonNumeric + String.format("%05d", collNr); } return sortableCollNr; @@ -459,11 +460,11 @@ public final class CardEdition implements Comparable { Map cardToIndex = new HashMap<>(); List sheets = Lists.newArrayList(); - for(String sectionName : cardMap.keySet()) { + for (String sectionName : cardMap.keySet()) { PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sectionName)); List cards = cardMap.get(sectionName); - for(CardInSet card : cards) { + for (CardInSet card : cards) { int index = 1; if (cardToIndex.containsKey(card.name)) { index = cardToIndex.get(card.name); @@ -478,7 +479,7 @@ public final class CardEdition implements Comparable { sheets.add(sheet); } - for(String sheetName : customPrintSheetsToParse.keySet()) { + for (String sheetName : customPrintSheetsToParse.keySet()) { List sheetToParse = customPrintSheetsToParse.get(sheetName); CardPool sheetPool = CardPool.fromCardList(sheetToParse); PrintSheet sheet = new PrintSheet(String.format("%s %s", this.getCode(), sheetName), sheetPool); @@ -561,7 +562,7 @@ public final class CardEdition implements Comparable { // parse tokens section if (contents.containsKey("tokens")) { - for(String line : contents.get("tokens")) { + for (String line : contents.get("tokens")) { if (StringUtils.isBlank(line)) continue; @@ -589,11 +590,11 @@ public final class CardEdition implements Comparable { res.mciCode = res.code2.toLowerCase(); } res.scryfallCode = section.get("ScryfallCode"); - if (res.scryfallCode == null){ + if (res.scryfallCode == null) { res.scryfallCode = res.code; } res.cardsLanguage = section.get("CardLang"); - if (res.cardsLanguage == null){ + if (res.cardsLanguage == null) { res.cardsLanguage = "en"; } @@ -619,7 +620,7 @@ public final class CardEdition implements Comparable { res.borderColor = BorderColor.valueOf(section.get("border", "Black").toUpperCase(Locale.ENGLISH)); Type enumType = Type.UNKNOWN; if (this.isCustomEditions){ - enumType = Type.CUSTOM_SET; // Forcing ThirdParty Edition Type to avoid inconsistencies + enumType = Type.CUSTOM_SET; // Forcing ThirdParty Edition Type to avoid inconsistencies } else { String type = section.get("type"); if (null != type && !type.isEmpty()) { @@ -636,7 +637,7 @@ public final class CardEdition implements Comparable { res.prerelease = section.get("Prerelease", null); res.boosterBoxCount = Integer.parseInt(section.get("BoosterBox", enumType.getBoosterBoxDefault())); - switch(section.get("foil", "newstyle").toLowerCase()) { + switch (section.get("foil", "newstyle").toLowerCase()) { case "notsupported": res.foilType = FoilType.NOT_SUPPORTED; break; @@ -769,7 +770,7 @@ public final class CardEdition implements Comparable { @Override public Map readAll() { Map map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - for(CardEdition ce : Collection.this) { + for (CardEdition ce : Collection.this) { List boosterTypes = Lists.newArrayList(ce.getAvailableBoosterTypes()); for (String type : boosterTypes) { String setAffix = type.equals("Draft") ? "" : type; @@ -799,18 +800,18 @@ public final class CardEdition implements Comparable { for (Entry k : cards) { PaperCard cp = StaticData.instance().getCommonCards().getCardFromEdition(k.getKey().getName(), strictness); - if( cp == null && strictness == SetPreference.EarliestCoreExp) { + if (cp == null && strictness == SetPreference.EarliestCoreExp) { strictness = SetPreference.Earliest; // card is not found in core and expansions only (probably something CMD or C13) cp = StaticData.instance().getCommonCards().getCardFromEdition(k.getKey().getName(), strictness); } - if ( cp == null ) + if (cp == null) cp = k.getKey(); // it's unlikely, this code will ever run minEditions.add(cp.getEdition()); } - for(CardEdition ed : getOrderedEditions()) { - if(minEditions.contains(ed.getCode())) + for (CardEdition ed : getOrderedEditions()) { + if (minEditions.contains(ed.getCode())) return ed; } return UNKNOWN; diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index c490bbd781a..a0d6cc930aa 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -513,14 +513,14 @@ public final class CardRules implements ICardCharacteristics { case 'S': if ("S".equals(key)) { this.faces[this.curFace].addStaticAbility(value); - } else if ( "SVar".equals(key) ) { - if ( null == value ) throw new IllegalArgumentException("SVar has no variable name"); + } else if ("SVar".equals(key)) { + if (null == value) throw new IllegalArgumentException("SVar has no variable name"); colonPos = value.indexOf(':'); String variable = colonPos > 0 ? value.substring(0, colonPos) : value; value = colonPos > 0 ? value.substring(1+colonPos) : null; - if ( "Picture".equals(variable) ) { + if ("Picture".equals(variable)) { this.pictureUrl[this.curFace] = value; } else this.faces[curFace].addSVar(variable, value); diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index 257230a184a..2dc2f912a2d 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -451,8 +451,7 @@ public final class CardType implements Comparable, CardTypeView { if (calculatedType == null) { if (subtypes.isEmpty()) { calculatedType = StringUtils.join(getTypesBeforeDash(), ' '); - } - else { + } else { calculatedType = StringUtils.join(getTypesBeforeDash(), ' ') + " - " + StringUtils.join(subtypes, " "); } } diff --git a/forge-core/src/main/java/forge/card/MagicColor.java b/forge-core/src/main/java/forge/card/MagicColor.java index 13a73fb55d1..465559faa5a 100644 --- a/forge-core/src/main/java/forge/card/MagicColor.java +++ b/forge-core/src/main/java/forge/card/MagicColor.java @@ -84,7 +84,7 @@ public final class MagicColor { } public static String toShortString(final byte color) { - switch (color){ + switch (color) { case WHITE: return "W"; case BLUE: return "U"; case BLACK: return "B"; @@ -95,7 +95,7 @@ public final class MagicColor { } public static String toLongString(final byte color) { - switch (color){ + switch (color) { case WHITE: return Constant.WHITE; case BLUE: return Constant.BLUE; case BLACK: return Constant.BLACK; diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index 530e9ad2717..822c37bafe2 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -29,8 +29,8 @@ public class PrintSheet { public static final IStorage initializePrintSheets(File sheetsFile, CardEdition.Collection editions) { IStorage sheets = new StorageExtendable<>("Special print runs", new PrintSheet.Reader(sheetsFile)); - for(CardEdition edition : editions) { - for(PrintSheet ps : edition.getPrintSheetsBySection()) { + for (CardEdition edition : editions) { + for (PrintSheet ps : edition.getPrintSheetsBySection()) { sheets.add(ps.name, ps); } } @@ -64,7 +64,7 @@ public class PrintSheet { } public void addAll(Iterable cards, int weight) { - for(PaperCard card : cards) + for (PaperCard card : cards) cardsWithWeights.add(card, weight); } @@ -78,15 +78,15 @@ public class PrintSheet { private PaperCard fetchRoulette(int start, int roulette, Collection toSkip) { int sum = start; boolean isSecondRun = start > 0; - for(Entry cc : cardsWithWeights ) { + for (Entry cc : cardsWithWeights ) { sum += cc.getValue(); - if( sum > roulette ) { - if( toSkip != null && toSkip.contains(cc.getKey())) + if (sum > roulette) { + if (toSkip != null && toSkip.contains(cc.getKey())) continue; return cc.getKey(); } } - if( isSecondRun ) + if (isSecondRun) 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 @@ -94,8 +94,8 @@ public class PrintSheet { public List all() { List result = new ArrayList<>(); - for(Entry kv : cardsWithWeights) { - for(int i = 0; i < kv.getValue(); i++) { + for (Entry kv : cardsWithWeights) { + for (int i = 0; i < kv.getValue(); i++) { result.add(kv.getKey()); } } @@ -106,26 +106,26 @@ public class PrintSheet { List result = new ArrayList<>(); int totalWeight = cardsWithWeights.countAll(); - if( totalWeight == 0) { + if (totalWeight == 0) { System.err.println("No cards were found on sheet " + name); 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. int uniqueCards = cardsWithWeights.countDistinct(); - while ( number >= uniqueCards ) { - for(Entry kv : cardsWithWeights) { + while (number >= uniqueCards) { + for (Entry kv : cardsWithWeights) { result.add(kv.getKey()); } number -= uniqueCards; } List 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); PaperCard toAdd = fetchRoulette(0, index, wantUnique ? uniques : null); result.add(toAdd); - if( wantUnique ) + if (wantUnique) uniques.add(toAdd); } return result; diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index 24eccbae1b2..8ef91a52b1e 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -244,7 +244,7 @@ public class Deck extends DeckBase implements Iterable p : parts.entrySet()) { - if( p.getKey() == DeckSection.Planes || p.getKey() == DeckSection.Schemes || p.getKey() == DeckSection.Avatar) + for (Entry p : parts.entrySet()) { + if (p.getKey() == DeckSection.Planes || p.getKey() == DeckSection.Schemes || p.getKey() == DeckSection.Avatar) continue; CardPool newPool = new CardPool(); - for(Entry cp : p.getValue()){ + for (Entry cp : p.getValue()) { PaperCard card = cp.getKey(); int count = cp.getValue(); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index b0a62990da8..a9279ea019d 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -545,7 +545,7 @@ public class GameAction { if (fromBattlefield && !zoneFrom.getPlayer().equals(zoneTo.getPlayer())) { final Map runParams2 = AbilityKey.mapFromCard(lastKnownInfo); runParams2.put(AbilityKey.OriginalController, zoneFrom.getPlayer()); - if(params != null) { + if (params != null) { runParams2.putAll(params); } game.getTriggerHandler().runTrigger(TriggerType.ChangesController, runParams2, false); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index 9d2cb2c41e4..ceba5f12a53 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -75,8 +75,7 @@ public class DamageAllEffect extends DamageBaseEffect { CardCollectionView list; if (sa.hasParam("ValidCards")) { list = game.getCardsIn(ZoneType.Battlefield); - } - else { + } else { list = CardCollection.EMPTY; } diff --git a/forge-game/src/main/java/forge/game/combat/AttackRestrictionType.java b/forge-game/src/main/java/forge/game/combat/AttackRestrictionType.java index 4e283e71746..0956a885107 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRestrictionType.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRestrictionType.java @@ -19,7 +19,7 @@ public enum AttackRestrictionType { public Predicate getPredicate(final Card attacker) { switch (this) { case NEED_GREATER_POWER: - return CardPredicates.hasGreaterPowerThan(attacker.getNetPower()); + return CardPredicates.hasGreaterPowerThan(attacker.getNetPower()); case NEED_BLACK_OR_GREEN: return Predicates.and( CardPredicates.isColor((byte) (MagicColor.BLACK | MagicColor.GREEN)), diff --git a/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java b/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java index 76938cafcd5..f8165271f14 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java +++ b/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java @@ -36,8 +36,7 @@ public class ManaConversionMatrix { rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; if (additive) { colorConversionMatrix[rowIdx] |= replacementColor; - } - else { + } else { colorRestrictionMatrix[rowIdx] &= replacementColor; } } diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index 889aa5baa82..501a59d57e5 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -258,8 +258,7 @@ public class ManaCostBeingPaid { ManaCostShard shard; if (StringUtils.isEmpty(xColor)) { shard = ManaCostShard.GENERIC; - } - else { + } else { shard = ManaCostShard.parseNonGeneric(xColor); } increaseShard(shard, xCost, true); diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index c78f1cf66bb..2f890d8c5d1 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -137,18 +137,15 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { if (convertToColorless) { convertManaColor(b, (byte)ManaAtom.COLORLESS); cm.addAll(pMana); - } - else { + } else { cleared.addAll(cm); cm.clear(); floatingMana.putAll(b, pMana); } - } - else { + } else { if (convertToColorless) { convertManaColor(b, (byte)ManaAtom.COLORLESS); - } - else { + } else { cleared.addAll(cm); cm.clear(); } @@ -261,8 +258,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { if (poolLane != null && poolLane.contains(mana)) { removeFloating.add(mana); - } - else { + } else { manaNotAccountedFor = true; break; } @@ -319,7 +315,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { // TODO Debug this for Paying Gonti, byte line = getPossibleColorUses(color); - for(byte outColor : ManaAtom.MANATYPES) { + for (byte outColor : ManaAtom.MANATYPES) { if ((line & outColor) != 0 && shard.canBePaidWithManaOfColor(outColor)) { return true; } diff --git a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java index 0d787327ff1..3da293bb4ff 100644 --- a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java +++ b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java @@ -63,7 +63,7 @@ public class MulliganService { boolean allKept; do { allKept = true; - for(AbstractMulligan mulligan : mulligans) { + for (AbstractMulligan mulligan : mulligans) { if (mulligan.hasKept()) { continue; } @@ -85,7 +85,7 @@ public class MulliganService { } } while (!allKept); - for(AbstractMulligan mulligan : mulligans) { + for (AbstractMulligan mulligan : mulligans) { mulligan.afterMulligan(); } } diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index 7bf24a25d2e..08ff4bca196 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -136,7 +136,7 @@ public class RegisteredPlayer { } 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 - start.setVanguardAvatars(vanguardAvatar == null ? deck.get(DeckSection.Avatar).toFlatList():vanguardAvatar.toFlatList()); + start.setVanguardAvatars(vanguardAvatar == null ? deck.get(DeckSection.Avatar).toFlatList() : vanguardAvatar.toFlatList()); } return start; } @@ -167,7 +167,7 @@ public class RegisteredPlayer { private void setVanguardAvatars(List vanguardAvatars0) { vanguardAvatars = vanguardAvatars0; if (vanguardAvatars == null) { return; } - for(PaperCard avatar: vanguardAvatars){ + for (PaperCard avatar: vanguardAvatars) { setStartingLife(getStartingLife() + avatar.getRules().getLife()); setStartingHand(getStartingHand() + avatar.getRules().getHand()); } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index f9d75340e3e..f298d3ef624 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -163,7 +163,6 @@ public class StaticAbilityCantBeCast { return false; } - if (stAb.hasParam("AffectedZone") && !card.isInZone(ZoneType.smartValueOf(stAb.getParam("AffectedZone")))) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java index 218b3996a85..c1b51e90d34 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java @@ -48,11 +48,7 @@ public class StaticAbilityCastWithFlash { return false; } - - - public static boolean commonParts(final StaticAbility stAb, final SpellAbility sa, final Card card, final Player activator) { - if (!stAb.matchesValidParam("ValidCard", card)) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index c1d71f61551..a3b7d54e6a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -535,14 +535,12 @@ public abstract class Trigger extends TriggerReplacementBase { return this.numberTurnActivations; } - public void triggerRun() - { + public void triggerRun() { this.numberTurnActivations++; } // Resets the state stored each turn for per-turn and per-instance restriction - public void resetTurnState() - { + public void resetTurnState() { this.numberTurnActivations = 0; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 0ee95950379..046e673abe4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -335,7 +335,7 @@ public class TriggerHandler { waitingTriggers.clear(); } - public void resetTurnTriggerState() { + public void resetTurnTriggerState() { for(final Trigger t : activeTriggers) { t.resetTurnState(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index bf494e89567..cc8903b14f9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -839,7 +839,7 @@ public class VLobby implements ILobbyView { } private boolean isPlayerAI(final int playernum) { - if(playernum < activePlayersNum){ + if (playernum < activePlayersNum) { return playerPanels.get(playernum).isAi(); } return true; From df160a751e0f1384230ec5b07097e7f3095a05f3 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 23 Jul 2021 21:56:37 +0200 Subject: [PATCH 04/14] Fix predictDamageTo --- forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 1d13ed4f781..dbec74a010f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -291,14 +291,12 @@ public class ComputerUtilCombat { * @return a int. */ public static int lifeThatWouldRemain(final Player ai, final Combat combat) { - int damage = 0; final List attackers = combat.getAttackersOf(ai); final List unblocked = Lists.newArrayList(); for (final Card attacker : attackers) { - final List blockers = combat.getBlockers(attacker); if ((blockers.size() == 0) @@ -418,7 +416,6 @@ public class ComputerUtilCombat { final List threateningCommanders = getLifeThreateningCommanders(ai,combat); for (final Card attacker : attackers) { - final List blockers = combat.getBlockers(attacker); if (blockers.isEmpty()) { @@ -2266,7 +2263,7 @@ public class ComputerUtilCombat { if (!re.matchesValidParam("ValidSource", source)) { continue; } - if (!re.matchesValidParam("ValidTarget", source)) { + if (!re.matchesValidParam("ValidTarget", target)) { continue; } if (re.hasParam("IsCombat")) { From ffb40f1195344dbbd482b53a986b21aea47f8391 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sat, 24 Jul 2021 00:09:52 +0200 Subject: [PATCH 05/14] Fix Price of Loyalty --- forge-gui/res/cardsfolder/p/price_of_loyalty.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/price_of_loyalty.txt b/forge-gui/res/cardsfolder/p/price_of_loyalty.txt index 3702183da5f..79a295b0d86 100644 --- a/forge-gui/res/cardsfolder/p/price_of_loyalty.txt +++ b/forge-gui/res/cardsfolder/p/price_of_loyalty.txt @@ -2,7 +2,7 @@ Name:Price of Loyalty ManaCost:2 R 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. -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: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. From 22337e4a7b04050e50791bcb21542ffa70e8c231 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 10:44:10 -0400 Subject: [PATCH 06/14] remove Remember functions from DamageDealEffect --- .../java/forge/game/ability/effects/DamageDealEffect.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index c0990697197..00b3d408f14 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -166,8 +166,7 @@ public class DamageDealEffect extends DamageBaseEffect { 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; CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); @@ -252,10 +251,6 @@ public class DamageDealEffect extends DamageBaseEffect { internalDamageDeal(sa, sourceLKI, unTgtC, dmg, damageMap); } } - - if (remember) { - source.addRemembered(damageMap.row(sourceLKI).keySet()); - } } if (!usedDamageMap) { game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); From a8205192caa28633c10781d2d85c6a45a1b27545 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 10:44:34 -0400 Subject: [PATCH 07/14] remove Remember functions from DamageAllEffect --- .../game/ability/effects/DamageAllEffect.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index 9d2cb2c41e4..554dc10b6d1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -61,9 +61,7 @@ public class DamageAllEffect extends DamageBaseEffect { final String damage = sa.getParam("NumDmg"); final int dmg = AbilityUtils.calculateAmount(source, damage, sa); - final boolean rememberCard = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedCreature"); - final boolean rememberPlayer = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedPlayer"); - + //Remember params from this effect have been moved to dealDamage in GameAction Player targetPlayer = sa.getTargets().getFirstTargetedPlayer(); String players = ""; @@ -114,17 +112,6 @@ public class DamageAllEffect extends DamageBaseEffect { 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); } } From 94da5f3c3ae959d9f55cbd14b734243f655c358e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 10:43:23 -0400 Subject: [PATCH 08/14] add Remember objects from Damage effects to GameAction before the maps are cleared --- .../src/main/java/forge/game/GameAction.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index b0a62990da8..99fdd382d11 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -2196,6 +2196,20 @@ public class GameAction { } } + // Remember objects as needed + final Card sourceLKI = cause.getHostCard().getGame().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.clear(); From 1534636a6472c007d7e3cfd539bf03a11a62653b Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 23 Jul 2021 23:51:15 +0200 Subject: [PATCH 09/14] Fix Serpentine Spike --- .../src/main/java/forge/game/GameAction.java | 22 ++++++++++--------- .../ability/effects/DamageResolveEffect.java | 2 ++ .../res/cardsfolder/s/serpentine_spike.txt | 8 +++---- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 99fdd382d11..4409b490ee6 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -2196,16 +2196,18 @@ public class GameAction { } } - // Remember objects as needed - final Card sourceLKI = cause.getHostCard().getGame().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); + if (cause != null) { + // Remember objects as needed + final Card sourceLKI = cause.getHostCard().getGame().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); + } } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java index 4ecb1cbd2a4..c96a27937fc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java @@ -22,6 +22,8 @@ public class DamageResolveEffect extends SpellAbilityEffect { GameEntityCounterTable counterTable = sa.getCounterTable(); sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); + + replaceDying(sa); } /* (non-Javadoc) diff --git a/forge-gui/res/cardsfolder/s/serpentine_spike.txt b/forge-gui/res/cardsfolder/s/serpentine_spike.txt index e611ed4f554..110db3105dd 100644 --- a/forge-gui/res/cardsfolder/s/serpentine_spike.txt +++ b/forge-gui/res/cardsfolder/s/serpentine_spike.txt @@ -2,10 +2,10 @@ Name:Serpentine Spike ManaCost:5 R R Types:Sorcery 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. -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: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:DBDamageResolve:DB$ DamageResolve | SubAbility$ DBCleanup +A:SP$ DealDamage | Cost$ 5 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature to deal 2 damage to | NumDmg$ 2 | 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. +SVar:DBDamageTwo:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 3 damage to | NumDmg$ 3 | TargetUnique$ True | SubAbility$ DBDamageThree +SVar:DBDamageThree:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 4 damage to | NumDmg$ 4 | TargetUnique$ True | SubAbility$ DBDamageResolve +SVar:DBDamageResolve:DB$ DamageResolve | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup 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. From 4108b56135ad60198b718c6f4a48f2c33e38cc7c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 20:40:37 -0400 Subject: [PATCH 10/14] serpentine_spike.txt tidy up StackDesc --- forge-gui/res/cardsfolder/s/serpentine_spike.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/serpentine_spike.txt b/forge-gui/res/cardsfolder/s/serpentine_spike.txt index 110db3105dd..b35d6e46bc3 100644 --- a/forge-gui/res/cardsfolder/s/serpentine_spike.txt +++ b/forge-gui/res/cardsfolder/s/serpentine_spike.txt @@ -2,10 +2,9 @@ Name:Serpentine Spike ManaCost:5 R R Types:Sorcery K:Devoid -A:SP$ DealDamage | Cost$ 5 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature to deal 2 damage to | NumDmg$ 2 | 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. -SVar:DBDamageTwo:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 3 damage to | NumDmg$ 3 | TargetUnique$ True | SubAbility$ DBDamageThree -SVar:DBDamageThree:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 4 damage to | NumDmg$ 4 | TargetUnique$ True | SubAbility$ DBDamageResolve +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 | 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 | TargetUnique$ True | SubAbility$ DBDamageResolve | StackDescription$ and 4 damge to {c:ThisTargetedCard}. If a creature dealt damage this way would die this turn, exile it instead. SVar:DBDamageResolve:DB$ DamageResolve | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup 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. From 610fe7fadad39fb77c7e32c6192f03e5c3425359 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 23 Jul 2021 20:45:29 -0400 Subject: [PATCH 11/14] - typo --- forge-gui/res/cardsfolder/s/serpentine_spike.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/serpentine_spike.txt b/forge-gui/res/cardsfolder/s/serpentine_spike.txt index b35d6e46bc3..432820c06b3 100644 --- a/forge-gui/res/cardsfolder/s/serpentine_spike.txt +++ b/forge-gui/res/cardsfolder/s/serpentine_spike.txt @@ -4,7 +4,7 @@ Types:Sorcery K:Devoid 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 | 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 | TargetUnique$ True | SubAbility$ DBDamageResolve | StackDescription$ and 4 damge to {c:ThisTargetedCard}. If a creature dealt damage this way would die this turn, exile it instead. +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 | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True 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. From 6210fdd9fc30115507b23e857be3c75e88e890e8 Mon Sep 17 00:00:00 2001 From: friarsol Date: Fri, 23 Jul 2021 22:46:58 -0400 Subject: [PATCH 12/14] Move FatPacks to editions file --- .../src/main/java/forge/StaticData.java | 10 --- .../src/main/java/forge/card/CardEdition.java | 18 +++- .../src/main/java/forge/item/FatPack.java | 56 ++----------- .../main/java/forge/item/SealedProduct.java | 2 +- forge-gui/res/blockdata/fatpacks.txt | 84 ------------------- forge-gui/res/editions/Aether Revolt.txt | 2 + forge-gui/res/editions/Alara Reborn.txt | 2 + forge-gui/res/editions/Amonkhet.txt | 2 + forge-gui/res/editions/Apocalypse.txt | 1 + forge-gui/res/editions/Avacyn Restored.txt | 2 + .../res/editions/Battle for Zendikar.txt | 2 + .../res/editions/Betrayers of Kamigawa.txt | 1 + forge-gui/res/editions/Born of the Gods.txt | 2 + .../res/editions/Champions of Kamigawa.txt | 1 + forge-gui/res/editions/Coldsnap.txt | 2 + forge-gui/res/editions/Conflux.txt | 2 + forge-gui/res/editions/Dark Ascension.txt | 2 + forge-gui/res/editions/Darksteel.txt | 1 + forge-gui/res/editions/Dissension.txt | 2 + forge-gui/res/editions/Dominaria.txt | 2 + forge-gui/res/editions/Dragon's Maze.txt | 2 + forge-gui/res/editions/Dragons of Tarkir.txt | 2 + forge-gui/res/editions/Eldritch Moon.txt | 2 + forge-gui/res/editions/Eventide.txt | 2 + forge-gui/res/editions/Fate Reforged.txt | 2 + forge-gui/res/editions/Fifth Dawn.txt | 1 + forge-gui/res/editions/Future Sight.txt | 2 + forge-gui/res/editions/Gatecrash.txt | 2 + forge-gui/res/editions/Guildpact.txt | 2 + forge-gui/res/editions/Guilds of Ravnica.txt | 2 + .../res/editions/Hour of Devastation.txt | 2 + .../res/editions/Ikoria Lair of Behemoths.txt | 1 + forge-gui/res/editions/Innistrad.txt | 2 + forge-gui/res/editions/Invasion.txt | 1 + forge-gui/res/editions/Ixalan.txt | 2 + forge-gui/res/editions/Journey into Nyx.txt | 2 + forge-gui/res/editions/Judgment.txt | 1 + forge-gui/res/editions/Kaladesh.txt | 2 + forge-gui/res/editions/Kaldheim.txt | 1 + forge-gui/res/editions/Khans of Tarkir.txt | 2 + forge-gui/res/editions/Legions.txt | 1 + forge-gui/res/editions/Lorwyn.txt | 2 + forge-gui/res/editions/M19 Gift Pack.txt | 2 +- forge-gui/res/editions/Magic 2010.txt | 2 + forge-gui/res/editions/Magic 2011.txt | 2 + forge-gui/res/editions/Magic 2012.txt | 2 + forge-gui/res/editions/Magic 2013.txt | 2 + forge-gui/res/editions/Magic 2014.txt | 2 + forge-gui/res/editions/Magic 2015.txt | 2 + forge-gui/res/editions/Magic 2019.txt | 2 + forge-gui/res/editions/Magic 2020.txt | 1 + forge-gui/res/editions/Magic 2021.txt | 1 + forge-gui/res/editions/Magic Origins.txt | 2 + forge-gui/res/editions/Mercadian Masques.txt | 4 +- forge-gui/res/editions/Mirrodin Besieged.txt | 2 + forge-gui/res/editions/Mirrodin.txt | 1 + forge-gui/res/editions/Morningtide.txt | 2 + forge-gui/res/editions/Nemesis.txt | 3 +- forge-gui/res/editions/New Phyrexia.txt | 2 + forge-gui/res/editions/Ninth Edition.txt | 2 + .../res/editions/Oath of the Gatewatch.txt | 2 + forge-gui/res/editions/Odyssey.txt | 1 + forge-gui/res/editions/Onslaught.txt | 2 + forge-gui/res/editions/Planar Chaos.txt | 2 + forge-gui/res/editions/Planeshift.txt | 1 + forge-gui/res/editions/Prophecy.txt | 3 +- forge-gui/res/editions/Ravnica Allegiance.txt | 2 + .../res/editions/Ravnica City of Guilds.txt | 2 + forge-gui/res/editions/Return to Ravnica.txt | 2 + .../res/editions/Rise of the Eldrazi.txt | 2 + forge-gui/res/editions/Rivals of Ixalan.txt | 2 + .../res/editions/Saviors of Kamigawa.txt | 1 + forge-gui/res/editions/Scars of Mirrodin.txt | 2 + forge-gui/res/editions/Scourge.txt | 1 + forge-gui/res/editions/Shadowmoor.txt | 2 + .../res/editions/Shadows over Innistrad.txt | 2 + forge-gui/res/editions/Shards of Alara.txt | 2 + .../editions/Strixhaven School of Mages.txt | 1 + forge-gui/res/editions/Tenth Edition.txt | 2 + .../res/editions/Theros Beyond Death.txt | 1 + forge-gui/res/editions/Theros.txt | 2 + forge-gui/res/editions/Throne of Eldraine.txt | 2 + .../res/editions/Time Spiral Timeshifted.txt | 2 + forge-gui/res/editions/Time Spiral.txt | 2 + forge-gui/res/editions/Torment.txt | 1 + forge-gui/res/editions/War of the Spark.txt | 2 + forge-gui/res/editions/Worldwake.txt | 2 + forge-gui/res/editions/Zendikar Rising.txt | 1 + forge-gui/res/editions/Zendikar.txt | 2 + 89 files changed, 174 insertions(+), 147 deletions(-) delete mode 100644 forge-gui/res/blockdata/fatpacks.txt diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 4dc8e927706..6dd7ad72253 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -52,8 +52,6 @@ public class StaticData { private IStorage boosters; private IStorage specialBoosters; private IStorage tournaments; - private IStorage fatPacks; - private IStorage boosterBoxes; private IStorage printSheets; private static StaticData lastInstance = null; @@ -239,14 +237,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 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}> */ public final IStorage getTournamentPacks() { if (tournaments == null) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 533f425c466..fdceecf16ef 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -102,6 +102,16 @@ public final class CardEdition implements Comparable { } } + public String getFatPackDefault() { + switch (this) { + case CORE: + case EXPANSION: + return "10"; + default: + return "0"; + } + } + public String toString(){ String[] names = TextUtil.splitWithParenthesis(this.name().toLowerCase(), '_'); for (int i = 0; i < names.length; i++) @@ -260,6 +270,8 @@ public final class CardEdition implements Comparable { // SealedProduct private String prerelease = null; private int boosterBoxCount = 36; + private int fatPackCount = 10; + private String fatPackExtraSlots = ""; // Booster/draft info private boolean smallSetOverride = false; @@ -350,6 +362,8 @@ public final class CardEdition implements Comparable { public String getPrerelease() { return prerelease; } public int getBoosterBoxCount() { return boosterBoxCount; } + public int getFatPackCount() { return fatPackCount; } + public String getFatPackExtraSlots() { return fatPackExtraSlots; } public FoilType getFoilType() { return foilType; } public double getFoilChanceInBooster() { return foilChanceInBooster; } @@ -635,6 +649,8 @@ public final class CardEdition implements Comparable { res.type = enumType; res.prerelease = section.get("Prerelease", null); 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()) { case "notsupported": @@ -852,7 +868,7 @@ public final class CardEdition implements Comparable { private static class CanMakeFatPack implements Predicate { @Override public boolean apply(final CardEdition subject) { - return StaticData.instance().getFatPacks().contains(subject.getCode()); + return subject.getFatPackCount() > 0; } } diff --git a/forge-core/src/main/java/forge/item/FatPack.java b/forge-core/src/main/java/forge/item/FatPack.java index 2ee80d07309..3d0f65a3b7b 100644 --- a/forge-core/src/main/java/forge/item/FatPack.java +++ b/forge-core/src/main/java/forge/item/FatPack.java @@ -18,10 +18,8 @@ package forge.item; -import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Function; @@ -30,16 +28,17 @@ import forge.ImageKeys; import forge.StaticData; import forge.card.CardEdition; import forge.item.generation.BoosterGenerator; -import forge.util.TextUtil; -import forge.util.storage.StorageReaderFile; public class FatPack extends BoxedProduct { public static final Function FN_FROM_SET = new Function() { @Override - public FatPack apply(final CardEdition arg1) { - FatPack.Template d = StaticData.instance().getFatPacks().get(arg1.getCode()); + public FatPack apply(final CardEdition edition) { + int boosters = edition.getFatPackCount(); + if (boosters <= 0) { return null; } + + FatPack.Template d = new Template(edition); 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); } - /*@Override - protected List generate() { - List result = new ArrayList(); - 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 public final Object clone() { return new FatPack(name, fpData, fpData.cntBoosters); @@ -92,38 +80,12 @@ public class FatPack extends BoxedProduct { public static class Template extends SealedProduct.Template { private final int cntBoosters; - public int getCntBoosters() { return cntBoosters; } - private Template(String edition, int boosters, Iterable> itrSlots) - { - super(edition, itrSlots); - cntBoosters = boosters; - } + private Template(CardEdition edition) { + super(edition.getCode(), edition.getFatPackExtraSlots()); - public static final class Reader extends StorageReaderFile