From 69a46da4c1bd57c3060045a5b31481ac866e2a22 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:45:40 -0400 Subject: [PATCH 01/10] ApiType add DraftEffect --- forge-game/src/main/java/forge/game/ability/ApiType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index 9016ad5f03b..1d1e13a525b 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -71,6 +71,7 @@ public enum ApiType { DigUntil (DigUntilEffect.class), Discard (DiscardEffect.class), DrainMana (DrainManaEffect.class), + Draft (DraftEffect.class), Draw (DrawEffect.class), EachDamage (DamageEachEffect.class), Effect (EffectEffect.class), From e61e251026b2c04917c74394160802a89241d044 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:46:06 -0400 Subject: [PATCH 02/10] ChooseCardNameEffect.resolve remove Draft support --- .../game/ability/effects/ChooseCardNameEffect.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index c55979fe7aa..a435520bf40 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -54,7 +54,6 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { } boolean randomChoice = sa.hasParam("AtRandom"); - boolean draft = sa.hasParam("Draft"); //for digital "draft from spellbook" mechanic boolean chooseFromDefined = sa.hasParam("ChooseFromDefinedCards"); boolean chooseFromList = sa.hasParam("ChooseFromList"); boolean chooseFromOneTimeList = sa.hasParam("ChooseFromOneTimeList"); @@ -62,8 +61,6 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { if (!randomChoice) { if (sa.hasParam("SelectPrompt")) { message = sa.getParam("SelectPrompt"); - } else if (draft) { - message = Localizer.getInstance().getMessage("lblChooseCardDraft"); } else if (null == validDesc) { message = Localizer.getInstance().getMessage("lblChooseACardName"); } else { @@ -108,12 +105,6 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { chosen = p.getController().chooseCardName(sa, faces, message); } else if (chooseFromList) { String [] names = sa.getParam("ChooseFromList").split(","); - if (sa.hasParam("Draft")) { - List options = Arrays.asList(names); - Collections.shuffle(options); - List draftChoices = options.subList(0,3); - names = draftChoices.toArray(new String[0]); - } List faces = new ArrayList<>(); for (String name : names) { // Cardnames that include "," must use ";" instead in ChooseFromList$ (i.e. Tovolar; Dire Overlord) @@ -169,9 +160,6 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { host.setNamedCard(chosen); if (!randomChoice) { p.setNamedCard(chosen); - if (!draft) { //drafting is secret - p.getGame().getAction().notifyOfValue(sa, host, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p); - } } if (sa.hasParam("NoteFor")) { p.addNoteForName(sa.getParam("NoteFor"), "Name:" + chosen); From 2b67c8c49768bbabb5bf2c150f9ce78bc3237d10 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:46:15 -0400 Subject: [PATCH 03/10] DraftEffect.java --- .../game/ability/effects/DraftEffect.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java new file mode 100644 index 00000000000..fce1683f45e --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -0,0 +1,83 @@ +package forge.game.ability.effects; + +import forge.StaticData; +import forge.card.ICardFace; +import forge.game.Game; +import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; +import forge.util.Localizer; + +import java.util.*; + + public class DraftEffect extends SpellAbilityEffect { + @Override + protected String getStackDescription(SpellAbility sa) { + final Card source = sa.getHostCard(); + final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); + + final StringBuilder sb = new StringBuilder(); + + sb.append(player).append(" drafts a card from ").append(source.getName()).append("'s spellbook"); + if (zone.equals("Hand")) { + sb.append("."); + } else if (zone.equals("Battlefield")) { + sb.append(" and puts it onto the battlefield."); + } else if (zone.equals("Exile")) { + sb.append(", then exiles it."); + } + + return sb.toString(); + } + + @Override + public void resolve(SpellAbility sa) { + Map moveParams = AbilityKey.newMap(); + moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); + moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); + final Card source = sa.getHostCard(); + final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); + final Game game = player.getGame(); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); + List spellbook = Arrays.asList(sa.getParam("Spellbook").split(",")); + String [] names = sa.getParam("Spellbook").split(","); + final int numToDraft = AbilityUtils.calculateAmount(source, + sa.getParamOrDefault("DraftNum", "1"), sa); + CardCollection drafted = new CardCollection(); + + for (int i = 0; i < numToDraft; i++) { + String chosen = ""; + Collections.shuffle(spellbook); + List faces = new ArrayList<>(); + for (String name : spellbook.subList(0, 3)) { + // Cardnames that include "," must use ";" instead in Spellbook$ (i.e. Tovolar; Dire Overlord) + name = name.replace(";", ","); + faces.add(StaticData.instance().getCommonCards().getFaceByName(name)); + } + chosen = player.getController().chooseCardName(sa, faces, + Localizer.getInstance().getMessage("lblChooseCardDraft")); + if (!chosen.equals("")) { + Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(chosen), player); + card.setTokenCard(true); + game.getAction().moveTo(ZoneType.None, card, sa, moveParams); + drafted.add(card); + } + } + + for (final Card c : drafted) { + game.getAction().moveTo(zone, c, sa, moveParams); + if (sa.hasParam("RememberDrafted")) { + source.addRemembered(c); + } + } + if (zone.equals(ZoneType.Library)) { + player.shuffle(sa); + } + } + } \ No newline at end of file From 902706afd4f0c58a7144133fb30d8df51b4f8b77 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:46:42 -0400 Subject: [PATCH 04/10] SpellApiToAi.apiToClass handle DraftEffect --- forge-ai/src/main/java/forge/ai/SpellApiToAi.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 28d0ced5046..18742c0de7e 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -71,6 +71,7 @@ public enum SpellApiToAi { .put(ApiType.DigMultiple, DigMultipleAi.class) .put(ApiType.DigUntil, DigUntilAi.class) .put(ApiType.Discard, DiscardAi.class) + .put(ApiType.Draft, ChooseCardNameAi.class) .put(ApiType.DrainMana, DrainManaAi.class) .put(ApiType.Draw, DrawAi.class) .put(ApiType.EachDamage, DamageEachAi.class) From 156b988c0dddc3a5d15ace135a0b76abeab49cb6 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:47:07 -0400 Subject: [PATCH 05/10] update existing cards --- forge-gui/res/cardsfolder/a/arms_scavenger.txt | 6 +++--- forge-gui/res/cardsfolder/b/boseiju_pathlighter.txt | 4 +--- forge-gui/res/cardsfolder/c/cursebound_witch.txt | 4 +--- forge-gui/res/cardsfolder/e/experimental_pilot.txt | 4 +--- forge-gui/res/cardsfolder/f/faithful_disciple.txt | 4 +--- forge-gui/res/cardsfolder/g/garruk_wrath_of_the_wilds.txt | 4 +--- forge-gui/res/cardsfolder/h/hinterland_chef.txt | 4 +--- forge-gui/res/cardsfolder/i/imperial_blademaster.txt | 4 +--- forge-gui/res/cardsfolder/i/ishkanah_broodmother.txt | 4 +--- forge-gui/res/cardsfolder/k/key_to_the_archive.txt | 6 ++---- forge-gui/res/cardsfolder/o/ominous_traveler.txt | 4 +--- forge-gui/res/cardsfolder/s/slayers_bounty.txt | 6 ++---- forge-gui/res/cardsfolder/t/tibalt_wicked_tormentor.txt | 7 +++---- forge-gui/res/cardsfolder/t/tireless_angler.txt | 4 +--- forge-gui/res/cardsfolder/upcoming/bind_to_secrecy.txt | 8 +++----- 15 files changed, 23 insertions(+), 50 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/arms_scavenger.txt b/forge-gui/res/cardsfolder/a/arms_scavenger.txt index 2058ae8b2e8..51b74afdb3c 100644 --- a/forge-gui/res/cardsfolder/a/arms_scavenger.txt +++ b/forge-gui/res/cardsfolder/a/arms_scavenger.txt @@ -3,10 +3,10 @@ ManaCost:1 R Types:Creature Human Warrior PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraft | TriggerDescription$ At the beginning of your upkeep, draft a card from CARDNAME's spellbook, then exile it. Until end of turn, you may play that card. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Boots of Speed,Cliffhaven Kitesail,Colossus Hammer,Dueling Rapier,Spare Dagger,Tormentor's Helm,Goldvein Pick,Jousting Lance,Mask of Immolation,Mirror Shield,Relic Axe,Rogue's Gloves,Scavenged Blade,Shield of the Realm,Ceremonial Knife | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Exile | RememberMade$ True | SubAbility$ DBEffect +SVar:TrigDraft:DB$ Draft | Spellbook$ Boots of Speed,Cliffhaven Kitesail,Colossus Hammer,Dueling Rapier,Spare Dagger,Tormentor's Helm,Goldvein Pick,Jousting Lance,Mask of Immolation,Mirror Shield,Relic Axe,Rogue's Gloves,Scavenged Blade,Shield of the Realm,Ceremonial Knife | Zone$ Exile | RememberDrafted$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | ExileOnMoved$ Exile | SubAbility$ DBCleanup SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Until the end of turn, you may play that card. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearNamedCard$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | Condition$ PlayerTurn | Description$ Equip abilities you activate cost {1} less to activate. +DeckHints:Type$Equipment Oracle:At the beginning of your upkeep, draft a card from Arms Scavenger's spellbook, then exile it. Until end of turn, you may play that card.\nEquip abilities you activate cost {1} less to activate. diff --git a/forge-gui/res/cardsfolder/b/boseiju_pathlighter.txt b/forge-gui/res/cardsfolder/b/boseiju_pathlighter.txt index 6d9cad18a75..1ed21c37561 100644 --- a/forge-gui/res/cardsfolder/b/boseiju_pathlighter.txt +++ b/forge-gui/res/cardsfolder/b/boseiju_pathlighter.txt @@ -3,7 +3,5 @@ ManaCost:2 G Types:Creature Human Rogue PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME enters the battlefield, draft a card from CARDNAME's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Emergence Zone,Radiant Fountain,Scavenger Grounds,Boseiju; Who Endures,Gingerbread Cabin,Khalni Garden,Memorial to Unity,Thriving Grove,Hall of Oracles,Secluded Courtyard,Treasure Vault,Mobilized District,Bonders' Enclave,Roadside Reliquary,Field of Ruin | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | Spellbook$ Emergence Zone,Radiant Fountain,Scavenger Grounds,Boseiju; Who Endures,Gingerbread Cabin,Khalni Garden,Memorial to Unity,Thriving Grove,Hall of Oracles,Secluded Courtyard,Treasure Vault,Mobilized District,Bonders' Enclave,Roadside Reliquary,Field of Ruin Oracle:When Boseiju Pathlighter enters the battlefield, draft a card from Boseiju Pathlighter's spellbook. diff --git a/forge-gui/res/cardsfolder/c/cursebound_witch.txt b/forge-gui/res/cardsfolder/c/cursebound_witch.txt index b29d312128f..b87cc9b37ea 100644 --- a/forge-gui/res/cardsfolder/c/cursebound_witch.txt +++ b/forge-gui/res/cardsfolder/c/cursebound_witch.txt @@ -3,8 +3,6 @@ ManaCost:B Types:Creature Human Warlock PT:1/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME dies, draft a card from CARDNAME's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Witch's Cauldron,Witch's Vengeance,Witch's Oven,Witch's Cottage,Witch's Familiar,Curse of Leeches,Cauldron Familiar,Black Cat,Sorcerer's Broom,Bloodhunter Bat,Unwilling Ingredient,Expanded Anatomy,Cruel Reality,Torment of Scarabs,Trespasser's Curse | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | Spellbook$ Witch's Cauldron,Witch's Vengeance,Witch's Oven,Witch's Cottage,Witch's Familiar,Curse of Leeches,Cauldron Familiar,Black Cat,Sorcerer's Broom,Bloodhunter Bat,Unwilling Ingredient,Expanded Anatomy,Cruel Reality,Torment of Scarabs,Trespasser's Curse SVar:SacMe:2 Oracle:When Cursebound Witch dies, draft a card from Cursebound Witch's spellbook. diff --git a/forge-gui/res/cardsfolder/e/experimental_pilot.txt b/forge-gui/res/cardsfolder/e/experimental_pilot.txt index 77395ecff08..802a401aec1 100644 --- a/forge-gui/res/cardsfolder/e/experimental_pilot.txt +++ b/forge-gui/res/cardsfolder/e/experimental_pilot.txt @@ -3,9 +3,7 @@ ManaCost:U Types:Creature Human Pilot PT:1/2 K:Ward:2 -A:AB$ NameCard | Cost$ U Discard<2/Card> | Draft$ True | Defined$ You | ChooseFromList$ Cultivator's Caravan,Bomat Bazaar Barge,Raiders' Karve,Demolition Stomper,Futurist Sentinel,Mechtitan Core,Reckoner Bankbuster,High-Speed Hoverbike,Mindlink Mech,Silent Submersible,Mobile Garrison,Untethered Express,Ovalchase Dragster,Daredevil Dragster,Thundering Chariot | SubAbility$ DBMakeCard | SpellDescription$ Draft a card from CARDNAME's spellbook. -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +A:AB$ Draft | Cost$ U Discard<2/Card> | Spellbook$ Cultivator's Caravan,Bomat Bazaar Barge,Raiders' Karve,Demolition Stomper,Futurist Sentinel,Mechtitan Core,Reckoner Bankbuster,High-Speed Hoverbike,Mindlink Mech,Silent Submersible,Mobile Garrison,Untethered Express,Ovalchase Dragster,Daredevil Dragster,Thundering Chariot | SpellDescription$ Draft a card from CARDNAME's spellbook. S:Mode$ CrewValue | ValidCard$ Card.Self | Value$ 2 | Description$ CARDNAME crews Vehicles as though its power were 2 greater. DeckHints:Type$Vehicle Oracle:Ward {2}\n{U}, Discard two cards: Draft a card from Experimental Pilot's spellbook.\nExperimental Pilot crews Vehicles as though its power were 2 greater. diff --git a/forge-gui/res/cardsfolder/f/faithful_disciple.txt b/forge-gui/res/cardsfolder/f/faithful_disciple.txt index e0168859b52..d38ce905b3a 100644 --- a/forge-gui/res/cardsfolder/f/faithful_disciple.txt +++ b/forge-gui/res/cardsfolder/f/faithful_disciple.txt @@ -4,8 +4,6 @@ Types:Creature Human Cleric PT:2/2 K:Vigilance T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME dies, draft a card from CARDNAME's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Anointed Procession,Cathars' Crusade,Authority of the Consuls,Sigil of the Empty Throne,All That Glitters,Banishing Light,Divine Visitation,Duelist's Heritage,Glorious Anthem,Gauntlets of Light,Teleportation Circle,Angelic Gift,Spectral Steel,Cleric Class,Angelic Exaltation | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | Spellbook$ Anointed Procession,Cathars' Crusade,Authority of the Consuls,Sigil of the Empty Throne,All That Glitters,Banishing Light,Divine Visitation,Duelist's Heritage,Glorious Anthem,Gauntlets of Light,Teleportation Circle,Angelic Gift,Spectral Steel,Cleric Class,Angelic Exaltation SVar:SacMe:2 Oracle:Vigilance\nWhen Faithful Disciple dies, draft a card from Faithful Disciple's spellbook. diff --git a/forge-gui/res/cardsfolder/g/garruk_wrath_of_the_wilds.txt b/forge-gui/res/cardsfolder/g/garruk_wrath_of_the_wilds.txt index cce1747690e..eec1d3c1c43 100644 --- a/forge-gui/res/cardsfolder/g/garruk_wrath_of_the_wilds.txt +++ b/forge-gui/res/cardsfolder/g/garruk_wrath_of_the_wilds.txt @@ -7,8 +7,6 @@ SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility,PerpetualP1P1 | Dur SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.ChosenCard | AddStaticAbility$ ReduceCost | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast." SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.ChosenCard | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Secondary$ True SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. -A:AB$ NameCard | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Draft$ True | Defined$ You | ChooseFromList$ Mosscoat Goriak,Sylvan Brushstrider,Murasa Rootgrazer,Dire Wolf Prowler,Ferocious Pup,Pestilent Wolf,Garruk's Uprising,Dawntreader Elk,Nessian Hornbeetle,Territorial Scythecat,Trufflesnout,Wary Okapi,Scurrid Colony,Barkhide Troll,Underdark Basilisk | SubAbility$ DBMakeCard | StackDescription$ SpellDescription | SpellDescription$ Draft a card from CARDNAME's spellbook and put it onto the battlefield. -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Battlefield | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | ClearChosenCard$ True +A:AB$ Draft | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Spellbook$ Mosscoat Goriak,Sylvan Brushstrider,Murasa Rootgrazer,Dire Wolf Prowler,Ferocious Pup,Pestilent Wolf,Garruk's Uprising,Dawntreader Elk,Nessian Hornbeetle,Territorial Scythecat,Trufflesnout,Wary Okapi,Scurrid Colony,Barkhide Troll,Underdark Basilisk | Zone$ Battlefield | SpellDescription$ Draft a card from CARDNAME's spellbook and put it onto the battlefield. A:AB$ PumpAll | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Until end of turn, creatures you control get +3/+3 and gain trample. Oracle:[+1]: Choose a creature card in your hand. It perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast."\n[-1]: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield.\n[-6]: Until end of turn, creatures you control get +3/+3 and gain trample. diff --git a/forge-gui/res/cardsfolder/h/hinterland_chef.txt b/forge-gui/res/cardsfolder/h/hinterland_chef.txt index 3318cd8febf..6636e361df0 100644 --- a/forge-gui/res/cardsfolder/h/hinterland_chef.txt +++ b/forge-gui/res/cardsfolder/h/hinterland_chef.txt @@ -3,9 +3,7 @@ ManaCost:2 G Types:Creature Human Scout PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME enters the battlefield, draft a card from CARDNAME's spellbook. It perpetually becomes a Food artifact in addition to its other types and perpetually gains "{2}, {T}, Sacrifice this creature: You gain 3 life." -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Almighty Brushwagg,Frilled Sandwalla,Moss Viper,Brushstrider,Highland Game,Ironshell Beetle,Lotus Cobra,Kazandu Nectarpot,Gilded Goose,Nessian Hornbeetle,Scurrid Colony,Territorial Boar,Deathbonnet Sprout,Spore Crawler,Moldgraf Millipede | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | RememberMade$ True | SubAbility$ DBClearName -SVar:DBClearName:DB$ Cleanup | ClearNamedCard$ True | SubAbility$ DBEffect +SVar:TrigDraft:DB$ Draft | Spellbook$ Almighty Brushwagg,Frilled Sandwalla,Moss Viper,Brushstrider,Highland Game,Ironshell Beetle,Lotus Cobra,Kazandu Nectarpot,Gilded Goose,Nessian Hornbeetle,Scurrid Colony,Territorial Boar,Deathbonnet Sprout,Spore Crawler,Moldgraf Millipede | RememberDrafted$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Hinterland Chef's Perpetual Effect | SubAbility$ DBCleanup SVar:PerpetualAbility:Mode$ Continuous | AddAbility$ FoodSac | AddType$ Food & Artifact | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually becomes a Food artifact in addition to its other types and perpetually gains "{2}, {T}, Sacrifice this creature: You gain 3 life." SVar:FoodSac:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME/this creature> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. diff --git a/forge-gui/res/cardsfolder/i/imperial_blademaster.txt b/forge-gui/res/cardsfolder/i/imperial_blademaster.txt index cf26d2bad85..b5568763781 100644 --- a/forge-gui/res/cardsfolder/i/imperial_blademaster.txt +++ b/forge-gui/res/cardsfolder/i/imperial_blademaster.txt @@ -4,8 +4,6 @@ Types:Creature Human Samurai PT:2/2 K:Double Strike T:Mode$ Attacks | ValidCard$ Samurai.YouCtrl,Warrior.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigDraft | TriggerDescription$ Whenever a Samurai or Warrior you control attacks alone, draft a card from Imperial Blademaster's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Eiganjo Exemplar,Imperial Subduer,Ancestral Katana,Selfless Samurai,Norika Yamazaki; the Poet,Akki Ronin,Peerless Samurai,Heiko Yamazaki; the General,Asari Captain,Eiganjo Uprising,Eater of Virtue,Sunblade Samurai,Reinforced Ronin,Adamant Will,Tempered in Solitude | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | Spellbook$ Eiganjo Exemplar,Imperial Subduer,Ancestral Katana,Selfless Samurai,Norika Yamazaki; the Poet,Akki Ronin,Peerless Samurai,Heiko Yamazaki; the General,Asari Captain,Eiganjo Uprising,Eater of Virtue,Sunblade Samurai,Reinforced Ronin,Adamant Will,Tempered in Solitude DeckHints:Type$Samurai|Warrior Oracle:Double strike\nWhenever a Samurai or Warrior you control attacks alone, draft a card from Imperial Blademaster's spellbook. diff --git a/forge-gui/res/cardsfolder/i/ishkanah_broodmother.txt b/forge-gui/res/cardsfolder/i/ishkanah_broodmother.txt index ec9d3b3e41d..2f1d6d18a79 100644 --- a/forge-gui/res/cardsfolder/i/ishkanah_broodmother.txt +++ b/forge-gui/res/cardsfolder/i/ishkanah_broodmother.txt @@ -4,8 +4,6 @@ Types:Legendary Creature Spider PT:3/5 K:Reach S:Mode$ Continuous | Affected$ Creature.Spider+Other+YouCtrl | AddPower$ 1 | AddToughness$ 2 | Description$ Other Spiders you control get +1/+2. -A:AB$ NameCard | Cost$ 1 BG ExileFromGrave<2/card> | Draft$ True | Defined$ You | ChooseFromList$ Twin-Silk Spider,Drider,Brood Weaver,Glowstone Recluse,Gnottvold Recluse,Hatchery Spider,Mammoth Spider,Netcaster Spider,Sentinel Spider,Snarespinner,Sporecap Spider,Spidery Grasp,Spider Spawning,Prey Upon,Arachnoform | SubAbility$ DBMakeCard | SpellDescription$ Draft a card from CARDNAME's spellbook. -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +A:AB$ Draft | Cost$ 1 BG ExileFromGrave<2/Card> | Spellbook$ Twin-Silk Spider,Drider,Brood Weaver,Glowstone Recluse,Gnottvold Recluse,Hatchery Spider,Mammoth Spider,Netcaster Spider,Sentinel Spider,Snarespinner,Sporecap Spider,Spidery Grasp,Spider Spawning,Prey Upon,Arachnoform | SpellDescription$ Draft a card from CARDNAME's spellbook. DeckHints:Type$Spider Oracle:Reach\nOther Spiders you control get +1/+2.\n{1}{B/G}, Exile two cards from your graveyard: Draft a card from Ishkanah, Broodmother's spellbook. diff --git a/forge-gui/res/cardsfolder/k/key_to_the_archive.txt b/forge-gui/res/cardsfolder/k/key_to_the_archive.txt index 6ac413f2aae..97d95f596c8 100644 --- a/forge-gui/res/cardsfolder/k/key_to_the_archive.txt +++ b/forge-gui/res/cardsfolder/k/key_to_the_archive.txt @@ -3,9 +3,7 @@ ManaCost:4 Types:Artifact K:CARDNAME enters the battlefield tapped. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME enters the battlefield, draft a card from CARDNAME's spellbook, then discard a card. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Approach of the Second Sun,Day of Judgment,Time Warp,Counterspell,Demonic Tutor,Doom Blade,Lightning Bolt,Claim the Firstborn,Krosan Grip,Regrowth,Despark,Electrolyze,Growth Spiral,Lightning Helix,Putrefy | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +SVar:TrigDraft:DB$ Draft | Spellbook$ Approach of the Second Sun,Day of Judgment,Time Warp,Counterspell,Demonic Tutor,Doom Blade,Lightning Bolt,Claim the Firstborn,Krosan Grip,Regrowth,Despark,Electrolyze,Growth Spiral,Lightning Helix,Putrefy | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose A:AB$ Mana | Cost$ T | Produced$ Combo Any | Amount$ 2 | SpellDescription$ Add two mana in any combination of colors. Oracle:Key to the Archive enters the battlefield tapped.\nWhen Key to the Archive enters the battlefield, draft a card from Key to the Archive's spellbook, then discard a card.\n{T}: Add two mana in any combination of colors. diff --git a/forge-gui/res/cardsfolder/o/ominous_traveler.txt b/forge-gui/res/cardsfolder/o/ominous_traveler.txt index 882c60ab9f4..0d25c6e2684 100644 --- a/forge-gui/res/cardsfolder/o/ominous_traveler.txt +++ b/forge-gui/res/cardsfolder/o/ominous_traveler.txt @@ -3,9 +3,7 @@ ManaCost:2 Types:Creature Human PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraft | TriggerDescription$ When CARDNAME enters the battlefield, draft a card from CARDNAME's spellbook. That card perpetually gains "You may spend mana as though it were mana of any color to cast this spell" and "When you cast this spell, return a card named Ominous Traveler you control to its owner's hand." -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Dominating Vampire,Vampire Socialite,Stromkirk Bloodthief,Falkenrath Pit Fighter,Wolfkin Outcast,Howlpack Piper,Tovolar; Dire Overlord,Patrician Geist,Shipwreck Sifters,Steelclad Spirit,Heron-Blessed Geist,Archghoul of Thraben,Champion of the Perished,Headless Rider,Bladestitched Skaab | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | RememberMade$ True | SubAbility$ DBClearName -SVar:DBClearName:DB$ Cleanup | ClearNamedCard$ True | SubAbility$ DBEffect +SVar:TrigDraft:DB$ Draft | Spellbook$ Dominating Vampire,Vampire Socialite,Stromkirk Bloodthief,Falkenrath Pit Fighter,Wolfkin Outcast,Howlpack Piper,Tovolar; Dire Overlord,Patrician Geist,Shipwreck Sifters,Steelclad Spirit,Heron-Blessed Geist,Archghoul of Thraben,Champion of the Perished,Headless Rider,Bladestitched Skaab | RememberDrafted$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | Triggers$ Update | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Ominous Traveler's Perpetual Effect | SubAbility$ DBCleanup SVar:PerpetualAbility:Mode$ Continuous | AddStaticAbility$ SpendAnyMana | AddTrigger$ CastTrigger | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually gains "You may spend mana as though it were mana of any color to cast this spell" and "When you cast this spell, return a card named Ominous Traveler you control to its owner's hand." SVar:SpendAnyMana:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AffectedZone$ Stack | AddHiddenKeyword$ May spend mana as though it were mana of any color to cast CARDNAME | Description$ You may spend mana as though it were mana of any color to cast this spell. diff --git a/forge-gui/res/cardsfolder/s/slayers_bounty.txt b/forge-gui/res/cardsfolder/s/slayers_bounty.txt index b83857f730b..de071ea0892 100644 --- a/forge-gui/res/cardsfolder/s/slayers_bounty.txt +++ b/forge-gui/res/cardsfolder/s/slayers_bounty.txt @@ -3,10 +3,8 @@ ManaCost:W Types:Legendary Artifact Clue T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at the creature cards in target opponent's hand. SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True | RevealType$ Creature -T:Mode$ Sacrificed | ValidCard$ Clue.YouCtrl | Execute$ TrigDraft | TriggerZones$ Battlefield | TriggerDescription$ Whenever you CARDNAME or another Clue, draft a card from CARDNAME's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Bounty Agent,Outflank,Bound in Gold,Bring to Trial,Glass Casket,Reprobation,Collar the Culprit,Compulsory Rest,Expel,Fairgrounds Warden,Iron Verdict,Luminous Bonds,Raise the Alarm,Seal Away,Summary Judgment | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +T:Mode$ Sacrificed | ValidCard$ Card.Self,Clue.Other+YouCtrl | Execute$ TrigDraft | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice CARDNAME or another Clue, draft a card from CARDNAME's spellbook. +SVar:TrigDraft:DB$ Draft | Spellbook$ Bounty Agent,Outflank,Bound in Gold,Bring to Trial,Glass Casket,Reprobation,Collar the Culprit,Compulsory Rest,Expel,Fairgrounds Warden,Iron Verdict,Luminous Bonds,Raise the Alarm,Seal Away,Summary Judgment A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. DeckHas:Ability$Sacrifice DeckHints:Ability$Investigate & Type$Clue diff --git a/forge-gui/res/cardsfolder/t/tibalt_wicked_tormentor.txt b/forge-gui/res/cardsfolder/t/tibalt_wicked_tormentor.txt index e01e9e20c4a..91414c41a27 100644 --- a/forge-gui/res/cardsfolder/t/tibalt_wicked_tormentor.txt +++ b/forge-gui/res/cardsfolder/t/tibalt_wicked_tormentor.txt @@ -3,14 +3,13 @@ ManaCost:3 R R Types:Legendary Planeswalker Tibalt Loyalty:3 A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | SubAbility$ DBDraft | SpellDescription$ Add {R}{R}. -SVar:DBDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Chained Brute,Charmbreaker Devils,Festival Crasher,Forge Devil,Frenzied Devils,Havoc Jester,Hellrider,Hobblefiend,Pitchburn Devils,Sin Prodder,Spiteful Prankster,Tibalt's Rager,Torch Fiend,Brimstone Vandal,Devil's Play | SubAbility$ DBMakeCard | StackDescription$ SpellDescription | SpellDescription$ Draft a card from CARDNAME's spellbook, then exile it. -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Exile | RememberMade$ True | SubAbility$ DBEffect +SVar:DBDraft:DB$ Draft | Spellbook$ Chained Brute,Charmbreaker Devils,Festival Crasher,Forge Devil,Frenzied Devils,Havoc Jester,Hellrider,Hobblefiend,Pitchburn Devils,Sin Prodder,Spiteful Prankster,Tibalt's Rager,Torch Fiend,Brimstone Vandal,Devil's Play | Zone$ Exile | RememberDrafted$ True | SubAbility$ DBEffect | SpellDescription$ Draft a card from CARDNAME's spellbook, then exile it. SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | ExileOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ Until end of turn, you may cast that card. SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Until the end of turn, you may cast that card. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearNamedCard$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ DealDamage | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 4 | UnlessCost$ DamageYou<4> | UnlessPayer$ TargetedController | UnlessResolveSubs$ WhenPaid | SubAbility$ DBDiscardDraw | StackDescription$ CARDNAME deals 4 damage to {c:Targeted} unless {p:TargetedController} has NICKNAME deal 4 damage to them. | SpellDescription$ CARDNAME deals 4 damage to target creature or planeswalker unless its controller has NICKNAME deal 4 damage to them. SVar:DBDiscardDraw:DB$ Draw | NumCards$ 1 | UnlessCost$ Discard<1/Card> | UnlessPayer$ You | UnlessSwitched$ True | OrString$ Draw a card. | StackDescription$ SpellDescription | SpellDescription$ If they do, you may discard a card. If you do, draw card. A:AB$ Token | Cost$ SubCounter | Planeswalker$ True | TokenAmount$ X | TokenScript$ r_1_1_devil_burn | SpellDescription$ Create X 1/1 red Devil creature tokens with "When this creature dies, it deals 1 damage to any target." SVar:X:Count$xPaid -DeckHas:Ability$Discard|Token +DeckHas:Ability$Discard|Token & Type$Devil Oracle:[+1]: Add {R}{R}. Draft a card from Tibalt, Wicked Tormentor's spellbook, then exile it. Until end of turn, you may cast that card.\n[+1]: Tibalt, Wicked Tormentor deals 4 damage to target creature or planeswalker unless its controller has Tibalt deal 4 damage to them. If they do, you may discard a card. If you do, draw card.\n[-X]: Create X 1/1 red Devil creature tokens with "When this creature dies, it deals 1 damage to any target." diff --git a/forge-gui/res/cardsfolder/t/tireless_angler.txt b/forge-gui/res/cardsfolder/t/tireless_angler.txt index ed35ecb56d8..7efaab8884a 100644 --- a/forge-gui/res/cardsfolder/t/tireless_angler.txt +++ b/forge-gui/res/cardsfolder/t/tireless_angler.txt @@ -3,8 +3,6 @@ ManaCost:2 U Types:Creature Human Rogue PT:2/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Island.YouCtrl,Swamp.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraft | TriggerDescription$ Whenever an Island or Swamp enters the battlefield under your control, draft a card from CARDNAME's spellbook. -SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Fleet Swallower,Moat Piranhas,Mystic Skyfish,Nadir Kraken,Pouncing Shoreshark,Sea-Dasher Octopus,Spined Megalodon,Stinging Lionfish,Voracious Greatshark,Archipelagore,Serpent of Yawning Depths,Wormhole Serpent,Sigiled Starfish,Riptide Turtle,Ruin Crab | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | Spellbook$ Fleet Swallower,Moat Piranhas,Mystic Skyfish,Nadir Kraken,Pouncing Shoreshark,Sea-Dasher Octopus,Spined Megalodon,Stinging Lionfish,Voracious Greatshark,Archipelagore,Serpent of Yawning Depths,Wormhole Serpent,Sigiled Starfish,Riptide Turtle,Ruin Crab SVar:BuffedBy:Island Oracle:Whenever an Island or Swamp enters the battlefield under your control, draft a card from Tireless Angler's spellbook. diff --git a/forge-gui/res/cardsfolder/upcoming/bind_to_secrecy.txt b/forge-gui/res/cardsfolder/upcoming/bind_to_secrecy.txt index ae8ebff1463..006c5fa2d22 100644 --- a/forge-gui/res/cardsfolder/upcoming/bind_to_secrecy.txt +++ b/forge-gui/res/cardsfolder/upcoming/bind_to_secrecy.txt @@ -4,14 +4,12 @@ Types:Instant A:SP$ Charm | Choices$ CounterNonCreature,DBConjure | CharmNum$ 1 SVar:CounterNonCreature:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target noncreature spell | ValidTgts$ Card.nonCreature | SubAbility$ TrigDraft | SpellDescription$ Counter target noncreature spell. SVar:DBConjure:DB$ MakeCard | TgtPrompt$ Select target creature card in an opponent's graveyard | ValidTgts$ Creature.OppOwn+inZoneGraveyard | TgtZone$ Graveyard | DefinedName$ Targeted | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect | SpellDescription$ Conjure a duplicate of target creature card in an opponent's graveyard into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Bind to Secrecy's Perpetual Effect | SubAbility$ DBCleanup | SubAbility$ TrigDraft | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Bind to Secrecy's Perpetual Effect | SubAbility$ DBCleanup | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:PerpetualAbility:Mode$ Continuous | AddStaticAbility$ SpendAnyMana | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:SpendAnyMana:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AffectedZone$ Stack | AddHiddenKeyword$ May spend mana as though it were mana of any color to cast CARDNAME | Description$ You may spend mana as though it were mana of any color to cast this spell. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ TrigDraft SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate SVar:DBUpdate:DB$ UpdateRemember -SVar:TrigDraft:DB$ NameCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GE5 | Draft$ True | Defined$ You | ChooseFromList$ Corpse Churn,Corpse Hauler,Courier Bat,Durable Coilbug,Fear of Death,Gorging Vulture,Locked in the Cemetery,Naga Oracle,Necrotic Wound,Obsessive Stitcher,Reassembling Skeleton,Strategic Planning,Unmarked Grave,Wonder | SubAbility$ DBMakeCard | SpellDescription$ If there are five or more mana values among cards in your graveyard, draft a card from CARDNAME's spellbook. -SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanupName -SVar:DBCleanupName:DB$ Cleanup | ClearNamedCard$ True +SVar:TrigDraft:DB$ Draft | ConditionCheckSVar$ X | ConditionSVarCompare$ GE5 | Spellbook$ Corpse Churn,Corpse Hauler,Courier Bat,Durable Coilbug,Fear of Death,Gorging Vulture,Locked in the Cemetery,Naga Oracle,Necrotic Wound,Obsessive Stitcher,Reassembling Skeleton,Strategic Planning,Unmarked Grave,Wonder | SpellDescription$ If there are five or more mana values among cards in your graveyard, draft a card from CARDNAME's spellbook. SVar:X:Count$ValidGraveyard Card.YouOwn$DifferentCMC Oracle:Choose one —\n• Counter target noncreature spell.\n• Conjure a duplicate of target creature card in an opponent's graveyard into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell."\nIf there are five or more mana values among cards in your graveyard, draft a card from Bind to Secrecy's spellbook. From 92f3298366baa78b2fece875da0fc16bef48f73a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:50:26 -0400 Subject: [PATCH 06/10] DraftEffect newline at file end --- .../src/main/java/forge/game/ability/effects/DraftEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java index fce1683f45e..653a8f85b86 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -80,4 +80,4 @@ import java.util.*; player.shuffle(sa); } } - } \ No newline at end of file + } From bfd421bf988ec7f7d3f298600bec528da7df36c2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 28 Jun 2022 12:03:27 -0400 Subject: [PATCH 07/10] MakeCardEffect.resolve add ChangesZoneAll trigger --- .../main/java/forge/game/ability/effects/MakeCardEffect.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java index 1d4a92e7d7e..5f746118833 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -9,6 +9,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; @@ -60,8 +61,10 @@ public class MakeCardEffect extends SpellAbilityEffect { amount--; } + final CardZoneTable triggerList = new CardZoneTable(); for (final Card c : cards) { game.getAction().moveTo(zone, c, sa, moveParams); + triggerList.put(ZoneType.None, c.getZone().getZoneType(), c); if (sa.hasParam("RememberMade")) { sa.getHostCard().addRemembered(c); } @@ -69,6 +72,7 @@ public class MakeCardEffect extends SpellAbilityEffect { sa.getHostCard().addImprintedCard(c); } } + triggerList.triggerChangesZoneAll(game, sa); if (zone.equals(ZoneType.Library)) { player.shuffle(sa); } From 4613b76bfa9821688b694e5ba3f92b897553f978 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 28 Jun 2022 12:03:45 -0400 Subject: [PATCH 08/10] DraftEffect.resolve add ChangesZoneAll trigger --- .../game/ability/effects/DraftEffect.java | 85 ++++++++++--------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java index 653a8f85b86..d0b3007de1c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -8,6 +8,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -38,46 +39,50 @@ import java.util.*; @Override public void resolve(SpellAbility sa) { - Map moveParams = AbilityKey.newMap(); - moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); - moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); - final Card source = sa.getHostCard(); - final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); - final Game game = player.getGame(); - final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); - List spellbook = Arrays.asList(sa.getParam("Spellbook").split(",")); - String [] names = sa.getParam("Spellbook").split(","); - final int numToDraft = AbilityUtils.calculateAmount(source, - sa.getParamOrDefault("DraftNum", "1"), sa); - CardCollection drafted = new CardCollection(); + Map moveParams = AbilityKey.newMap(); + moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); + moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); + final Card source = sa.getHostCard(); + final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); + final Game game = player.getGame(); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); + List spellbook = Arrays.asList(sa.getParam("Spellbook").split(",")); + final int numToDraft = AbilityUtils.calculateAmount(source, + sa.getParamOrDefault("DraftNum", "1"), sa); + CardCollection drafted = new CardCollection(); - for (int i = 0; i < numToDraft; i++) { - String chosen = ""; - Collections.shuffle(spellbook); - List faces = new ArrayList<>(); - for (String name : spellbook.subList(0, 3)) { - // Cardnames that include "," must use ";" instead in Spellbook$ (i.e. Tovolar; Dire Overlord) - name = name.replace(";", ","); - faces.add(StaticData.instance().getCommonCards().getFaceByName(name)); - } - chosen = player.getController().chooseCardName(sa, faces, - Localizer.getInstance().getMessage("lblChooseCardDraft")); - if (!chosen.equals("")) { - Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(chosen), player); - card.setTokenCard(true); - game.getAction().moveTo(ZoneType.None, card, sa, moveParams); - drafted.add(card); - } - } + for (int i = 0; i < numToDraft; i++) { + String chosen = ""; + Collections.shuffle(spellbook); + List faces = new ArrayList<>(); + for (String name : spellbook.subList(0, 3)) { + // Cardnames that include "," must use ";" instead in Spellbook$ (i.e. Tovolar; Dire Overlord) + // name = name.replace(";", ","); + // faces.add(StaticData.instance().getCommonCards().getFaceByName(name)); + } + chosen = player.getController().chooseCardName(sa, faces, + Localizer.getInstance().getMessage("lblChooseCardDraft")); + if (!chosen.equals("")) { + Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(chosen), player); + card.setTokenCard(true); + game.getAction().moveTo(ZoneType.None, card, sa, moveParams); + drafted.add(card); + } + } - for (final Card c : drafted) { - game.getAction().moveTo(zone, c, sa, moveParams); - if (sa.hasParam("RememberDrafted")) { - source.addRemembered(c); - } - } - if (zone.equals(ZoneType.Library)) { - player.shuffle(sa); - } - } + final CardZoneTable triggerList = new CardZoneTable(); + for (final Card c : drafted) { + game.getAction().moveTo(zone, c, sa, moveParams); + if (c != null) { + triggerList.put(ZoneType.None, c.getZone().getZoneType(), c); + } + if (sa.hasParam("RememberDrafted")) { + source.addRemembered(c); + } + } + triggerList.triggerChangesZoneAll(game, sa); + if (zone.equals(ZoneType.Library)) { + player.shuffle(sa); + } + } } From 212f883d8fc2aa9d8f54b74315762375c0f2ceb7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 5 Jul 2022 13:12:32 -0400 Subject: [PATCH 09/10] DraftEffect use made card in new zone for trigger, etc --- .../main/java/forge/game/ability/effects/DraftEffect.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java index d0b3007de1c..283af522cf6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -72,12 +72,12 @@ import java.util.*; final CardZoneTable triggerList = new CardZoneTable(); for (final Card c : drafted) { - game.getAction().moveTo(zone, c, sa, moveParams); + Card made = game.getAction().moveTo(zone, c, sa, moveParams); if (c != null) { - triggerList.put(ZoneType.None, c.getZone().getZoneType(), c); + triggerList.put(ZoneType.None, made.getZone().getZoneType(), made); } if (sa.hasParam("RememberDrafted")) { - source.addRemembered(c); + source.addRemembered(made); } } triggerList.triggerChangesZoneAll(game, sa); From ce90e3358eaf802aa71310b8ec88d005005472cf Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 5 Jul 2022 13:12:43 -0400 Subject: [PATCH 10/10] MakeCardEffect use made card in new zone for trigger, etc --- .../java/forge/game/ability/effects/MakeCardEffect.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java index 5f746118833..c6ecc4d7610 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -63,13 +63,13 @@ public class MakeCardEffect extends SpellAbilityEffect { final CardZoneTable triggerList = new CardZoneTable(); for (final Card c : cards) { - game.getAction().moveTo(zone, c, sa, moveParams); - triggerList.put(ZoneType.None, c.getZone().getZoneType(), c); + Card made = game.getAction().moveTo(zone, c, sa, moveParams); + triggerList.put(ZoneType.None, made.getZone().getZoneType(), made); if (sa.hasParam("RememberMade")) { - sa.getHostCard().addRemembered(c); + sa.getHostCard().addRemembered(made); } if (sa.hasParam("ImprintMade")) { - sa.getHostCard().addImprintedCard(c); + sa.getHostCard().addImprintedCard(made); } } triggerList.triggerChangesZoneAll(game, sa);