From a161d838ee539e3ec522ca9c0f4d9e3d8c924cf5 Mon Sep 17 00:00:00 2001 From: Adam Pantel <> Date: Mon, 1 Mar 2021 13:56:17 -0500 Subject: [PATCH 1/2] Add dice rolling --- .../forge/game/ability/AbilityFactory.java | 15 ++-- .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/RollDiceEffect.java | 87 +++++++++++++++++++ .../java/forge/game/card/CounterEnumType.java | 2 + .../forge/game/trigger/TriggerRolledDie.java | 56 ++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + .../cardsfolder/a/as_luck_would_have_it.txt | 9 ++ .../b/box_of_free_range_goblins.txt | 7 ++ .../res/cardsfolder/c/chicken_a_la_king.txt | 9 ++ forge-gui/res/cardsfolder/c/chicken_egg.txt | 10 +++ .../res/cardsfolder/c/chittering_doom.txt | 7 ++ .../res/cardsfolder/d/dungeon_master.txt | 17 ++++ .../cardsfolder/e/elvish_impersonators.txt | 10 +++ forge-gui/res/cardsfolder/g/goblin_tutor.txt | 10 +++ .../res/cardsfolder/g/ground_pounder.txt | 9 ++ forge-gui/res/cardsfolder/g/growth_spurt.txt | 6 ++ forge-gui/res/cardsfolder/h/hammer_helper.txt | 7 ++ forge-gui/res/cardsfolder/h/hammer_jammer.txt | 13 +++ forge-gui/res/cardsfolder/h/hydradoodle.txt | 12 +++ forge-gui/res/cardsfolder/i/inhumaniac.txt | 11 +++ forge-gui/res/cardsfolder/j/jumbo_imp.txt | 17 ++++ forge-gui/res/cardsfolder/k/krazy_kow.txt | 9 ++ .../res/cardsfolder/l/jack_in_the_mox.txt | 14 +++ forge-gui/res/cardsfolder/l/lobe_lobber.txt | 9 ++ .../res/cardsfolder/m/goblin_bowling_team.txt | 9 ++ .../m/mad_science_fair_project.txt | 9 ++ forge-gui/res/cardsfolder/p/painiac.txt | 8 ++ forge-gui/res/cardsfolder/p/poultrygeist.txt | 11 +++ forge-gui/res/cardsfolder/s/spark_fiend.txt | 15 ++++ .../res/cardsfolder/s/steel_squirrel.txt | 9 ++ .../res/cardsfolder/s/strategy_schmategy.txt | 14 +++ .../s/sword_of_dungeons_dragons.txt | 2 +- .../res/cardsfolder/t/temp_of_the_damned.txt | 14 +++ forge-gui/res/cardsfolder/t/time_out.txt | 6 ++ .../u/urza's_science_fair_project.txt | 12 +++ .../cardsfolder/w/willing_test_subject.txt | 10 +++ forge-gui/res/cardsfolder/z/zealot_il_vec.txt | 2 +- forge-gui/res/lists/TypeLists.txt | 4 + .../tokenscripts/b_1_1_skeleton_opp_life.txt | 8 ++ .../res/tokenscripts/b_2_2_rogue_hexproof.txt | 7 ++ .../r_3_3_fighter_first_strike.txt | 7 ++ .../res/tokenscripts/r_4_4_giant_chicken.txt | 2 +- .../res/tokenscripts/u_1_1_wizard_flying.txt | 7 ++ .../tokenscripts/w_1_1_cleric_lifelink.txt | 7 ++ 44 files changed, 503 insertions(+), 8 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerRolledDie.java create mode 100644 forge-gui/res/cardsfolder/a/as_luck_would_have_it.txt create mode 100644 forge-gui/res/cardsfolder/b/box_of_free_range_goblins.txt create mode 100644 forge-gui/res/cardsfolder/c/chicken_a_la_king.txt create mode 100644 forge-gui/res/cardsfolder/c/chicken_egg.txt create mode 100644 forge-gui/res/cardsfolder/c/chittering_doom.txt create mode 100644 forge-gui/res/cardsfolder/d/dungeon_master.txt create mode 100644 forge-gui/res/cardsfolder/e/elvish_impersonators.txt create mode 100644 forge-gui/res/cardsfolder/g/goblin_tutor.txt create mode 100644 forge-gui/res/cardsfolder/g/ground_pounder.txt create mode 100644 forge-gui/res/cardsfolder/g/growth_spurt.txt create mode 100644 forge-gui/res/cardsfolder/h/hammer_helper.txt create mode 100644 forge-gui/res/cardsfolder/h/hammer_jammer.txt create mode 100644 forge-gui/res/cardsfolder/h/hydradoodle.txt create mode 100644 forge-gui/res/cardsfolder/i/inhumaniac.txt create mode 100644 forge-gui/res/cardsfolder/j/jumbo_imp.txt create mode 100644 forge-gui/res/cardsfolder/k/krazy_kow.txt create mode 100644 forge-gui/res/cardsfolder/l/jack_in_the_mox.txt create mode 100644 forge-gui/res/cardsfolder/l/lobe_lobber.txt create mode 100644 forge-gui/res/cardsfolder/m/goblin_bowling_team.txt create mode 100644 forge-gui/res/cardsfolder/m/mad_science_fair_project.txt create mode 100644 forge-gui/res/cardsfolder/p/painiac.txt create mode 100644 forge-gui/res/cardsfolder/p/poultrygeist.txt create mode 100644 forge-gui/res/cardsfolder/s/spark_fiend.txt create mode 100644 forge-gui/res/cardsfolder/s/steel_squirrel.txt create mode 100644 forge-gui/res/cardsfolder/s/strategy_schmategy.txt create mode 100644 forge-gui/res/cardsfolder/t/temp_of_the_damned.txt create mode 100644 forge-gui/res/cardsfolder/t/time_out.txt create mode 100644 forge-gui/res/cardsfolder/u/urza's_science_fair_project.txt create mode 100644 forge-gui/res/cardsfolder/w/willing_test_subject.txt create mode 100644 forge-gui/res/tokenscripts/b_1_1_skeleton_opp_life.txt create mode 100644 forge-gui/res/tokenscripts/b_2_2_rogue_hexproof.txt create mode 100644 forge-gui/res/tokenscripts/r_3_3_fighter_first_strike.txt create mode 100644 forge-gui/res/tokenscripts/u_1_1_wizard_flying.txt create mode 100644 forge-gui/res/tokenscripts/w_1_1_cleric_lifelink.txt diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 7452ebdf6ad..e4ecef3b504 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -115,8 +115,8 @@ public final class AbilityFactory { * * @param abString * a {@link java.lang.String} object. - * @param hostCard - * a {@link forge.game.card.Card} object. + * @param state + * a {@link forge.game.card.CardState} object. * @return a {@link forge.game.spellability.SpellAbility} object. */ public static final SpellAbility getAbility(final String abString, final CardState state) { @@ -282,6 +282,14 @@ public final class AbilityFactory { } } + if (api == ApiType.RollDice) { + for (String param : mapParams.keySet()) { + if (param.startsWith("On") || param.equals("Else")) { + spellAbility.setAdditionalAbility(param, getSubAbility(state, mapParams.get(param), sVarHolder)); + } + } + } + if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) { String desc = mapParams.containsKey("SpellDescription") ? mapParams.get("SpellDescription") : spellAbility.getHostCard().getName(); @@ -386,7 +394,6 @@ public final class AbilityFactory { * * @param sa * a {@link forge.game.spellability.SpellAbility} object. - * @param mapParams */ private static final void initializeParams(final SpellAbility sa) { @@ -402,7 +409,6 @@ public final class AbilityFactory { * * @param sa * a {@link forge.game.spellability.SpellAbility} object. - * @param mapParams */ private static final void makeRestrictions(final SpellAbility sa) { // SpellAbilityRestrictions should be added in here @@ -417,7 +423,6 @@ public final class AbilityFactory { * * @param sa * a {@link forge.game.spellability.SpellAbility} object. - * @param mapParams */ private static final void makeConditions(final SpellAbility sa) { // SpellAbilityRestrictions should be added in here 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 74a3a612e63..7b7924dc819 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -143,6 +143,7 @@ public enum ApiType { Reveal (RevealEffect.class), RevealHand (RevealHandEffect.class), ReverseTurnOrder (ReverseTurnOrderEffect.class), + RollDice (RollDiceEffect.class), RollPlanarDice (RollPlanarDiceEffect.class), RunChaos (RunChaosEffect.class), Sacrifice (SacrificeEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java new file mode 100644 index 00000000000..eaa9841a94a --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java @@ -0,0 +1,87 @@ +package forge.game.ability.effects; + +import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.util.Localizer; +import forge.util.MyRandom; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class RollDiceEffect extends SpellAbilityEffect { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + protected String getStackDescription(SpellAbility sa) { + final PlayerCollection player = getTargetPlayers(sa); + + StringBuilder stringBuilder = new StringBuilder(); + if (player.size() == 1 && player.get(0).equals(sa.getActivatingPlayer())) { + stringBuilder.append("Roll "); + } else { + stringBuilder.append(player).append(" rolls "); + } + stringBuilder.append(sa.getParamOrDefault("Amt", "a")).append(" "); + stringBuilder.append(sa.getParamOrDefault("Sides", "6")).append("-sided "); + if (sa.getParamOrDefault("Amt", "1").equals("1")) { + stringBuilder.append("die."); + } else { + stringBuilder.append("dice."); + } + return stringBuilder.toString(); + } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityEffect#resolve(forge.card.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + final Card host = sa.getHostCard(); + + int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Amt", "1"), sa); + int sides = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Sides", "6"), sa); + + final PlayerCollection playersToRoll = getTargetPlayers(sa); + + for(Player player : playersToRoll) { + int total = 0; + List rolls = new ArrayList<>(); + for (int i = 0; i < amount; i++) { + int roll = MyRandom.getRandom().nextInt(sides) + 1; + rolls.add(roll); + + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.Player, player); + runParams.put(AbilityKey.Result, roll); + player.getGame().getTriggerHandler().runTrigger(TriggerType.RolledDie, runParams, false); + + total += roll; + } + + String message = Localizer.getInstance().getMessage("lblPlayerRolledResult", player, StringUtils.join(rolls, ", ")); + player.getGame().getAction().nofityOfValue(sa, player, message, null); + + if (sa.hasParam("ResultSVar")) { + host.setSVar(sa.getParam("ResultSVar"), ""+total); + } + if (sa.hasAdditionalAbility("OnDoubles") && rolls.get(0).equals(rolls.get(1))) { + AbilityUtils.resolve(sa.getAdditionalAbility("OnDoubles")); + } + if (sa.hasAdditionalAbility("On"+total)) { + AbilityUtils.resolve(sa.getAdditionalAbility("On"+total)); + } else if (sa.hasAdditionalAbility("Else")) { + AbilityUtils.resolve(sa.getAdditionalAbility("Else")); + } + } + } +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index 96d550e098f..3c5b8aca4d1 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -119,6 +119,8 @@ public enum CounterEnumType { FUNGUS("FNGUS", 121, 219, 151), + FUNK("FUNK", 215, 24, 222), + FURY("FURY", 255, 120, 89), FUSE("FUSE", 255, 122, 85), diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRolledDie.java b/forge-game/src/main/java/forge/game/trigger/TriggerRolledDie.java new file mode 100644 index 00000000000..82a6fa42ba4 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRolledDie.java @@ -0,0 +1,56 @@ +package forge.game.trigger; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; +import forge.util.Expressions; +import forge.util.Localizer; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; + +public class TriggerRolledDie extends Trigger { + + public TriggerRolledDie(final Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} + * @param runParams*/ + @Override + public final boolean performTest(final Map runParams) { + if (hasParam("ValidPlayer")) { + if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), + this.getHostCard())) { + return false; + } + } + if (hasParam("ValidResult")) { + String[] params = getParam("ValidResult").split(","); + final int result = (int) runParams.get(AbilityKey.Result); + for (String param : params) { + if (StringUtils.isNumeric(param)) { + if (param.equals("" + result)) return true; + } else { + final String comp = param.substring(0, 2); + final int rightSide = Integer.parseInt(param.substring(2)); + if (Expressions.compare(result, comp, rightSide)) return true; + } + } + return false; + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { + sa.setTriggeringObjectsFrom(runParams, AbilityKey.Result, AbilityKey.Player); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + return Localizer.getInstance().getMessage("lblPlayer") + ": " + sa.getTriggeringObject(AbilityKey.Player) + ", " + + Localizer.getInstance().getMessage("lblResultIs", sa.getTriggeringObject(AbilityKey.Result)); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 938e88c4c72..0a2481e28eb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -84,6 +84,7 @@ public enum TriggerType { PlaneswalkedTo(TriggerPlaneswalkedTo.class), Regenerated(TriggerRegenerated.class), Revealed(TriggerRevealed.class), + RolledDie(TriggerRolledDie.class), Sacrificed(TriggerSacrificed.class), Scry(TriggerScry.class), SearchedLibrary(TriggerSearchedLibrary.class), diff --git a/forge-gui/res/cardsfolder/a/as_luck_would_have_it.txt b/forge-gui/res/cardsfolder/a/as_luck_would_have_it.txt new file mode 100644 index 00000000000..29a30017a16 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/as_luck_would_have_it.txt @@ -0,0 +1,9 @@ +Name:As Luck Would Have It +ManaCost:G +Types:Enchantment +K:Hexproof +T:Mode$ RolledDie | Execute$ TrigCounters | ValidPlayer$ You | TriggerDescription$ Whenever you roll a die, put a number of luck counters on As Luck Would Have It equal to the result. Then if there are 100 or more luck counters on As Luck Would Have It, you win the game. +SVar:TrigCounters:DB$ PutCounter | Defined$ Self | CounterType$ LUCK | CounterNum$ X | SubAbility$ DBWin +SVar:DBWin:DB$ WinsGame | Defined$ You | ConditionPresent$ Card.Self+counters_GE100_LUCK +SVar:X:TriggerCount$Result +Oracle:Whenever you roll a die, put a number of luck counters on As Luck Would Have It equal to the result. Then if there are 100 or more luck counters on As Luck Would Have It, you win the game. (Count both rolls if you reroll a die.) diff --git a/forge-gui/res/cardsfolder/b/box_of_free_range_goblins.txt b/forge-gui/res/cardsfolder/b/box_of_free_range_goblins.txt new file mode 100644 index 00000000000..8faee0bbd0c --- /dev/null +++ b/forge-gui/res/cardsfolder/b/box_of_free_range_goblins.txt @@ -0,0 +1,7 @@ +Name:Box of Free-Range Goblins +ManaCost:4 R R +Types:Sorcery +A:SP$ RollDice | Cost$ 4 R R | ResultSVar$ Result | SubAbility$ Tokens +SVar:Tokens:DB$ Token | TokenAmount$ Result | TokenScript$ r_1_1_goblin | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to the result. +DeckHas:Ability$Token +Oracle:Roll a six-sided die. Create a number of 1/1 red Goblin creature tokens equal to the result. diff --git a/forge-gui/res/cardsfolder/c/chicken_a_la_king.txt b/forge-gui/res/cardsfolder/c/chicken_a_la_king.txt new file mode 100644 index 00000000000..8b61024b668 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/chicken_a_la_king.txt @@ -0,0 +1,9 @@ +Name:Chicken à la King +ManaCost:1 U U +Types:Creature Bird Noble +PT:2/2 +T:Mode$ RolledDie | Execute$ TrigCounters | ValidResult$ 6 | TriggerDescription$ Whenever a 6 is rolled on a six-sided die, put a +1/+1 counter on each Bird. +SVar:TrigCounters:DB$ PutCounterAll | ValidCards$ Bird | CounterType$ P1P1 | CounterNum$ 1 +A:AB$ RollDice | Cost$ tapXType<1/Bird> | SpellDescription$ Roll a six-sided die. +DeckHas:Ability$Counters +Oracle:Whenever a 6 is rolled on a six-sided die, put a +1/+1 counter on each Bird. (You may roll dice only when instructed to.)\nTap an untapped Bird you control: Roll a six-sided die. (Like now.) diff --git a/forge-gui/res/cardsfolder/c/chicken_egg.txt b/forge-gui/res/cardsfolder/c/chicken_egg.txt new file mode 100644 index 00000000000..af495aa4312 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/chicken_egg.txt @@ -0,0 +1,10 @@ +Name:Chicken Egg +ManaCost:1 R +Types:Creature Egg +PT:0/1 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll a six-sided die. If you roll a 6, sacrifice CARDNAME and create a 4/4 red Giant Bird creature token. +SVar:TrigRoll:DB$ RollDice | On6$ DBSac +SVar:DBSac:DB$ Sacrifice | Defined$ Self | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenScript$ r_4_4_giant_chicken +DeckHas:Ability$Token +Oracle:At the beginning of your upkeep, roll a six-sided die. If you roll a 6, sacrifice Chicken Egg and create a 4/4 red Giant Bird creature token. diff --git a/forge-gui/res/cardsfolder/c/chittering_doom.txt b/forge-gui/res/cardsfolder/c/chittering_doom.txt new file mode 100644 index 00000000000..3895044be25 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/chittering_doom.txt @@ -0,0 +1,7 @@ +Name:Chittering Doom +ManaCost:3 G +Types:Enchantment +T:Mode$ RolledDie | Execute$ TrigToken | ValidPlayer$ You | ValidResult$ GE4 | TriggerDescription$ Whenever you roll a 4 or higher on a die, create a 1/1 green Squirrel creature token. +SVar:TrigToken:DB$ Token | TokenScript$ g_1_1_squirrel +DeckHas:Ability$Token +Oracle:Whenever you roll a 4 or higher on a die, create a 1/1 green Squirrel creature token. diff --git a/forge-gui/res/cardsfolder/d/dungeon_master.txt b/forge-gui/res/cardsfolder/d/dungeon_master.txt new file mode 100644 index 00000000000..203c458084b --- /dev/null +++ b/forge-gui/res/cardsfolder/d/dungeon_master.txt @@ -0,0 +1,17 @@ +Name:Dungeon Master +ManaCost:2 W U +Types:Legendary Planeswalker Dungeon-Master +Loyalty:1 +K:ETBReplacement:Other:RollLoyal +SVar:RollLoyal:DB$ RollDice | Sides$ 4 | ResultSVar$ Result | SubAbility$ DBLoyalty | SpellDescription$ Add 1d4 loyalty counters to CARDNAME +SVar:DBLoyalty:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ Result | ETB$ True +A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Opponent | TokenOwner$ Targeted | TokenScript$ b_1_1_skeleton_opp_life | Planeswalker$ True | SpellDescription$ Target opponent creates a 1/1 black Skeleton creature token with "When this creature dies, each opponent gains 2 life."" +A:AB$ RollDice | Cost$ AddCounter<1/LOYALTY> | Sides$ 2 | On1$ DBSkipTurn | ResultSVar$ Result | SubAbility$ DBDraw | SpellDescription$ Roll a d20. If you roll a 1, skip your next turn. If you roll a 12 or higher, draw a card. +SVar:DBSkipTurn:DB$ SkipTurn | Defined$ You | NumTurns$ 1 +SVar:DBDraw:DB$ Draw | ConditionCheckSVar$ Result | ConditionSVarCompare$ GE12 +A:AB$ Token | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | TokenScript$ r_3_3_fighter_first_strike | SubAbility$ DBCleric | SpellDescription$ You get an adventuring party. (Your party is a 3/3 red Fighter with first strike, a 1/1 white Cleric with lifelink, a 2/2 black Rogue with hexproof, and a 1/1 blue Wizard with flying.) +SVar:DBCleric:DB$ Token | TokenScript$ w_1_1_cleric_lifelink | SubAbility$ DBRogue +SVar:DBRogue:DB$ Token | TokenScript$ b_2_2_rogue_hexproof | SubAbility$ DBWizard +SVar:DBWizard:DB$ Token | TokenScript$ u_1_1_wizard_flying +DeckHas:Ability$Token +Oracle:[+1]: Target opponent creates a 1/1 black Skeleton creature token with “When this creature dies, each opponent gains 2 life.”\n[+1]: Roll a d20. If you roll a 1, skip your next turn. If you roll a 12 or higher, draw a card.\n[−6]: You get an adventuring party. (Your party is a 3/3 red Fighter with first strike, a 1/1 white Cleric with lifelink, a 2/2 black Rogue with hexproof, and a 1/1 blue Wizard with flying.) diff --git a/forge-gui/res/cardsfolder/e/elvish_impersonators.txt b/forge-gui/res/cardsfolder/e/elvish_impersonators.txt new file mode 100644 index 00000000000..41c131b13e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/e/elvish_impersonators.txt @@ -0,0 +1,10 @@ +Name:Elvish Impersonators +ManaCost:3 G +Types:Creature Elf +PT:*/* +K:Flying +K:ETBReplacement:Other:TrigRoll +SVar:TrigRoll:DB$ RollDice | ResultSVar$ SetPwr | SubAbility$ RollTough | SpellDescription$ As CARDNAME enters the battlefield, roll a six-sided die twice. Its base power becomes the first result and its base toughness becomes the second result. +SVar:RollTough:DB$ RollDice | ResultSVar$ SetTgn | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ SetPwr | Toughness$ SetTgn +Oracle:As Elvish Impersonators enters the battlefield, roll a six-sided die twice. Its base power becomes the first result and its base toughness becomes the second result. diff --git a/forge-gui/res/cardsfolder/g/goblin_tutor.txt b/forge-gui/res/cardsfolder/g/goblin_tutor.txt new file mode 100644 index 00000000000..1e7b612f37f --- /dev/null +++ b/forge-gui/res/cardsfolder/g/goblin_tutor.txt @@ -0,0 +1,10 @@ +Name:Goblin Tutor +ManaCost:R +Types:Instant +A:SP$ RollDice | Cost$ R | On2$ GetGobTut | On3$ GetEnch | On4$ GetArtif | On5$ GetCreat| On6$ GetSpell | SpellDescription$ Roll a six-sided die. Search your library for the indicated card, reveal it, put it into your hand, then shuffle your library.\n2 — A card named Goblin Tutor\n3 — An enchantment\n4 — An artifact\n5 — A creature\n6 — An instant or sorcery +SVar:GetGobTut:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedGoblin Tutor | ChangeNum$ 1 +SVar:GetEnch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 1 +SVar:GetArtif:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Artifact | ChangeNum$ 1 +SVar:GetCreat:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 +SVar:GetSpell:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Instant,Sorcery | ChangeNum$ 1 +Oracle:Roll a six-sided die. If you roll a 1, Goblin Tutor has no effect. Otherwise, search your library for the indicated card, reveal it, put it into your hand, then shuffle your library.\n2 — A card named Goblin Tutor\n3 — An enchantment\n4 — An artifact\n5 — A creature\n6 — An instant or sorcery diff --git a/forge-gui/res/cardsfolder/g/ground_pounder.txt b/forge-gui/res/cardsfolder/g/ground_pounder.txt new file mode 100644 index 00000000000..61400e8e7f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/ground_pounder.txt @@ -0,0 +1,9 @@ +Name:Ground Pounder +ManaCost:1 G +Types:Creature Goblin Warrior +PT:2/2 +A:AB$ RollDice | Cost$ 3 G | ResultSVar$ X | SubAbility$ DBPump | SpellDescription$ Roll a six-sided die. +SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X | SpellDescription$ CARDNAME gets +X/+X until end of turn, where X is the result. +T:Mode$ RolledDie | Execute$ TrigTrample | ValidPlayer$ You | ValidResult$ GE5 | TriggerDescription$ Whenever you roll a 5 or higher on a die, CARDNAME gains trample until end of turn. +SVar:TrigTrample:DB$ Pump | Defined$ Self | KW$ Trample +Oracle:{3}{G}: Roll a six-sided die. Ground Pounder gets +X/+X until end of turn, where X is the result.\nWhenever you roll a 5 or higher on a die, Ground Pounder gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/g/growth_spurt.txt b/forge-gui/res/cardsfolder/g/growth_spurt.txt new file mode 100644 index 00000000000..4cd5e8107a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/growth_spurt.txt @@ -0,0 +1,6 @@ +Name:Growth Spurt +ManaCost:1 G +Types:Instant +A:SP$ RollDice | Cost$ 1 G | ResultSVar$ X | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | NumAtt$ X | NumDef$ X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the result. +Oracle:Roll a six-sided die. Target creature gets +X/+X until end of turn, where X is the result. diff --git a/forge-gui/res/cardsfolder/h/hammer_helper.txt b/forge-gui/res/cardsfolder/h/hammer_helper.txt new file mode 100644 index 00000000000..fba7b135d9d --- /dev/null +++ b/forge-gui/res/cardsfolder/h/hammer_helper.txt @@ -0,0 +1,7 @@ +Name:Hammer Helper +ManaCost:3 R +Types:Sorcery +A:SP$ GainControl | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | LoseControl$ EOT | SubAbility$ DBRoll | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. +SVar:DBRoll:DB$ RollDice | ResultSVar$ X | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ X | KW$ Haste | SpellDescription$ Until end of turn, it gains haste and gets +X/+0, where X is the result. +Oracle:Gain control of target creature until end of turn. Untap that creature and roll a six-sided die. Until end of turn, it gains haste and gets +X/+0, where X is the result. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/hammer_jammer.txt b/forge-gui/res/cardsfolder/h/hammer_jammer.txt new file mode 100644 index 00000000000..ab7b493ef18 --- /dev/null +++ b/forge-gui/res/cardsfolder/h/hammer_jammer.txt @@ -0,0 +1,13 @@ +Name:Hammer Jammer +ManaCost:3 R +Types:Creature Goblin Warrior +PT:0/0 +K:ETBReplacement:Other:RollCounters +SVar:RollCounters:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBCounters | SpellDescription$ As CARDNAME enters the battlefield, roll a six-sided die. CARDNAME enters the battlefield with a number of +1/+1 counters on it equal to the total of those results. +SVar:DBCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Result | ETB$ True +T:Mode$ RolledDie | Execute$ TrigRemove | ValidPlayer$ You | TriggerDescription$ Whenever you roll a die, remove all +1/+1 counters from CARDNAME, then put a number of +1/+1 counters on it equal to the result. +SVar:TrigRemove:DB$ RemoveCounterAll | ValidCards$ Card.Self | CounterType$ P1P1 | AllCounters$ True | SubAbility$ TrigCounters +SVar:X:TriggerCount$Result +SVar:TrigCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X +DeckHas:Ability$Counters +Oracle:As Hammer Jammer enters the battlefield, roll a six-sided die. Hammer Jammer enters the battlefield with a number of +1/+1 counters on it equal to the result.\nWhenever you roll a die, remove all +1/+1 counters from Hammer Jammer, then put a number of +1/+1 counters on it equal to the result. diff --git a/forge-gui/res/cardsfolder/h/hydradoodle.txt b/forge-gui/res/cardsfolder/h/hydradoodle.txt new file mode 100644 index 00000000000..c6acd583e53 --- /dev/null +++ b/forge-gui/res/cardsfolder/h/hydradoodle.txt @@ -0,0 +1,12 @@ +Name:Hydradoodle +ManaCost:X X G G +Types:Creature Hydra Dog +PT:0/0 +K:ETBReplacement:Other:RollCounters +SVar:X:Count$xPaid +SVar:RollCounters:DB$ RollDice | Amt$ X | ResultSVar$ Result | SubAbility$ DBCounters | SpellDescription$ As CARDNAME enters the battlefield, roll X six-sided dice. CARDNAME enters the battlefield with a number of +1/+1 counters on it equal to the total of those results. +SVar:DBCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Result | ETB$ True +K:Reach +K:Trample +DeckHas:Ability$Counters +Oracle:As Hydradoodle enters the battlefield, roll X six-sided dice. Hydradoodle enters the battlefield with a number of +1/+1 counters on it equal to the total of those results.\nReach, trample diff --git a/forge-gui/res/cardsfolder/i/inhumaniac.txt b/forge-gui/res/cardsfolder/i/inhumaniac.txt new file mode 100644 index 00000000000..47e60a8e386 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/inhumaniac.txt @@ -0,0 +1,11 @@ +Name:Inhumaniac +ManaCost:1 B +Types:Creature Brainiac +PT:1/1 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll a six-sided die. On a 3 or 4, put a +1/+1 counter on Inhumaniac. On a 5 or higher, put two +1/+1 counters on it. On a 1, remove all +1/+1 counters from Inhumaniac. +SVar:TrigRoll:DB$ RollDice | On3$ DBOne | On4$ DBOne | On5$ DBTwo | On6$ DBTwo | On1$ DBRemove +SVar:DBOne:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:DBTwo:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 +SVar:DBRemove:DB$ RemoveCounterAll | ValidCards$ Card.Self | CounterType$ P1P1 | AllCounters$ True +DeckHas:Ability$Counters +Oracle:At the beginning of your upkeep, roll a six-sided die. On a 3 or 4, put a +1/+1 counter on Inhumaniac. On a 5 or higher, put two +1/+1 counters on it. On a 1, remove all +1/+1 counters from Inhumaniac. diff --git a/forge-gui/res/cardsfolder/j/jumbo_imp.txt b/forge-gui/res/cardsfolder/j/jumbo_imp.txt new file mode 100644 index 00000000000..54d145bd54d --- /dev/null +++ b/forge-gui/res/cardsfolder/j/jumbo_imp.txt @@ -0,0 +1,17 @@ +Name:Jumbo Imp +ManaCost:2 B +Types:Creature Imp +PT:0/0 +K:ETBReplacement:Other:RollCounters +SVar:X:Count$xPaid +SVar:RollCounters:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBCountersETB | SpellDescription$ As Jumbo Imp enters the battlefield, roll a six-sided die. Jumbo Imp enters the battlefield with a number of +1/+1 counters on it equal to the result. +SVar:DBCountersETB:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Result | ETB$ True +K:Flying +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRollUpkeep | TriggerDescription$ At the beginning of your upkeep, roll a six-sided die and put a number of +1/+1 counters on CARDNAME equal to the result. +SVar:TrigRollUpkeep:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBCountersUpkeep +SVar:DBCountersUpkeep:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Result +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRollEnd | TriggerDescription$ At the beginning of your end step, roll a six-sided die and remove a number of +1/+1 counters from Jumbo Imp equal to the result. +SVar:TrigRollEnd:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBCountersEnd +SVar:DBCountersEnd:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Result +DeckHas:Ability$Counters +Oracle:Flying\nAs Jumbo Imp enters the battlefield, roll a six-sided die. Jumbo Imp enters the battlefield with a number of +1/+1 counters on it equal to the result.\nAt the beginning of your upkeep, roll a six-sided die and put a number of +1/+1 counters on Jumbo Imp equal to the result.\nAt the beginning of your end step, roll a six-sided die and remove a number of +1/+1 counters from Jumbo Imp equal to the result. diff --git a/forge-gui/res/cardsfolder/k/krazy_kow.txt b/forge-gui/res/cardsfolder/k/krazy_kow.txt new file mode 100644 index 00000000000..f8f83308370 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/krazy_kow.txt @@ -0,0 +1,9 @@ +Name:Krazy Kow +ManaCost:3 R +Types:Creature Cow +PT:3/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll a six-sided die. If you a roll a 1, sacrifice Krazy Kow and it deals 3 damage to each creature and each player. +SVar:TrigRoll:DB$ RollDice | On1$ DBSac +SVar:DBSac:DB$ Sacrifice | Defined$ Self | SubAbility$ DBDamage +SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature | ValidPlayers$ Player | NumDmg$ 3 +Oracle:At the beginning of your upkeep, roll a six-sided die. If you a roll a 1, sacrifice Krazy Kow and it deals 3 damage to each creature and each player. diff --git a/forge-gui/res/cardsfolder/l/jack_in_the_mox.txt b/forge-gui/res/cardsfolder/l/jack_in_the_mox.txt new file mode 100644 index 00000000000..41a065b0581 --- /dev/null +++ b/forge-gui/res/cardsfolder/l/jack_in_the_mox.txt @@ -0,0 +1,14 @@ +Name:Jack-in-the-Mox +ManaCost:0 +Types:Artifact +A:AB$ RollDice | Cost$ T | On1$ DBSac | On2$ AddW | On3$ AddU | On4$ AddB | On5$ AddR | On6$ AddG | InstantSpeed$ True | SubAbility$ Add0 | SpellDescription$ Roll a six-sided die. This ability has the indicated effect. 1—Sacrifice Jack-in-the-Mox and you lose 5 life. 2—Add {W}. 3—Add {U}. 4—Add {B}. 5-Add {R}. 6-Add {G}. +SVar:DBSac:DB$ Sacrifice | Defined$ Self | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 5 +SVar:AddW:DB$ Mana | Produced$ W +SVar:AddU:DB$ Mana | Produced$ U +SVar:AddB:DB$ Mana | Produced$ B +SVar:AddR:DB$ Mana | Produced$ R +SVar:AddG:DB$ Mana | Produced$ G +SVar:Add0:DB$ Mana | Produced$ C | Amount$ 0 +SVar:PlayMain1:TRUE +Oracle:{T}: Roll a six-sided die. This ability has the indicated effect.\n1 — Sacrifice Jack-in-the-Mox and you lose 5 life.\n2 — Add {W}.\n3 — Add {U}.\n4 — Add {B}.\n5 — Add {R}.\n6 — Add {G}. diff --git a/forge-gui/res/cardsfolder/l/lobe_lobber.txt b/forge-gui/res/cardsfolder/l/lobe_lobber.txt new file mode 100644 index 00000000000..be6598a100a --- /dev/null +++ b/forge-gui/res/cardsfolder/l/lobe_lobber.txt @@ -0,0 +1,9 @@ +Name:Lobe Lobber +ManaCost:2 +Types:Artifact Equipment +K:Equip:2 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ WandDamage | AddSVar$ DBWandDmg | Description$ Equipped creature has "{T}: This creature deals 1 damage to target player or planeswalker. Roll a six-sided die. On a 5 or higher, untap it." +SVar:WandDamage:AB$ DealDamage | Cost$ T | ValidTgts$ Planeswalker,Player | TgtPrompt$ Select target Planeswalker or player | NumDmg$ 1 | SubAbility$ DBRoll | SpellDescription$ This creature deals 1 damage to target player or planeswalker. Roll a six-sided die. On a 5 or higher, untap it. +SVar:DBRoll:DB$ RollDice | On5$ DBUntap | On6$ DBUntap +SVar:DBUntap:DB$ Untap +Oracle:Equipped creature has “{T}: This creature deals 1 damage to target player or planeswalker. Roll a six-sided die. On a 5 or higher, untap it.”\nEquip {2} diff --git a/forge-gui/res/cardsfolder/m/goblin_bowling_team.txt b/forge-gui/res/cardsfolder/m/goblin_bowling_team.txt new file mode 100644 index 00000000000..79aba426c74 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/goblin_bowling_team.txt @@ -0,0 +1,9 @@ +Name:Goblin Bowling Team +ManaCost:3 R +Types:Creature - Goblin +PT:1/1 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.Self | ReplaceWith$ RollDamage | Description$ If CARDNAME would deal damage to a permanent or player, it deals that much damage plus the result of a six-sided die roll to that permanent or player instead. +SVar:RollDamage:DB$ RollDice | ResultSVar$ Result | SubAbility$ DmgPlus +SVar:DmgPlus:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X +SVar:X:ReplaceCount$DamageAmount/Plus.Result +Oracle:If Goblin Bowling Team would deal damage to a permanent or player, it deals that much damage plus the result of a six-sided die roll to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/m/mad_science_fair_project.txt b/forge-gui/res/cardsfolder/m/mad_science_fair_project.txt new file mode 100644 index 00000000000..61e2d7704d1 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/mad_science_fair_project.txt @@ -0,0 +1,9 @@ +Name:Mad Science Fair Project +ManaCost:3 +Types:Artifact +A:AB$ Pump | Cost$ T | ValidTgts$ Player | SubAbility$ DBRoll +SVar:DBRoll:DB$ RollDice | On1$ AddC | On2$ AddC | On3$ AddC | Else$ AddAny | SpellDescription$ {T}: Roll a six-sided die. On a 3 or lower, target player adds {C}. Otherwise, that player adds one mana of any color they choose. +SVar:AddC:DB$ Mana | Produced$ C | Defined$ Targeted +SVar:AddAny:DB$ Mana | Produced$ Any | Defined$ Targeted +SVar:PlayMain1:TRUE +Oracle:{T}: Roll a six-sided die. On a 3 or lower, target player adds {C}. Otherwise, that player adds one mana of any color they choose. diff --git a/forge-gui/res/cardsfolder/p/painiac.txt b/forge-gui/res/cardsfolder/p/painiac.txt new file mode 100644 index 00000000000..883ecfc2bae --- /dev/null +++ b/forge-gui/res/cardsfolder/p/painiac.txt @@ -0,0 +1,8 @@ +Name:Painiac +ManaCost:2 R +Types:Creature Brainiac +PT:0/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll a six-sided die. CARDNAME gets +X/+0 until end of turn, where X is the result. +SVar:TrigRoll:DB$ RollDice | ResultSVar$ X | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ X +Oracle:At the beginning of your upkeep, roll a six-sided die. Painiac gets +X/+0 until end of turn, where X is the result. diff --git a/forge-gui/res/cardsfolder/p/poultrygeist.txt b/forge-gui/res/cardsfolder/p/poultrygeist.txt new file mode 100644 index 00000000000..714b1f2fda5 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/poultrygeist.txt @@ -0,0 +1,11 @@ +Name:Poultrygeist +ManaCost:2 B +Types:Creature Bird Spirit +PT:1/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ Whenever a creature dies, you may roll a six-sided die. If you roll a 1, sacrifice CARDNAME. Otherwise, put a +1/+1 counter on CARDNAME. +SVar:TrigRoll:DB$ RollDice | On1$ DBSac | Else$ DBCounter +SVar:DBSac:DB$ Sacrifice | Defined$ Self +SVar:DBCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Flying\nWhenever a creature dies, you may roll a six-sided die. If you roll a 1, sacrifice Poultrygeist. Otherwise, put a +1/+1 counter on Poultrygeist. diff --git a/forge-gui/res/cardsfolder/s/spark_fiend.txt b/forge-gui/res/cardsfolder/s/spark_fiend.txt new file mode 100644 index 00000000000..fda1c728706 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/spark_fiend.txt @@ -0,0 +1,15 @@ +Name:Spark Fiend +ManaCost:4 R +Types:Creature Beast +PT:5/6 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRollETB | TriggerDescription$ When Spark Fiend enters the battlefield, roll two six-sided dice. If you rolled 2, 3, or 12, sacrifice Spark Fiend. If you rolled 7 or 11, don’t roll dice for Spark Fiend during any of your following upkeeps. If you rolled any other total, note that total. +SVar:TrigRollETB:DB$ RollDice | Amt$ 2 | On2$ DBSac | On3$ DBSac | On12$ DBSac | On7$ DBSafe | Else$ DBNote | ResultSVar$ Result +SVar:DBSac:DB$ Sacrifice | Defined$ Self +SVar:Safe:Number$1 +SVar:Noted:Number$0 +SVar:DBSafe:DB$ StoreSVar | SVar$ Safe | Type$ Number | Expression$ 0 +SVar:DBNote:DB$ StoreSVar | SVar$ Noted | Type$ CountSVar | Expression$ Result +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | CheckSVar$ Safe | SVarCompare$ NE0 | TriggerZones$ Battlefield | Execute$ TrigRoll | TriggerDescription$ At the beginning of your upkeep, roll two six-sided dice. If you rolled 7, sacrifice Spark Fiend. If you roll the noted total, don’t roll dice for Spark Fiend during any of your following upkeeps. Otherwise, do nothing. +SVar:TrigRoll:DB$ RollDice | Amt$ 2 | On7$ DBSac | ResultSVar$ Result | SubAbility$ DBCheck +SVar:DBCheck:DB$ StoreSVar | SVar$ Safe | Type$ CountSVar | Expression$ Result/Minus.Noted +Oracle:When Spark Fiend enters the battlefield, roll two six-sided dice. If you rolled 2, 3, or 12, sacrifice Spark Fiend. If you rolled 7 or 11, don’t roll dice for Spark Fiend during any of your following upkeeps. If you rolled any other total, note that total.\nAt the beginning of your upkeep, roll two six-sided dice. If you rolled 7, sacrifice Spark Fiend. If you roll the noted total, don’t roll dice for Spark Fiend during any of your following upkeeps. Otherwise, do nothing. diff --git a/forge-gui/res/cardsfolder/s/steel_squirrel.txt b/forge-gui/res/cardsfolder/s/steel_squirrel.txt new file mode 100644 index 00000000000..416be83c955 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/steel_squirrel.txt @@ -0,0 +1,9 @@ +Name:Steel Squirrel +ManaCost:2 +Types:Artifact Creature Squirrel +PT:1/1 +T:Mode$ RolledDie | Execute$ TrigPump | ValidPlayer$ You | ValidResult$ GE5 | TriggerDescription$ Whenever you roll a 5 or higher on a die, CARDNAME gets +X/+X until end of turn, where X is the result. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X +SVar:X:TriggerCount$Result +A:AB$ RollDice | Cost$ 6 | SpellDescription$ Roll a six-sided die. +Oracle:{3}{G}: Roll a six-sided die. Ground Pounder gets +X/+X until end of turn, where X is the result.\nWhenever you roll a 5 or higher on a die, Ground Pounder gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/s/strategy_schmategy.txt b/forge-gui/res/cardsfolder/s/strategy_schmategy.txt new file mode 100644 index 00000000000..5bce9eb6050 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/strategy_schmategy.txt @@ -0,0 +1,14 @@ +Name:Strategy, Schmategy +ManaCost:1 R +Types:Sorcery +A:SP$ StoreSVar | Cost$ 1 R | SVar$ Left | Type$ Number | Expression$ 1 | SubAbility$ DBRepeat +SVar:DBRepeat:DB$ Repeat | RepeatCheckSVar$ Left | RepeatSVarCompare$ GT0 | RepeatSubAbility$ Roll | StackDescription$ Roll a six-sided die. Strategy, Schmategy has the indicated effect. 1-Do nothing. 2-Destroy all artifacts. 3-Destroy all lands. 4-Strategy, Schmategy deals 3 damage to each creature and each player. 5-Each player discards their hand and draws seven cards. 6-Repeat this process two more times. +SVar:Roll:DB$ RollDice | On2$ DBArtif | On3$ DBLand | On4$ DBDamage | On5$ DBWheel | On6$ DBTwoMore | SubAbility$ DBDecr +SVar:DBArtif:DB$ DestroyAll | ValidCards$ Artifact +SVar:DBLand:DB$ DestroyAll | ValidCards$ Land +SVar:DBDamage:DB$ DamageAll | ValidCards$ Creature | ValidPlayers$ Player | NumDmg$ 3 +SVar:DBWheel:DB$ Discard | Mode$ Hand | Defined$ Player | SubAbility$ DBEachDraw +SVar:DBEachDraw:DB$ Draw | Defined$ Player | NumCards$ 7 +SVar:DBTwoMore:DB$ StoreSVar | SVar$ Left | Type$ CountSVar | Expression$ Left/Plus.2 +SVar:DBDecr:DB$ StoreSVar | SVar$ Left | Type$ CountSVar | Expression$ Left/Minus.1 +Oracle:Roll a six-sided die. Strategy, Schmategy has the indicated effect.\n1 — Do nothing.\n2 — Destroy all artifacts.\n3 — Destroy all lands.\n4 — Strategy, Schmategy deals 3 damage to each creature and each player.\n5 — Each player discards their hand and draws seven cards.\n6 — Repeat this process two more times. diff --git a/forge-gui/res/cardsfolder/s/sword_of_dungeons_dragons.txt b/forge-gui/res/cardsfolder/s/sword_of_dungeons_dragons.txt index a9921d729fd..b03103e7670 100644 --- a/forge-gui/res/cardsfolder/s/sword_of_dungeons_dragons.txt +++ b/forge-gui/res/cardsfolder/s/sword_of_dungeons_dragons.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoop | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, create a 4/4 gold Dragon creature token with flying and roll a d20 (a twenty-sided die). If you roll a 20, repeat this process. SVar:TrigLoop:DB$ Repeat | RepeatCheckSVar$ RepeatCheck | RepeatSVarCompare$ GT0 | RepeatSubAbility$ TrigToken | StackDescription$ Create a 4/4 gold Dragon creature token with flying and roll a d20. If you roll a 20, repeat this process. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_4_4_dragon_flying | TokenOwner$ You | SubAbility$ RollDie -SVar:RollDie:DB$ GenericChoice | Choices$ Win,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose,Lose | AtRandom$ True +SVar:RollDie:DB$ RollDice | Sides$ 20 | On20$ Win | Else$ Lose SVar:Win:DB$ StoreSVar | SVar$ RepeatCheck | Type$ Number | Expression$ 1 SVar:Lose:DB$ StoreSVar | SVar$ RepeatCheck | Type$ Number | Expression$ 0 SVar:RepeatCheck:Number$ 1 diff --git a/forge-gui/res/cardsfolder/t/temp_of_the_damned.txt b/forge-gui/res/cardsfolder/t/temp_of_the_damned.txt new file mode 100644 index 00000000000..509697f7c2d --- /dev/null +++ b/forge-gui/res/cardsfolder/t/temp_of_the_damned.txt @@ -0,0 +1,14 @@ +Name:Temp of the Damned +ManaCost:2 B +Types:Creature Zombie +PT:3/3 +K:ETBReplacement:Other:RollCounters +SVar:RollCounters:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBCounters | SpellDescription$ As CARDNAME enters the battlefield, roll a six-sided die. CARDNAME enters the battlefield with a number of FUNK counters on it equal to the total of those results. +SVar:DBCounters:DB$ PutCounter | Defined$ Self | CounterType$ FUNK | CounterNum$ Result | ETB$ True +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemove | TriggerDescription$ At the beginning of your upkeep, remove a funk counter from CARDNAME. If you can’t, sacrifice it. +SVar:TrigRemove:DB$ RemoveCounter | Defined$ Self | CounterType$ FUNK | CounterNum$ 1 | RememberRemoved$ True | SubAbility$ DBSac +SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionCheckSVar$ FadingCheckSVar | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup +SVar:FadingCheckSVar:Count$RememberedSize +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Counters +Oracle:As Temp of the Damned enters the battlefield, roll a six-sided die. Temp of the Damned enters the battlefield with a number of funk counters on it equal to the result.\nAt the beginning of your upkeep, remove a funk counter from Temp of the Damned. If you can’t, sacrifice it. diff --git a/forge-gui/res/cardsfolder/t/time_out.txt b/forge-gui/res/cardsfolder/t/time_out.txt new file mode 100644 index 00000000000..b154465cc30 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/time_out.txt @@ -0,0 +1,6 @@ +Name:Time Out +ManaCost:4 U +Types:Instant +A:SP$ RollDice | Cost$ 4 U | ResultSVar$ X | SubAbility$ Tuck +SVar:Tuck:DB$ ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ X | SpellDescription$ Put target nonland permanent into its owner's library just beneath the top X cards of that library. +Oracle:Roll a six-sided die. Put target nonland permanent into its owner’s library just beneath the top X cards of that library, where X is the result. diff --git a/forge-gui/res/cardsfolder/u/urza's_science_fair_project.txt b/forge-gui/res/cardsfolder/u/urza's_science_fair_project.txt new file mode 100644 index 00000000000..40a4efb1e70 --- /dev/null +++ b/forge-gui/res/cardsfolder/u/urza's_science_fair_project.txt @@ -0,0 +1,12 @@ +Name:Urza's Science Fair Project +ManaCost:6 +Types:Artifact Creature Construct +PT:4/4 +A:AB$ RollDice | Cost$ 2 | On1$ M2 | On2$ Fog | On3$ Vig | On4$ FS | On5$ Fly | On6$ P2 | SpellDescription$ Roll a six-sided die. CARDNAME gets the indicated result: 1-It gets -2/-2 until end of turn. 2-Prevent all combat damage it would deal this turn. 3-It gains vigilance until end of turn. 4-It gains first strike until end of turn. 5-It gains flying until end of turn. 6-It gets +2/+2 until end of turn. +SVar:M2:DB$ Pump | Defined$ Self | NumAtt$ -2 | NumDef$ -2 +SVar:Fog:DB$ Pump | Defined$ Self | KW$ Prevent all combat damage that would be dealt by CARDNAME. +SVar:Vig:DB$ Pump | Defined$ Self | KW$ Vigilance +SVar:FS:DB$ Pump | Defined$ Self | KW$ First Strike +SVar:Fly:DB$ Pump | Defined$ Self | KW$ Flying +SVar:P2:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 +Oracle:{2}: Roll a six-sided die. Urza’s Science Fair Project gets the indicated result.\n1 — It gets -2/-2 until end of turn.\n2 — Prevent all combat damage it would deal this turn.\n3 — It gains vigilance until end of turn.\n4 — It gains first strike until end of turn.\n5 — It gains flying until end of turn.\n6 — It gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/willing_test_subject.txt b/forge-gui/res/cardsfolder/w/willing_test_subject.txt new file mode 100644 index 00000000000..f7f72c09ae6 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/willing_test_subject.txt @@ -0,0 +1,10 @@ +Name:Willing Test Subject +ManaCost:2 G +Types:Creature Spider Monkey Scientist +PT:2/2 +K:Reach +T:Mode$ RolledDie | Execute$ TrigCounter | ValidPlayer$ You | ValidResult$ GE4 | TriggerDescription$ Whenever you roll a 4 or higher on a die, put a +1/+1 counter on CARDNAME. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +A:AB$ RollDice | Cost$ 6 | SpellDescription$ Roll a six-sided die. +DeckHas:Ability$Counters +Oracle:Reach\nWhenever you roll a 4 or higher on a die, put a +1/+1 counter on Willing Test Subject.\n{6}: Roll a six-sided die. diff --git a/forge-gui/res/cardsfolder/z/zealot_il_vec.txt b/forge-gui/res/cardsfolder/z/zealot_il_vec.txt index 009ebbc71ef..ef1612f6c4f 100644 --- a/forge-gui/res/cardsfolder/z/zealot_il_vec.txt +++ b/forge-gui/res/cardsfolder/z/zealot_il_vec.txt @@ -5,5 +5,5 @@ PT:1/1 K:Shadow T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may have it deal 1 damage to target creature. If you do, prevent all combat damage CARDNAME would deal this turn. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self KW$ Prevent all combat damage that would be dealt by CARDNAME. +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Prevent all combat damage that would be dealt by CARDNAME. Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nWhenever Zealot il-Vec attacks and isn't blocked, you may have it deal 1 damage to target creature. If you do, prevent all combat damage Zealot il-Vec would deal this turn. diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index a67c8c099ce..acbf505ae3a 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -42,6 +42,7 @@ Berserker:Berserkers Bird:Birds Blinkmoth:Blinkmoths Boar:Boars +Brainiac:Brainiacs Bringer:Bringers Brushwagg:Brushwaggs Camarid:Camarids @@ -89,6 +90,7 @@ Elk:Elks Eye:Eyes Faerie:Faeries Ferret:Ferrets +Fighter:Fighters Fish:Fish Flagbearer:Flagbearers Fox:Foxes @@ -209,6 +211,7 @@ Sand:Sands Saproling:Saprolings Satyr:Satyrs Scarecrow:Scarecrows +Scientist:Scientists Scion:Scions Scorpion:Scorpions Scout:Scouts @@ -313,6 +316,7 @@ Davriel Domri Dovin Duck +Dungeon-Master Elspeth Estrid Freyalise diff --git a/forge-gui/res/tokenscripts/b_1_1_skeleton_opp_life.txt b/forge-gui/res/tokenscripts/b_1_1_skeleton_opp_life.txt new file mode 100644 index 00000000000..a47e2ae0ce7 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_1_1_skeleton_opp_life.txt @@ -0,0 +1,8 @@ +Name:Skeleton +ManaCost:no cost +Types:Creature Minion +Colors:black +PT:1/1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, each opponent gains 2 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ Player.Opponent | LifeAmount$ 2 +Oracle:When this creature dies, each opponent gains 2 life. diff --git a/forge-gui/res/tokenscripts/b_2_2_rogue_hexproof.txt b/forge-gui/res/tokenscripts/b_2_2_rogue_hexproof.txt new file mode 100644 index 00000000000..f955c8ab238 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_2_2_rogue_hexproof.txt @@ -0,0 +1,7 @@ +Name:Rogue +ManaCost:no cost +Types:Creature Rogue +Colors:black +PT:2/2 +K:Hexproof +Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/tokenscripts/r_3_3_fighter_first_strike.txt b/forge-gui/res/tokenscripts/r_3_3_fighter_first_strike.txt new file mode 100644 index 00000000000..d63fb7ef4d4 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_3_3_fighter_first_strike.txt @@ -0,0 +1,7 @@ +Name:Fighter +ManaCost:no cost +Types:Creature Fighter +Colors:red +PT:3/3 +K:First Strike +Oracle:First strike diff --git a/forge-gui/res/tokenscripts/r_4_4_giant_chicken.txt b/forge-gui/res/tokenscripts/r_4_4_giant_chicken.txt index d91c58be746..28f4baed396 100644 --- a/forge-gui/res/tokenscripts/r_4_4_giant_chicken.txt +++ b/forge-gui/res/tokenscripts/r_4_4_giant_chicken.txt @@ -1,6 +1,6 @@ Name:Giant Chicken ManaCost:no cost -Types:Creature Giant Chicken +Types:Creature Giant Bird Colors:red PT:4/4 Oracle: \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/u_1_1_wizard_flying.txt b/forge-gui/res/tokenscripts/u_1_1_wizard_flying.txt new file mode 100644 index 00000000000..c20298e7050 --- /dev/null +++ b/forge-gui/res/tokenscripts/u_1_1_wizard_flying.txt @@ -0,0 +1,7 @@ +Name:Wizard +ManaCost:no cost +Types:Creature Wizard +Colors:blue +PT:1/1 +K:Flying +Oracle:Flying \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/w_1_1_cleric_lifelink.txt b/forge-gui/res/tokenscripts/w_1_1_cleric_lifelink.txt new file mode 100644 index 00000000000..fbc824fe060 --- /dev/null +++ b/forge-gui/res/tokenscripts/w_1_1_cleric_lifelink.txt @@ -0,0 +1,7 @@ +Name:Cleric +ManaCost:no cost +Types:Creature Cleric +Colors:white +PT:1/1 +K:Lifelink +Oracle:Lifelink From 4666dec0f8cc5bf52832cbfd3f049f11f9b7d89a Mon Sep 17 00:00:00 2001 From: Adam Pantel <> Date: Tue, 23 Feb 2021 00:26:26 -0500 Subject: [PATCH 2/2] Waste Land --- forge-gui/res/cardsfolder/w/waste_land.txt | 7 +++++++ forge-gui/res/tokenscripts/c_l_wastes.txt | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 forge-gui/res/cardsfolder/w/waste_land.txt create mode 100644 forge-gui/res/tokenscripts/c_l_wastes.txt diff --git a/forge-gui/res/cardsfolder/w/waste_land.txt b/forge-gui/res/cardsfolder/w/waste_land.txt new file mode 100644 index 00000000000..36d5f4d504b --- /dev/null +++ b/forge-gui/res/cardsfolder/w/waste_land.txt @@ -0,0 +1,7 @@ +Name:Waste Land +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target land. | SubAbility$ DBToken | AILogic$ GhostQuarter | AITgts$ Land.nonBasic | SpellDescription$ Destroy target nonbasicland. That land's controller creates a Wastes land token. (It has {T}: Add {C}.) +SVar:DBToken:DB$ Token | TokenScript$ c_l_wastes | TokenOwner$ TargetedController +Oracle:{T}: Add {C}.\n{T}, Sacrifice Waste Land: Destroy target nonbasic land. That land's controller creates a Wastes land token. (It has {T}: Add {C}.) diff --git a/forge-gui/res/tokenscripts/c_l_wastes.txt b/forge-gui/res/tokenscripts/c_l_wastes.txt new file mode 100644 index 00000000000..029f6aa87a8 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_l_wastes.txt @@ -0,0 +1,6 @@ +Name:Wastes +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +DeckHas:Ability$Mana.Colorless +Oracle:{T}: Add {C}.