diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 2883caaf9c7..266ec4403fa 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -149,6 +149,19 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return !StringUtils.isNumeric(s); } + private static CardRequest fromPreferredArtEntry(String preferredArt, boolean isFoil){ + // Preferred Art Entry are supposed to be cardName|setCode|artIndex only + String[] info = TextUtil.split(preferredArt, NameSetSeparator); + if (info.length != 3) + return null; + try { + String cardName = info[0]; + String setCode = info[1]; + int artIndex = Integer.parseInt(info[2]); + return new CardRequest(cardName, setCode, artIndex, isFoil, IPaperCard.NO_COLLECTOR_NUMBER); + } catch (NumberFormatException ex){ return null; } + } + public static CardRequest fromString(String reqInfo) { if (reqInfo == null) return null; @@ -180,21 +193,25 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { cardName = cardName.substring(0, cardName.length() - foilSuffix.length()); isFoil = true; } - - String preferredArt = artPrefs.get(cardName); int artIndex = artPos > 0 ? Integer.parseInt(info[artPos]) : IPaperCard.NO_ART_INDEX; // default: no art index - if (preferredArt != null) { //account for preferred art if needed - System.err.println("I AM HERE - DECIDE WHAT TO DO"); - } String collectorNumber = cNrPos > 0 ? info[cNrPos].substring(1, info[cNrPos].length() - 1) : IPaperCard.NO_COLLECTOR_NUMBER; - String setName = setPos > 0 ? info[setPos] : null; - if (setName != null && setName.equals(CardEdition.UNKNOWN.getCode())) { // ??? - setName = null; + String setCode = setPos > 0 ? info[setPos] : null; + if (setCode != null && setCode.equals(CardEdition.UNKNOWN.getCode())) { // ??? + setCode = null; + } + if (setCode == null) { + String preferredArt = artPrefs.get(cardName); + if (preferredArt != null) { //account for preferred art if needed + CardRequest request = fromPreferredArtEntry(preferredArt, isFoil); + if (request != null) // otherwise, simply discard it and go on. + return request; + System.err.println(String.format("[LOG]: Faulty Entry in Preferred Art for Card %s - Please check!", cardName)); + } } // finally, check whether any between artIndex and CollectorNumber has been set if (collectorNumber.equals(IPaperCard.NO_COLLECTOR_NUMBER) && artIndex == IPaperCard.NO_ART_INDEX) artIndex = IPaperCard.DEFAULT_ART_INDEX; - return new CardRequest(cardName, setName, artIndex, isFoil, collectorNumber); + return new CardRequest(cardName, setCode, artIndex, isFoil, collectorNumber); } } @@ -374,11 +391,11 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return pc; } - public boolean setPreferredArt(String cardName, String preferredArt) { - CardRequest request = CardRequest.fromString(cardName + NameSetSeparator + preferredArt); - PaperCard pc = tryGetCard(request); + public boolean setPreferredArt(String cardName, String setCode, int artIndex) { + String cardRequestForPreferredArt = CardRequest.compose(cardName, setCode, artIndex); + PaperCard pc = this.getCard(cardRequestForPreferredArt); if (pc != null) { - artPrefs.put(cardName, preferredArt); + artPrefs.put(cardName, cardRequestForPreferredArt); uniqueCardsByName.put(cardName, pc); return true; } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index f0742812e9f..90f6b2da7dc 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -221,23 +221,23 @@ public final class GameActionUtil { continue; } - final SpellAbility flashback = sa.copy(activator); - flashback.setAlternativeCost(AlternativeCost.Flashback); - flashback.getRestrictions().setZone(ZoneType.Graveyard); + SpellAbility flashback = null; // there is a flashback cost (and not the cards cost) - if (keyword.contains(":")) { + if (keyword.contains(":")) { // K:Flashback:Cost:ExtraParams:ExtraDescription final String[] k = keyword.split(":"); - flashback.setPayCosts(new Cost(k[1], false)); + flashback = sa.copyWithManaCostReplaced(activator, new Cost(k[1], false)); String extraParams = k.length > 2 ? k[2] : ""; if (!extraParams.isEmpty()) { - Map extraParamMap = - Maps.newHashMap(AbilityFactory.getMapParams(extraParams)); - for (Map.Entry param : extraParamMap.entrySet()) { + for (Map.Entry param : AbilityFactory.getMapParams(extraParams).entrySet()) { flashback.putParam(param.getKey(), param.getValue()); } } + } else { // same cost as original (e.g. Otaria plane) + flashback = sa.copy(activator); } + flashback.setAlternativeCost(AlternativeCost.Flashback); + flashback.getRestrictions().setZone(ZoneType.Graveyard); alternatives.add(flashback); } else if (keyword.startsWith("Foretell")) { // Foretell cast only from Exile diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 4b805cbd9be..c7710814b49 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2169,40 +2169,25 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("Event$ Moved | ValidCard$ Card.Self | Origin$ Stack | ExcludeDestination$ Exile "); sb.append("| ValidStackSa$ Spell.Flashback | Description$ Flashback"); - String reminderInsert = ""; - // K:Flashback:Cost:ExtraParams:ExtraDescription:cost for display:reminder text insert - if (keyword.contains(":")) { + if (keyword.contains(":")) { // K:Flashback:Cost:ExtraParams:ExtraDescription final String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); - sb.append(cost.isOnlyManaCost() ? " " : "—"); + sb.append(cost.isOnlyManaCost() ? " " : "—").append(cost.toSimpleString()); + sb.append(cost.isOnlyManaCost() ? "" : "."); - String prettyCost = k.length > 4 ? k[4] : ""; - if (!prettyCost.isEmpty()) { - sb.append(prettyCost); - } else { - sb.append(cost.toSimpleString()); - } - - if (!cost.isOnlyManaCost()) { - sb.append("."); - } String extraDesc = k.length > 3 ? k[3] : ""; - if (!extraDesc.isEmpty()) { - if (!cost.isOnlyManaCost()) { - sb.append(" ").append(extraDesc); - } else { - sb.append(". ").append(extraDesc); - } + if (!extraDesc.isEmpty()) { // extra params added in GameActionUtil, desc added here + sb.append(cost.isOnlyManaCost() ? ". " : " ").append(extraDesc); } - reminderInsert = k.length > 5 ? k[5] : ""; } sb.append(" ("); - if (!reminderInsert.isEmpty()) { + if (host.hasStartOfKeyword("AlternateAdditionalCost") + || !host.getFirstSpellAbility().getPayCosts().isOnlyManaCost()) { String reminder = inst.getReminderText(); - sb.append(reminder, 0, 65).append(" "); - sb.append(reminderInsert).append(reminder, 65, 81); + sb.append(reminder, 0, 65).append(" and any additional costs"); + sb.append(reminder, 65, 81); } else { sb.append(inst.getReminderText()); } diff --git a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java index 90de7699780..ecfda6b4c7b 100644 --- a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java @@ -2193,6 +2193,58 @@ public class CardDbTestCase extends ForgeCardMockTestCase { assertEquals(counterSpellCard.getName(), cardNameCounterspell); } + @Test void prepareTestCaseForSetPreferredArtTest(){ + String setCode = this.editionsCounterspell[0]; + int artIndex = 4; // non-existing + String cardRequest = CardDb.CardRequest.compose(this.cardNameCounterspell, setCode, artIndex); + PaperCard nonExistingCounterSpell = this.cardDb.getCard(cardRequest); + assertNull(nonExistingCounterSpell); + } + + @Test void setPreferredArtForCard(){ + String cardName = "Mountain"; + String setCode = "3ED"; + int artIndex = 5; + assertFalse(this.cardDb.setPreferredArt(cardName, setCode, artIndex)); + assertTrue(this.cardDb.setPreferredArt(cardName, setCode, 1)); + } + + + @Test void testThatWithCardPreferenceSetAndNoRequestForSpecificEditionAlwaysReturnsPreferredArt(){ + String cardRequest = CardDb.CardRequest.compose("Island", "MIR", 3); + PaperCard islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + + // now set preferred art + assertTrue(this.cardDb.setPreferredArt("Island", "MIR", 3)); + // Now requesting for a different Island + cardRequest = CardDb.CardRequest.compose("Island", "TMP", 1); + islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + // Now card should be from the preferred art no matter the request + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "TMP"); + assertEquals(islandCard.getArtIndex(), 1); + + // Now just asking for an Island + islandCard = this.cardDb.getCard("Island"); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + + // Now asking for a foiled island - I will get the one from preferred art - but foiled + cardRequest = CardDb.CardRequest.compose("Island", true); + islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + assertTrue(islandCard.isFoil()); + } } diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index e6c671f068a..d3590ddbe96 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1281,7 +1281,7 @@ public class FDeckEditor extends TabPageScreen { if (result != card) { cardManager.replaceAll(card, result); } - prefs.setPreferredArt(result.getEdition() + CardDb.NameSetSeparator + result.getArtIndex()); + prefs.setPreferredArt(result.getEdition(), result.getArtIndex()); CardPreferences.save(); } } diff --git a/forge-gui/res/cardsfolder/b/blast_from_the_past.txt b/forge-gui/res/cardsfolder/b/blast_from_the_past.txt index 69094fda6fe..9e7781a1444 100644 --- a/forge-gui/res/cardsfolder/b/blast_from_the_past.txt +++ b/forge-gui/res/cardsfolder/b/blast_from_the_past.txt @@ -4,7 +4,7 @@ Types:Instant K:Madness:R K:Cycling:1 R K:Kicker:2 R -K:Flashback 3 R +K:Flashback:3 R K:Buyback:4 R A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 2 | SubAbility$ DBToken | SpellDescription$ CARDNAME deals 2 damage to target creature or player. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin | TokenOwner$ You | Condition$ Kicked | LegacyImage$ r 1 1 goblin ugl | ConditionDescription$ If CARDNAME was kicked, create a 1/1 red Goblin creature token. diff --git a/forge-gui/res/cardsfolder/g/gaze_of_justice.txt b/forge-gui/res/cardsfolder/g/gaze_of_justice.txt index c31a3c9d15e..8858911caf4 100644 --- a/forge-gui/res/cardsfolder/g/gaze_of_justice.txt +++ b/forge-gui/res/cardsfolder/g/gaze_of_justice.txt @@ -1,6 +1,6 @@ Name:Gaze of Justice ManaCost:W Types:Sorcery -K:Flashback:5 W tapXType<3/Creature.White/white creature> -A:SP$ ChangeZone | Cost$ W tapXType<3/Creature.White> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | CostDesc$ As an additional cost to cast this spell, tap three untapped white creatures you control. | SpellDescription$ Exile target creature. +K:Flashback:5 W +A:SP$ ChangeZone | Cost$ W tapXType<3/Creature.White/white creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | CostDesc$ As an additional cost to cast this spell, tap three untapped white creatures you control. | SpellDescription$ Exile target creature. Oracle:As an additional cost to cast this spell, tap three untapped white creatures you control.\nExile target creature.\nFlashback {5}{W} (You may cast this card from your graveyard for its flashback cost and any additional costs. Then exile it.) diff --git a/forge-gui/res/cardsfolder/g/guardian_of_faith.txt b/forge-gui/res/cardsfolder/g/guardian_of_faith.txt index 1b6ec869b7e..243dc3fa146 100644 --- a/forge-gui/res/cardsfolder/g/guardian_of_faith.txt +++ b/forge-gui/res/cardsfolder/g/guardian_of_faith.txt @@ -5,6 +5,6 @@ PT:3/2 K:Flash K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPhaseOut | TriggerDescription$ When CARDNAME enters the battlefield, any number of other target creatures you control phase out. (Treat them and anything attached to them as though they don't exist until their controller's next turn.) -SVar:TrigPhaseOut:DB$ Phases | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select target artifact, creature or land | TargetMin$ 0 | TargetMax$ MaxTgts | SelectPrompt$ Choose any number of non-Angel creatures you control | Duration$ UntilHostLeavesPlay +SVar:TrigPhaseOut:DB$ Phases | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select other creature | TargetMin$ 0 | TargetMax$ MaxTgts | SelectPrompt$ Choose any number of creatures you control | Duration$ UntilHostLeavesPlay SVar:MaxTgts:Count$Valid Creature.Other+YouCtrl Oracle:Flash\nVigilance\nWhen Guardian of Faith enters the battlefield, any number of other target creatures you control phase out. (Treat them and anything attached to them as though they don't exist until their controller's next turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/candlelit_cavalry.txt b/forge-gui/res/cardsfolder/upcoming/candlelit_cavalry.txt index b9ff6e67850..190a8e1005c 100644 --- a/forge-gui/res/cardsfolder/upcoming/candlelit_cavalry.txt +++ b/forge-gui/res/cardsfolder/upcoming/candlelit_cavalry.txt @@ -2,7 +2,7 @@ Name:Candlelit Cavalry ManaCost:4 G Types:Creature Human Knight PT:5/5 -T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigPump | TriggerDescription$ Coven – At the beginning of combat on your turn, if you control three or more creatures with different powers, CARDNAME gains trample until end of turn. +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigPump | TriggerDescription$ Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, CARDNAME gains trample until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Trample SVar:X:Count$DifferentPower_Creature.YouCtrl Oracle:Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, Candlelit Cavalry gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt b/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt new file mode 100644 index 00000000000..a5aab0cfa79 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt @@ -0,0 +1,10 @@ +Name:Contortionist Troupe +ManaCost:X G +Types:Creature Human +PT:0/0 +K:etbCounter:P1P1:X +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE3 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven — At the beginning of your end step, if you control three or more creatures with different powers, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +SVar:X:Count$DifferentPower_Creature.YouCtrl +DeckHas:Ability$Counters +Oracle:Contortionist Troupe enters the battlefield with X +1/+1 counters on it.\nCoven — At the beginning of your end step, if you control three or more creatures with different powers, put a +1/+1 counter on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt b/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt index 163aa1bf9e7..087ec075d39 100644 --- a/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt +++ b/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt @@ -1,11 +1,9 @@ Name:Corpse Cobble ManaCost:U B Types:Instant -#Text:As an additional cost to cast this spell, sacrifice any number of creatures. -A:SP$ Token | Cost$ U B Sac | RememberCostCards$ True | TokenScript$ ub_x_x_zombie_menace | TokenPower$ Y | TokenToughness$ Y | SubAbility$ DBCleanup | SpellDescription$ Create an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -K:Flashback:3 U B Sac:::{3}{U}{B}:and any additional costs +A:SP$ Token | Cost$ U B Sac | TokenScript$ ub_x_x_zombie_menace | TokenPower$ Y | TokenToughness$ Y | SpellDescription$ Create an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures. +K:Flashback:3 U B SVar:X:Count$xPaid -SVar:Y:RememberedLKI$CardPower +SVar:Y:Sacrificed$CardPower DeckHas:Ability$Sacrifice & Ability$Token Oracle:As an additional cost to cast this spell, sacrifice any number of creatures.\nCreate an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures.\nFlashback {3}{U}{B} (You may cast this card from your graveyard for its flashback cost and any additional costs. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/curse_of_silence.txt b/forge-gui/res/cardsfolder/upcoming/curse_of_silence.txt new file mode 100644 index 00000000000..de3ad32e9a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/curse_of_silence.txt @@ -0,0 +1,12 @@ +Name:Curse of Silence +ManaCost:W +Types:Enchantment Aura Curse +K:Enchant player +A:SP$ Attach | ValidTgts$ Player | AILogic$ Curse +K:ETBReplacement:Other:DBNameCard +SVar:DBNameCard:DB$ NameCard | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a card name. +S:Mode$ RaiseCost | EffectZone$ Battlefield | ValidCard$ Card.NamedCard | Type$ Spell | Activator$ Player.EnchantedBy | Amount$ 2 | Description$ Spells with the chosen name enchanted player casts cost {2} more to cast. +T:Mode$ SpellCast | ValidCard$ Card.NamedCard | ValidActivatingPlayer$ Player.EnchantedBy | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted player casts a spell with the chosen name, you may sacrifice Curse of Silence. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 +DeckHas:Ability$Sacrifice +Oracle:Enchant player\nAs Curse of Silence enters the battlefield, choose a card name.\nSpells with the chosen name enchanted player casts cost {2} more to cast.\nWhenever enchanted player casts a spell with the chosen name, you may sacrifice Curse of Silence. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/devoted_grafkeeper_departed_soulkeeper.txt b/forge-gui/res/cardsfolder/upcoming/devoted_grafkeeper_departed_soulkeeper.txt new file mode 100644 index 00000000000..5617e0f3a51 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/devoted_grafkeeper_departed_soulkeeper.txt @@ -0,0 +1,26 @@ +Name:Devoted Grafkeeper +ManaCost:W U +Types:Creature Human Peasant +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, mill two cards. +SVar:TrigMill:DB$ Mill | NumCards$ 2 | Defined$ You +T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidActivatingPlayer$ You | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell from your graveyard, tap target creature you don't control. +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control +DeckHas:Ability$Mill +DeckHints:Ability$Graveyard +K:Disturb:1 W U +AlternateMode:DoubleFaced +Oracle:When Devoted Grafkeeper enters the battlefield, mill two cards.\nWhenever you cast a spell from your graveyard, tap target creature you don't control.\nDisturb {1}{W}{U} (You may cast this card from your graveyard transformed for its disturb cost.) + +ALTERNATE + +Name:Departed Soulkeeper +ManaCost:no cost +Colors:white,blue +Types:Creature Spirit +PT:3/1 +K:Flying +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead. +SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard +Oracle:Flying\nDeparted Soulkeeper can block only creatures with flying.\nIf Departed Soulkeeper would be put into a graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/hobbling_zombie.txt b/forge-gui/res/cardsfolder/upcoming/hobbling_zombie.txt new file mode 100644 index 00000000000..8af29ae39ea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hobbling_zombie.txt @@ -0,0 +1,9 @@ +Name:Hobbling Zombie +ManaCost:2 B +Types:Creature Zombie +PT:2/2 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create a 2/2 black Zombie creature with decayed. (It can't block. When it attacks, sacrifice it at end of combat.) +SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie_decayed +DeckHas:Ability$Token +Oracle:Deathtouch\nWhen Hobbling Zombie dies, create a 2/2 black Zombie creature with decayed. (It can't block. When it attacks, sacrifice it at end of combat.) diff --git a/forge-gui/res/cardsfolder/upcoming/leinore_autumn_sovereign.txt b/forge-gui/res/cardsfolder/upcoming/leinore_autumn_sovereign.txt index 4c53c5fe20b..6a834dca7db 100644 --- a/forge-gui/res/cardsfolder/upcoming/leinore_autumn_sovereign.txt +++ b/forge-gui/res/cardsfolder/upcoming/leinore_autumn_sovereign.txt @@ -2,9 +2,9 @@ Name:Leinore, Autumn Sovereign ManaCost:2 G W Types:Legendary Creature Human Sovereign PT:0/4 -T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven – At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if you control three or more creatures with different powers, draw a card. +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven — At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if you control three or more creatures with different powers, draw a card. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE3 SVar:X:Count$DifferentPower_Creature.YouCtrl DeckHas:Ability$Counters -Oracle:Coven – At the beginning of combat on your turn, put a +1/+1 counter on up to one creature you control. Then if you control three or more creatures with different powers, draw a card. +Oracle:Coven — At the beginning of combat on your turn, put a +1/+1 counter on up to one creature you control. Then if you control three or more creatures with different powers, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/light_up_the_night.txt b/forge-gui/res/cardsfolder/upcoming/light_up_the_night.txt index 7268f2c41c3..f597e6aed5d 100644 --- a/forge-gui/res/cardsfolder/upcoming/light_up_the_night.txt +++ b/forge-gui/res/cardsfolder/upcoming/light_up_the_night.txt @@ -5,6 +5,6 @@ A:SP$ DealDamage | Cost$ X R | ValidTgts$ Creature,Player,Planeswalker | TgtProm SVar:X:Count$xPaid SVar:Y:Targeted$Valid Creature,Planeswalker SVar:Z:SVar$X/Plus.Y -K:Flashback:XCantBe0 3 R RemoveAnyCounter::If you cast this spell this way, X can't be 0.:{3}{R}, Remove X loyalty counters from among planeswalkers you control +K:Flashback:XCantBe0 3 R RemoveAnyCounter::If you cast this spell this way, X can't be 0. DeckHints:Type$Planeswalker Oracle:Light Up the Night deals X damage to any target. It deals X plus 1 damage instead if that target is a creature or planeswalker.\nFlashback—{3}{R}, Remove X loyalty counters from among planeswalkers you control. If you cast this spell this way, X can't be 0. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/sigarda_champion_of_light.txt b/forge-gui/res/cardsfolder/upcoming/sigarda_champion_of_light.txt index a5e30299231..263884a0b2c 100644 --- a/forge-gui/res/cardsfolder/upcoming/sigarda_champion_of_light.txt +++ b/forge-gui/res/cardsfolder/upcoming/sigarda_champion_of_light.txt @@ -5,8 +5,8 @@ PT:4/4 K:Flying K:Trample S:Mode$ Continuous | Affected$ Creature.Human+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Humans you control get +1/+1. -T:Mode$ Attacks | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigDig | TriggerDescription$ Coven - Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +T:Mode$ Attacks | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigDig | TriggerDescription$ Coven — Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.Human SVar:X:Count$DifferentPower_Creature.YouCtrl DeckNeeds:Type$Human -Oracle:Flying, trample\nHumans you control get +1/+1\nCoven - Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +Oracle:Flying, trample\nHumans you control get +1/+1\nCoven — Whenever Sigarda attacks, if you control three or more creatures with different powers, look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/formats/Casual/Commander.txt b/forge-gui/res/formats/Casual/Commander.txt index d1bc20d8226..35011925e6b 100644 --- a/forge-gui/res/formats/Casual/Commander.txt +++ b/forge-gui/res/formats/Casual/Commander.txt @@ -3,4 +3,4 @@ Name:Commander Type:Casual Subtype:Commander Order:137 -Banned:Adriana's Valor; Advantageous Proclamation; Ashnod's Coupon; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Cross; Double Deal; Double Dip; Double Play; Double Stroke; Double Take; Echoing Boon; Emissary's Ploy; Enter the Dungeon; Flash; Hired Heist; Hold the Perimeter; Hullbreacher; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lutri, the Spellchaser; Magical Hacker; Mox Lotus; Muzzio's Preparations; Natural Unity; Once More with Feeling; Power Play; R&D's Secret Lair; Richard Garfield, Ph.D.; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Staying Power; Summoner's Bond; Time Machine; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Biorhythm; Black Lotus; Braids, Cabal Minion; Chaos Orb; Coalition Victory; Channel; Emrakul, the Aeons Torn; Erayo, Soratami Ascendant; Falling Star; Fastbond; Gifts Ungiven; Griselbrand; Iona, Shield of Emeria; Karakas; Leovold, Emissary of Trest; Library of Alexandria; Limited Resources; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Panoptic Mirror; Paradox Engine; Primeval Titan; Prophet of Kruphix; Recurring Nightmare; Rofellos, Llanowar Emissary; Shahrazad; Sundering Titan; Sway of the Stars; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Trace Secrets; Upheaval; Worldfire; Yawgmoth's Bargain +Banned:Adriana's Valor; Advantageous Proclamation; Ashnod's Coupon; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Cross; Double Deal; Double Dip; Double Play; Double Stroke; Double Take; Echoing Boon; Emissary's Ploy; Enter the Dungeon; Flash; Hired Heist; Hold the Perimeter; Hullbreacher; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lutri, the Spellchaser; Magical Hacker; Mox Lotus; Muzzio's Preparations; Natural Unity; Once More with Feeling; Power Play; R&D's Secret Lair; Richard Garfield, Ph.D.; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Staying Power; Summoner's Bond; Time Machine; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Biorhythm; Black Lotus; Braids, Cabal Minion; Chaos Orb; Coalition Victory; Channel; Emrakul, the Aeons Torn; Erayo, Soratami Ascendant; Falling Star; Fastbond; Gifts Ungiven; Griselbrand; Iona, Shield of Emeria; Karakas; Leovold, Emissary of Trest; Library of Alexandria; Limited Resources; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Panoptic Mirror; Paradox Engine; Primeval Titan; Prophet of Kruphix; Recurring Nightmare; Rofellos, Llanowar Emissary; Shahrazad; Sundering Titan; Sway of the Stars; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Trade Secrets; Upheaval; Worldfire; Yawgmoth's Bargain; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils diff --git a/forge-gui/res/formats/Casual/Oathbreaker.txt b/forge-gui/res/formats/Casual/Oathbreaker.txt index 515dc053259..4568d4b51b2 100644 --- a/forge-gui/res/formats/Casual/Oathbreaker.txt +++ b/forge-gui/res/formats/Casual/Oathbreaker.txt @@ -3,4 +3,4 @@ Name:Oathbreaker Type:Casual Subtype:Commander Order:141 -Banned:Adriana's Valor; Advantageous Proclamation; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Stroke; Echoing Boon; Emissary's Ploy; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Muzzio's Preparations; Natural Unity; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Chaos Orb; Falling Star; Shahrazad; Ad Nauseam; Ancestral Recall; Balance; Biorhythm; Black Lotus; Channel; Doomsday; Emrakul, the Aeons Torn; Expropriate; Fastbond; Gifts Ungiven; Griselbrand; High Tide; Library of Alexandria; Limited Resources; Lion's Eye Diamond; Mana Crypt; Mana Geyser; Mana Vault; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Natural Order; Painter's Servant; Panoptic Mirror; Primal Surge; Recurring Nightmare; Saheeli, the Gifted; Sol Ring; Sundering Titan; Sway of the Stars; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Tooth and Nail; Trade Secrets; Upheaval; Worldfire; Yawgmoth's Bargain +Banned:Adriana's Valor; Advantageous Proclamation; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Stroke; Echoing Boon; Emissary's Ploy; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Muzzio's Preparations; Natural Unity; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Chaos Orb; Falling Star; Shahrazad; Ad Nauseam; Ancestral Recall; Balance; Biorhythm; Black Lotus; Channel; Doomsday; Emrakul, the Aeons Torn; Expropriate; Fastbond; Gifts Ungiven; Griselbrand; High Tide; Library of Alexandria; Limited Resources; Lion's Eye Diamond; Mana Crypt; Mana Geyser; Mana Vault; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Natural Order; Painter's Servant; Panoptic Mirror; Primal Surge; Saheeli, the Gifted; Sol Ring; Sundering Titan; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Tooth and Nail; Trade Secrets; Upheaval; Yawgmoth's Bargain; Cleanse; Crusade; Dark Ritual; Imprison; Invoke Prejudice; Jeweled Lotus; Jihad; Pradesh Gypsies; Stone-Throwing Devils diff --git a/forge-gui/res/formats/Casual/Pauper.txt b/forge-gui/res/formats/Casual/Pauper.txt index c2135d4c184..20b8ecb3e34 100644 --- a/forge-gui/res/formats/Casual/Pauper.txt +++ b/forge-gui/res/formats/Casual/Pauper.txt @@ -4,4 +4,4 @@ Order:108 Subtype:Custom Type:Casual Rarities:L, C -Banned:Arcum's Astrolabe; Cloud of Faeries; Cloudpost; Cranial Plating; Daze; Empty the Warrens; Expedition Map; Fall from Favor; Frantic Search; Gitaxian Probe; Grapeshot; Gush; Invigorate; Mystic Sanctuary; Peregrine Drake; Temporal Fissure; Treasure Cruise +Banned:Arcum's Astrolabe; Chatterstorm; Cloud of Faeries; Cloudpost; Cranial Plating; Daze; Expedition Map; Empty the Warrens; Fall from Favor; Frantic Search; Gitaxian Probe; Grapeshot; Gush; High Tide; Hymn to Tourach; Invigorate; Mystic Sanctuary; Peregrine Drake; Sinkhole; Sojourner's Companion; Temporal Fissure; Treasure Cruise diff --git a/forge-gui/res/formats/Sanctioned/Extended.txt b/forge-gui/res/formats/Sanctioned/Extended.txt index b38de6291b7..8872cbd056a 100644 --- a/forge-gui/res/formats/Sanctioned/Extended.txt +++ b/forge-gui/res/formats/Sanctioned/Extended.txt @@ -5,4 +5,4 @@ Subtype:Extended Effective:2013-07-19 Retired:2013-10-08 Sets:ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14 -Banned:Jace, the Mind Sculptor; Mental Misstep; Ponder; Preordain; Stoneforge Mystic \ No newline at end of file +Banned:Mental Misstep; Ponder diff --git a/forge-gui/res/formats/Sanctioned/Legacy.txt b/forge-gui/res/formats/Sanctioned/Legacy.txt index fe8022b5753..f582a5832ed 100644 --- a/forge-gui/res/formats/Sanctioned/Legacy.txt +++ b/forge-gui/res/formats/Sanctioned/Legacy.txt @@ -4,4 +4,4 @@ Order:105 Subtype:Legacy Type:Sanctioned Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21 -Banned:Adriana's Valor; Advantageous Proclamation; Arcum's Astrolabe; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Deathrite Shaman; Double Stroke; Dreadhorde Arcanist; Echoing Boon; Emissary's Ploy; Gitaxian Probe; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lurrus of the Dream-Den; Muzzio's Preparations; Natural Unity; Oko, Thief of Crowns; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Underworld Breach; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Channel; Chaos Orb; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Library of Alexandria; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker +Banned:Adriana's Valor; Advantageous Proclamation; Arcum's Astrolabe; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Deathrite Shaman; Double Stroke; Dreadhorde Arcanist; Echoing Boon; Emissary's Ploy; Gitaxian Probe; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lurrus of the Dream-Den; Muzzio's Preparations; Natural Unity; Oko, Thief of Crowns; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Underworld Breach; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Channel; Chaos Orb; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Library of Alexandria; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index c44e7dcce6c..b8527090b08 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -4,4 +4,4 @@ Order:101 Subtype:Standard Type:Sanctioned Sets:ELD, THB, IKO, M21, ZNR, KHM, STX, AFR -Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath; Veil of Summer +Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath diff --git a/forge-gui/res/formats/Sanctioned/Vintage.txt b/forge-gui/res/formats/Sanctioned/Vintage.txt index b1392c87d89..4a2e599c1c0 100644 --- a/forge-gui/res/formats/Sanctioned/Vintage.txt +++ b/forge-gui/res/formats/Sanctioned/Vintage.txt @@ -4,5 +4,5 @@ Order:104 Subtype:Vintage Type:Sanctioned Sets:7ED, 9ED, ORI, M14, M15, 6ED, 8ED, M11, 3ED, M10, M12, 10E, M13, G18, M21, M20, M19, 5ED, 2ED, 4ED, LEB, LEA, 5DN, SOM, KTK, THS, DIS, JOU, MOR, TMP, SOI, FEM, USG, ALL, ROE, EXO, TSP, LRW, TOR, ALA, RIX, DGM, DKA, MBS, AER, RNA, GTC, CSP, HML, NPH, OGW, ZNR, EMN, UDS, SHM, BNG, SOK, EVE, INV, THB, DOM, NMS, VIS, WAR, GRN, PCY, SCG, MRD, XLN, ONS, IKO, MMQ, CHK, ULG, AKH, MIR, ISD, AVR, KLD, APC, RTR, WWK, PLC, HOU, LEG, AFR, ARN, ICE, STX, LGN, ARB, KHM, CFX, TSB, ZEN, ELD, JUD, GPT, BFZ, BOK, DTK, FRF, FUT, WTH, ODY, RAV, ATQ, DRK, PLS, STH, DST, TD2, HA1, ME4, HA3, HA2, HA5, HA4, MED, ANB, ME3, KLR, PZ2, ANA, PRM, PZ1, AJMP, ME2, TD1, TD0, TPR, VMA, AKR, MBP, PZEN, PGTW, PL21, PFUT, PWAR, PAL01, PJUD, PAL00, PTKDF, PWOR, PWP12, PSTH, POGW, PFRF, PG07, PSUS, PUST, J18, PWP10, PAL02, PAL03, PWP11, J19, PGRN, PM10, PDP14, PRTR, PMPS06, PBNG, PJ21, G09, PNPH, PM15, PAL06, G08, PDST, J20, PMBS, PMPS07, PEXO, PDOM, PONS, PRW2, PMPS11, PMPS, PM19, PWWK, PCEL, PAL04, PAL05, PMPS10, PDTK, PALP, F10, F04, PMOR, PAL99, PEMN, PCNS, PPLC, PRAV, PPP1, PI14, PXLN, PF20, PTSP, F05, F11, PSCG, PBOOK, F07, F13, PODY, PM12, P08, PSS1, P2HG, P09, PTOR, PDP13, F12, F06, PALA, PXTC, F02, F16, PHOU, PSOM, PI13, PCON, PDGM, PIDW, PMRD, PRNA, P9ED, PHEL, F17, F03, PURL, F15, F01, PWOS, PPC1, PBOK, PTMP, PS19, PS18, PF19, PGPT, PCHK, FNM, F14, PISD, PAKH, PDP15, PRIX, PS15, PPCY, OLGC, OVNT, PLGN, PS14, P03, PDTP, PM14, FS, PPLS, MPR, PKTK, PS16, PRWK, PS17, PBFZ, PSS2, PINV, G03, P8ED, PARL, P04, P10, PSDC, JGP, G99, WW, P11, P05, PDIS, PROE, PDP10, F08, P10E, PELP, PMH1, P07, P5DN, PGRU, SHC, PM11, P06, PUSG, PCMP, PULG, F09, PUDS, PARB, DRC94, PMPS09, PORI, J12, G06, PMMQ, G07, J13, PMPS08, PM20, PSOI, PJSE, G05, G11, PNAT, PSOK, PEVE, PRED, G10, G04, PSHM, PPRO, PAPC, PJJT, ARENA, PKLD, G00, J14, PLGM, P15A, PCSP, PWPN, PJAS, PWP21, PWP09, PDKA, PNEM, PPTK, J15, G01, PG08, PLRW, PMEI, PM13, PHJ, PGTC, J17, PRES, PWCQ, PJOU, PDP12, PAER, PAVR, PTHS, G02, J16, PSUM, PGPX, UGF, PSS3, MM2, MM3, MB1, FMB1, A25, 2XM, MMA, PLIST, CHR, EMA, IMA, TSR, UMA, PUMA, E02, DPA, ATH, MD1, GK1, GK2, CST, BRB, BTD, DKM, FVE, V17, V13, STA, MPS_RNA, V16, SLD, V12, CC1, MPS_GRN, DRB, FVR, SS3, SS1, MPS_AKH, FVL, V15, MPS_KLD, ZNE, PDS, SS2, PD3, SLU, V14, PD2, EXP, MPS_WAR, DDQ, DDE, GS1, DDS, DDU, DD1, DDL, DDF, DDP, DD2, DDR, DDH, DDT, DDK, DDG, DDC, DDM, DDJ, DDO, GVL, JVC, DDI, DVD, DDN, EVG, DDD, C18, C19, C21, C20, C13, CMA, C14, C15, KHC, ZNC, AFC, C17, C16, COM, CM1, CM2, PO2, S99, W16, W17, S00, PTK, CP3, POR, CP1, CP2, CMR, MH2, H1R, CNS, BBD, MH1, CN2, JMP, PCA, GNT, ARC, GN2, PC2, E01, HOP, PLG20, PLG21 -Banned:Adriana's Valor; Advantageous Proclamation; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Stroke; Echoing Boon; Emissary's Ploy; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Muzzio's Preparations; Natural Unity; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Chaos Orb; Falling Star; Shahrazad +Banned:Adriana's Valor; Advantageous Proclamation; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Stroke; Echoing Boon; Emissary's Ploy; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Muzzio's Preparations; Natural Unity; Power Play; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Summoner's Bond; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Chaos Orb; Falling Star; Shahrazad; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will diff --git a/forge-gui/res/quest/precons/Nature's Vengeance.dck b/forge-gui/res/quest/precons/Nature's Vengeance.dck index 4981322e223..670b63c11a2 100644 --- a/forge-gui/res/quest/precons/Nature's Vengeance.dck +++ b/forge-gui/res/quest/precons/Nature's Vengeance.dck @@ -29,7 +29,7 @@ Image=natures_vengeance.jpg 1 Cultivate|C18 1 Deathreap Ritual|C18 1 Decimate|C18 -#1 Emissary of Grudges|C18 +1 Emissary of Grudges|C18 1 Evolving Wilds|C18 1 Explore|C18 1 Explosive Vegetation|C18 diff --git a/forge-gui/src/main/java/forge/gui/card/CardPreferences.java b/forge-gui/src/main/java/forge/gui/card/CardPreferences.java index 664166cfb44..fa9c8df0442 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardPreferences.java +++ b/forge-gui/src/main/java/forge/gui/card/CardPreferences.java @@ -8,6 +8,8 @@ import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import forge.card.CardDb; +import forge.util.TextUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -113,8 +115,31 @@ public class CardPreferences { } if (preferredArt0.equals(preferredArt)) { return; } - if (FModel.getMagicDb().getCommonCards().setPreferredArt(cardName, preferredArt0)) { - preferredArt = preferredArt0; + try { + String infoCardName; + String infoSetCode; + int infoArtIndex; + String[] prefArtInfos =TextUtil.split(preferredArt0, CardDb.NameSetSeparator); + if (prefArtInfos.length == 2){ + // legacy format + infoCardName = this.cardName; + infoSetCode = prefArtInfos[0]; + infoArtIndex = Integer.parseInt(prefArtInfos[1]); + } else { + infoCardName = prefArtInfos[0]; + infoSetCode = prefArtInfos[1]; + infoArtIndex = Integer.parseInt(prefArtInfos[2]); + } + if (!this.cardName.equals(infoCardName)) // extra sanity check + return; + if (FModel.getMagicDb().getCommonCards().setPreferredArt(cardName, infoSetCode, infoArtIndex)) + preferredArt = preferredArt0; + } catch (NumberFormatException ex){ + System.err.println("ERROR with Existing Preferred Card Entry: " + preferredArt0); } } + + public void setPreferredArt(String setCode, int artIndex) { + this.setPreferredArt(setCode + CardDb.NameSetSeparator + artIndex); + } } \ No newline at end of file