From abb2ff3cdfdb2e4dbfd3068585255f2765f5495c Mon Sep 17 00:00:00 2001 From: Chris H Date: Wed, 26 Jul 2023 13:07:41 -0400 Subject: [PATCH] Ring tempts you (#3453) * Ring tempts you WIP * add ring triggers * Update RingTemptsYouEffect.java * Add files via upload * Update TriggerRingbearerChosen.java * Update token-images.txt * Update TrackableProperty.java * Update CardView.java * Update CardRenderer.java * Update RingTemptsYouEffect.java fix crash * Update Card.java * Update CardView.java * Update TrackableProperty.java * Update StaticAbilityContinuous.java * Update StaticEffect.java * Update RingTemptsYouEffect.java * update sprite_manaicons.png * Update FSkinProp.java * Update FSkinImage.java * Update CardFaceSymbols.java * Update CardRenderer.java * update trigger * update desktop symbol, add aragorn company leader * update cleanup, add bilbo, add birthday escape * update cleanup * add 3 cards * add five cards * add two cards * update aragorn,update bombadil, add two cards * add ten cards * Update horses_of_the_bruinen.txt * add dunedain rangers + cleanup * Update gollums_bite.txt * update cleanup * add six cards * delete unnecessary file * Update rangers_firebrand.txt * add two cards, add RingTemptedYou playerproperty * update frodo, add three cards * update sauron, samwise, add two cards * Update sauron_the_dark_lord.txt * update validplayer * add six cards * update smeagol * update sauron ransom two piles * add four cards * add three cards * update card scripts * Update war_of_the_last_alliance.txt * update scripts, update ringbearer * update CardDetailUtil * remove unused param * Update affected * remove unnecesary variables * update * update scripts * update RingTemptsYouEffect * fix cantblockby RingTemptsYouEffect.java * The Ring: use numTemptYou for RingLevel * Update dunedain_rangers.txt * Update jaces_defeat.txt * update lord of the nazgul * fix theRing CardView * update ringEffect, update translation * update translation * update gamestate * replace switch with if else * fix effect * update gamestate, translation * update restartgameeffect, remove unneeded clearRingBearer --------- Co-authored-by: Anthony Calosa Co-authored-by: tool4ever Co-authored-by: Hans Mackowiak --- .../src/main/java/forge/ai/GameState.java | 21 + .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../src/main/java/forge/game/GameAction.java | 5 +- .../java/forge/game/ability/AbilityUtils.java | 4 + .../main/java/forge/game/ability/ApiType.java | 2 + .../ability/effects/CountersPutEffect.java | 6 +- .../game/ability/effects/DigUntilEffect.java | 23 +- .../ability/effects/RestartGameEffect.java | 3 + .../ability/effects/RingTemptsYouEffect.java | 60 +++ .../game/ability/effects/TwoPilesEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 13 +- .../java/forge/game/card/CardProperty.java | 4 + .../main/java/forge/game/card/CardView.java | 18 + .../main/java/forge/game/player/Player.java | 104 ++++- .../game/trigger/TriggerRingTemptsYou.java | 42 ++ .../java/forge/game/trigger/TriggerType.java | 367 +++++++++--------- .../forge/trackable/TrackableProperty.java | 2 + .../java/forge/toolbox/CardFaceSymbols.java | 1 + .../java/forge/view/arcane/CardPanel.java | 4 + .../src/forge/assets/FSkinImage.java | 1 + .../src/forge/card/CardFaceSymbols.java | 1 + .../src/forge/card/CardRenderer.java | 13 +- .../cardsfolder/a/aragorn_company_leader.txt | 10 + .../cardsfolder/b/bilbo_retired_burglar.txt | 11 + .../res/cardsfolder/b/birthday_escape.txt | 6 + .../res/cardsfolder/b/bloodhill_bastion.txt | 2 +- .../res/cardsfolder/b/bombadils_song.txt | 7 + .../cardsfolder/b/boon_bringer_valkyrie.txt | 2 +- .../cardsfolder/b/borborygmos_and_fblthp.txt | 2 +- .../b/boromir_warden_of_the_tower.txt | 10 + .../b/breaking_of_the_fellowship.txt | 8 + .../res/cardsfolder/c/call_of_the_ring.txt | 8 + .../res/cardsfolder/c/claim_the_precious.txt | 6 + .../cardsfolder/c/collective_nightmare.txt | 2 +- .../res/cardsfolder/c/copper_host_crusher.txt | 2 +- .../cardsfolder/d/dreadful_as_the_storm.txt | 6 + .../res/cardsfolder/d/dunedain_rangers.txt | 7 + .../e/elrond_lord_of_rivendell.txt | 9 + forge-gui/res/cardsfolder/e/enraged_huorn.txt | 8 + .../cardsfolder/e/exsanguinator_cavalry.txt | 2 +- .../cardsfolder/f/faramir_field_commander.txt | 11 + .../res/cardsfolder/f/fiery_inscription.txt | 9 + .../f/frodo_adventurous_hobbit.txt | 12 + forge-gui/res/cardsfolder/f/frodo_baggins.txt | 8 + .../res/cardsfolder/f/frodo_saurons_bane.txt | 13 + .../cardsfolder/g/galadriel_of_lothlorien.txt | 9 + .../g/gandalf_friend_of_the_shire.txt | 9 + forge-gui/res/cardsfolder/g/glorious_gale.txt | 6 + .../cardsfolder/g/gollum_patient_plotter.txt | 9 + forge-gui/res/cardsfolder/g/gollums_bite.txt | 6 + .../cardsfolder/h/horses_of_the_bruinen.txt | 7 + .../i/in_the_darkness_bind_them.txt | 10 + .../res/cardsfolder/i/inherited_envelope.txt | 7 + forge-gui/res/cardsfolder/j/jaces_defeat.txt | 2 +- .../res/cardsfolder/m/mirrormere_guardian.txt | 7 + forge-gui/res/cardsfolder/n/nazgul.txt | 13 + .../res/cardsfolder/n/netherborn_phalanx.txt | 3 +- .../n/now_for_wrath_now_for_ruin.txt | 9 + .../o/one_ring_to_rule_them_all.txt | 12 + .../res/cardsfolder/r/ramosian_greatsword.txt | 2 +- .../res/cardsfolder/r/rangers_firebrand.txt | 6 + .../res/cardsfolder/r/rangers_of_Ithilien.txt | 10 + .../res/cardsfolder/r/relentless_rohirrim.txt | 7 + forge-gui/res/cardsfolder/r/ringsight.txt | 6 + forge-gui/res/cardsfolder/r/ringwraiths.txt | 10 + .../res/cardsfolder/r/rohirrim_lancer.txt | 8 + .../s/saint_traft_and_rem_karolus.txt | 2 +- .../cardsfolder/s/sams_desperate_rescue.txt | 6 + .../s/samwise_the_stouthearted.txt | 10 + .../s/sauron_lord_of_the_rings.txt | 13 + .../cardsfolder/s/sauron_the_dark_lord.txt | 13 + .../res/cardsfolder/s/saurons_ransom.txt | 8 + forge-gui/res/cardsfolder/s/schema_thief.txt | 2 +- .../res/cardsfolder/s/scroll_of_isildur.txt | 12 + .../cardsfolder/s/shortcut_to_mushrooms.txt | 9 + .../res/cardsfolder/s/slip_on_the_ring.txt | 8 + .../cardsfolder/s/smeagol_helpful_guide.txt | 10 + .../res/cardsfolder/s/soothing_of_smeagol.txt | 6 + .../cardsfolder/s/stalwarts_of_osgiliath.txt | 10 + .../res/cardsfolder/t/the_black_breath.txt | 6 + .../res/cardsfolder/t/the_ring_goes_south.txt | 7 + .../cardsfolder/t/there_and_back_again.txt | 10 + forge-gui/res/cardsfolder/t/took_reaper.txt | 7 + .../res/cardsfolder/u/uruk_hai_berserker.txt | 7 + .../cardsfolder/upcoming/bill_the_pony.txt | 2 +- .../upcoming/lord_of_the_nazgul.txt | 2 +- .../upcoming/saruman_the_white_hand.txt | 2 +- .../upcoming/sting_the_glinting_dagger.txt | 2 +- .../cardsfolder/upcoming/stone_of_erech.txt | 2 +- .../v/vorinclex_the_grand_evolution.txt | 2 +- .../w/war_of_the_last_alliance.txt | 9 + .../res/cardsfolder/w/witchking_of_angmar.txt | 11 + .../cardsfolder/w/wrenn_and_realmbreaker.txt | 2 +- forge-gui/res/languages/de-DE.properties | 2 + forge-gui/res/languages/en-US.properties | 2 + forge-gui/res/languages/es-ES.properties | 8 +- forge-gui/res/languages/fr-FR.properties | 13 +- forge-gui/res/languages/it-IT.properties | 10 +- forge-gui/res/languages/ja-JP.properties | 8 +- forge-gui/res/languages/pt-BR.properties | 8 +- forge-gui/res/languages/zh-CN.properties | 2 + forge-gui/res/lists/token-images.txt | 1 + .../res/skins/default/sprite_manaicons.png | Bin 400309 -> 409464 bytes forge-gui/res/tokenscripts/smaug.txt | 10 + .../java/forge/gui/card/CardDetailUtil.java | 8 + .../forge/localinstance/skin/FSkinProp.java | 1 + 106 files changed, 1038 insertions(+), 231 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerRingTemptsYou.java create mode 100644 forge-gui/res/cardsfolder/a/aragorn_company_leader.txt create mode 100644 forge-gui/res/cardsfolder/b/bilbo_retired_burglar.txt create mode 100644 forge-gui/res/cardsfolder/b/birthday_escape.txt create mode 100644 forge-gui/res/cardsfolder/b/bombadils_song.txt create mode 100644 forge-gui/res/cardsfolder/b/boromir_warden_of_the_tower.txt create mode 100644 forge-gui/res/cardsfolder/b/breaking_of_the_fellowship.txt create mode 100644 forge-gui/res/cardsfolder/c/call_of_the_ring.txt create mode 100644 forge-gui/res/cardsfolder/c/claim_the_precious.txt create mode 100644 forge-gui/res/cardsfolder/d/dreadful_as_the_storm.txt create mode 100644 forge-gui/res/cardsfolder/d/dunedain_rangers.txt create mode 100644 forge-gui/res/cardsfolder/e/elrond_lord_of_rivendell.txt create mode 100644 forge-gui/res/cardsfolder/e/enraged_huorn.txt create mode 100644 forge-gui/res/cardsfolder/f/faramir_field_commander.txt create mode 100644 forge-gui/res/cardsfolder/f/fiery_inscription.txt create mode 100644 forge-gui/res/cardsfolder/f/frodo_adventurous_hobbit.txt create mode 100644 forge-gui/res/cardsfolder/f/frodo_baggins.txt create mode 100644 forge-gui/res/cardsfolder/f/frodo_saurons_bane.txt create mode 100644 forge-gui/res/cardsfolder/g/galadriel_of_lothlorien.txt create mode 100644 forge-gui/res/cardsfolder/g/gandalf_friend_of_the_shire.txt create mode 100644 forge-gui/res/cardsfolder/g/glorious_gale.txt create mode 100644 forge-gui/res/cardsfolder/g/gollum_patient_plotter.txt create mode 100644 forge-gui/res/cardsfolder/g/gollums_bite.txt create mode 100644 forge-gui/res/cardsfolder/h/horses_of_the_bruinen.txt create mode 100644 forge-gui/res/cardsfolder/i/in_the_darkness_bind_them.txt create mode 100644 forge-gui/res/cardsfolder/i/inherited_envelope.txt create mode 100644 forge-gui/res/cardsfolder/m/mirrormere_guardian.txt create mode 100644 forge-gui/res/cardsfolder/n/nazgul.txt create mode 100644 forge-gui/res/cardsfolder/n/now_for_wrath_now_for_ruin.txt create mode 100644 forge-gui/res/cardsfolder/o/one_ring_to_rule_them_all.txt create mode 100644 forge-gui/res/cardsfolder/r/rangers_firebrand.txt create mode 100644 forge-gui/res/cardsfolder/r/rangers_of_Ithilien.txt create mode 100644 forge-gui/res/cardsfolder/r/relentless_rohirrim.txt create mode 100644 forge-gui/res/cardsfolder/r/ringsight.txt create mode 100644 forge-gui/res/cardsfolder/r/ringwraiths.txt create mode 100644 forge-gui/res/cardsfolder/r/rohirrim_lancer.txt create mode 100644 forge-gui/res/cardsfolder/s/sams_desperate_rescue.txt create mode 100644 forge-gui/res/cardsfolder/s/samwise_the_stouthearted.txt create mode 100644 forge-gui/res/cardsfolder/s/sauron_lord_of_the_rings.txt create mode 100644 forge-gui/res/cardsfolder/s/sauron_the_dark_lord.txt create mode 100644 forge-gui/res/cardsfolder/s/saurons_ransom.txt create mode 100644 forge-gui/res/cardsfolder/s/scroll_of_isildur.txt create mode 100644 forge-gui/res/cardsfolder/s/shortcut_to_mushrooms.txt create mode 100644 forge-gui/res/cardsfolder/s/slip_on_the_ring.txt create mode 100644 forge-gui/res/cardsfolder/s/smeagol_helpful_guide.txt create mode 100644 forge-gui/res/cardsfolder/s/soothing_of_smeagol.txt create mode 100644 forge-gui/res/cardsfolder/s/stalwarts_of_osgiliath.txt create mode 100644 forge-gui/res/cardsfolder/t/the_black_breath.txt create mode 100644 forge-gui/res/cardsfolder/t/the_ring_goes_south.txt create mode 100644 forge-gui/res/cardsfolder/t/there_and_back_again.txt create mode 100644 forge-gui/res/cardsfolder/t/took_reaper.txt create mode 100644 forge-gui/res/cardsfolder/u/uruk_hai_berserker.txt create mode 100644 forge-gui/res/cardsfolder/w/war_of_the_last_alliance.txt create mode 100644 forge-gui/res/cardsfolder/w/witchking_of_angmar.txt create mode 100644 forge-gui/res/tokenscripts/smaug.txt diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 2524260873a..c48e7ffd618 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -59,6 +59,7 @@ public abstract class GameState { private String persistentMana = ""; private int landsPlayed = 0; private int landsPlayedLastTurn = 0; + private int numRingTemptedYou = 0; private String precast = null; private String putOnStack = null; private final Map cardTexts = new EnumMap<>(ZoneType.class); @@ -135,6 +136,7 @@ public abstract class GameState { sb.append(TextUtil.concatNoSpace(prefix + "life=", String.valueOf(p.life), "\n")); sb.append(TextUtil.concatNoSpace(prefix + "landsplayed=", String.valueOf(p.landsPlayed), "\n")); sb.append(TextUtil.concatNoSpace(prefix + "landsplayedlastturn=", String.valueOf(p.landsPlayedLastTurn), "\n")); + sb.append(TextUtil.concatNoSpace(prefix + "numringtemptedyou=", String.valueOf(p.numRingTemptedYou), "\n")); if (!p.counters.isEmpty()) { sb.append(TextUtil.concatNoSpace(prefix + "counters=", p.counters, "\n")); } @@ -164,6 +166,7 @@ public abstract class GameState { p.landsPlayedLastTurn = player.getLandsPlayedLastTurn(); p.counters = countersToString(player.getCounters()); p.manaPool = processManaPool(player.getManaPool()); + p.numRingTemptedYou = player.getNumRingTemptedYou(); playerStates.add(p); } @@ -269,6 +272,9 @@ public abstract class GameState { if (c.isCommander()) { newText.append("|IsCommander"); } + if (c.isRingBearer()) { + newText.append("|IsRingBearer"); + } if (cardsReferencedByID.contains(c)) { newText.append("|Id:").append(c.getId()); @@ -518,6 +524,8 @@ public abstract class GameState { getPlayerState(categoryName).landsPlayed = Integer.parseInt(categoryValue); } else if (categoryName.endsWith("landsplayedlastturn")) { getPlayerState(categoryName).landsPlayedLastTurn = Integer.parseInt(categoryValue); + } else if (categoryName.endsWith("numringtemptedyou")) { + getPlayerState(categoryName).numRingTemptedYou = Integer.parseInt(categoryValue); } else if (categoryName.endsWith("play") || categoryName.endsWith("battlefield")) { getPlayerState(categoryName).cardTexts.put(ZoneType.Battlefield, categoryValue); } else if (categoryName.endsWith("hand")) { @@ -1110,6 +1118,7 @@ public abstract class GameState { } p.setCommanders(Lists.newArrayList()); + p.clearTheRing(); Map playerCards = new EnumMap<>(ZoneType.class); for (Entry kv : state.cardTexts.entrySet()) { @@ -1120,6 +1129,7 @@ public abstract class GameState { if (state.life >= 0) p.setLife(state.life, null); p.setLandsPlayedThisTurn(state.landsPlayed); p.setLandsPlayedLastTurn(state.landsPlayedLastTurn); + p.setNumRingTemptedYou(state.numRingTemptedYou); p.clearPaidForSA(); @@ -1175,6 +1185,14 @@ public abstract class GameState { if (!state.counters.isEmpty()) { applyCountersToGameEntity(p, state.counters); } + if (state.numRingTemptedYou > 0) { + //setup all levels + for (int i = 1; i <= state.numRingTemptedYou; i++) { + if (i > 4) + break; + p.setRingLevel(i); + } + } } /** @@ -1300,6 +1318,9 @@ public abstract class GameState { List cmd = Lists.newArrayList(player.getCommanders()); cmd.add(c); player.setCommanders(cmd); + } else if (info.startsWith("IsRingBearer")) { + c.setRingBearer(true); + player.setRingBearer(c); } else if (info.startsWith("Id:")) { int id = Integer.parseInt(info.substring(3)); idToCard.put(id, c); diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index d2c31028e53..729de19c216 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -159,6 +159,7 @@ public enum SpellApiToAi { .put(ApiType.Reveal, RevealAi.class) .put(ApiType.RevealHand, RevealHandAi.class) .put(ApiType.ReverseTurnOrder, AlwaysPlayAi.class) + .put(ApiType.RingTemptsYou, AlwaysPlayAi.class) .put(ApiType.RollDice, RollDiceAi.class) .put(ApiType.RollPlanarDice, RollPlanarDiceAi.class) .put(ApiType.RunChaos, AlwaysPlayAi.class) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 799a5b06142..79cdaa26974 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1012,6 +1012,9 @@ public class GameAction { partner.updateStateForView(); } + // run Game Commands early + c.runChangeControllerCommands(); + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); oldBattlefield.remove(c); @@ -1027,7 +1030,7 @@ public class GameAction { game.getTriggerHandler().runTrigger(TriggerType.ChangesController, runParams, false); game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); - c.runChangeControllerCommands(); + } // Temporarily disable (if mode = true) actively checking static abilities. diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index bf7a69a7b6d..6be693f5c6d 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3501,6 +3501,10 @@ public class AbilityUtils { if (value.equals("DungeonsCompleted")) { return doXMath(player.getCompletedDungeons().size(), m, source, ctb); } + + if (value.equals("RingTemptedYou")) { + return doXMath(player.getNumRingTemptedYou(), m, source, ctb); + } if (value.startsWith("DungeonCompletedNamed")) { String [] full = value.split("_"); String name = full[1]; 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 17c12ada344..439687de466 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -158,6 +158,8 @@ public enum ApiType { Reveal (RevealEffect.class), RevealHand (RevealHandEffect.class), ReverseTurnOrder (ReverseTurnOrderEffect.class), + + RingTemptsYou (RingTemptsYouEffect.class), RollDice (RollDiceEffect.class), RollPlanarDice (RollPlanarDiceEffect.class), RunChaos (RunChaosEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 48f00faa1b4..71cecaa2957 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -587,11 +587,15 @@ public class CountersPutEffect extends SpellAbilityEffect { GameEntityCounterTable table = new GameEntityCounterTable(); if (sa.hasParam("TriggeredCounterMap")) { + Integer counterMapValue = null; + if (sa.hasParam("CounterMapValues")) { + counterMapValue = Integer.valueOf(sa.getParam("CounterMapValues")); + } @SuppressWarnings("unchecked") Map counterMap = (Map) sa .getTriggeringObject(AbilityKey.CounterMap); for (Map.Entry e : counterMap.entrySet()) { - resolvePerType(sa, placer, e.getKey(), e.getValue(), table, false); + resolvePerType(sa, placer, e.getKey(), counterMapValue == null ? e.getValue() : counterMapValue, table, false); } } else if (sa.hasParam("SharedKeywords")) { List keywords = Arrays.asList(sa.getParam("SharedKeywords").split(" & ")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index c1e565a8c10..2220c8a99c2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -20,12 +20,13 @@ import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.Localizer; import forge.util.MyRandom; +import org.apache.commons.lang3.StringUtils; public class DigUntilEffect extends SpellAbilityEffect { /* (non-Javadoc) - * @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) - */ + * @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + */ @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); @@ -33,7 +34,9 @@ public class DigUntilEffect extends SpellAbilityEffect { String desc = sa.getParamOrDefault("ValidDescription", "Card"); int untilAmount = 1; + boolean isNumeric = true; if (sa.hasParam("Amount")) { + isNumeric = StringUtils.isNumeric(sa.getParam("Amount")); untilAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa); } @@ -42,7 +45,8 @@ public class DigUntilEffect extends SpellAbilityEffect { final ZoneType revealed = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); sb.append(ZoneType.Exile.equals(revealed) ? "exiles cards from their library until they exile " : "reveals cards from their library until revealing "); - sb.append(Lang.nounWithNumeralExceptOne(untilAmount, desc + " card")); + String noun = "Card".equals(desc) ? " card" : desc + " card"; + sb.append(isNumeric ? Lang.nounWithNumeralExceptOne(untilAmount, noun) : "X " + noun); if (untilAmount != 1) { sb.append("s"); } @@ -57,19 +61,30 @@ public class DigUntilEffect extends SpellAbilityEffect { final ZoneType found = ZoneType.smartValueOf(sa.getParam("FoundDestination")); if (found != null) { - sb.append(untilAmount > 1 ? "those cards" : "that card"); + sb.append(untilAmount > 1 || !isNumeric ? "those cards" : "that card"); sb.append(" "); if (ZoneType.Hand.equals(found)) { sb.append("into their hand "); } + if (ZoneType.Battlefield.equals(found)) { + sb.append("onto the battlefield "); + if (sa.hasParam("Tapped")) + sb.append("tapped "); + } + if (ZoneType.Graveyard.equals(revealed)) { sb.append("and all other cards into their graveyard."); } if (ZoneType.Exile.equals(revealed)) { sb.append("and exile all other cards revealed this way."); } + if (ZoneType.Library.equals(revealed)) { + int revealedLibPos = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("RevealedLibraryPosition"), sa); + sb.append("and the rest on ").append(revealedLibPos < 0 ? "the bottom " : "on top "); + sb.append("of their library").append(sa.hasParam("RevealRandomOrder") ? " in a random order." : "."); + } } else if (revealed != null) { if (ZoneType.Hand.equals(revealed)) { sb.append("all cards revealed this way into their hand"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index f12e5f6a82a..4d6efae1e97 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -70,6 +70,9 @@ public class RestartGameEffect extends SpellAbilityEffect { p.setLifeLostLastTurn(0); p.resetCommanderStats(); p.resetCompletedDungeons(); + p.resetRingTemptedYou(); + p.clearRingBearer(); + p.clearTheRing(); p.setBlessing(false); p.clearController(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java new file mode 100644 index 00000000000..cbff03b400c --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java @@ -0,0 +1,60 @@ +package forge.game.ability.effects; + +import forge.GameCommand; +import forge.game.Game; +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.util.Localizer; + +import java.util.Map; + +public class RingTemptsYouEffect extends EffectEffect { + + @Override + protected String getStackDescription(SpellAbility sa) { + return Localizer.getInstance().getMessage("lblTheRingTempts", sa.getActivatingPlayer()); + } + + @Override + public void resolve(SpellAbility sa) { + Player p = sa.getActivatingPlayer(); + Game game = p.getGame(); + Card card = sa.getHostCard(); + + if (p.getTheRing() == null) + p.createTheRing(card); + + //increment ring tempted you for property + p.incrementRingTemptedYou(); + p.setRingLevel(p.getNumRingTemptedYou()); + + // Then choose a ring-bearer (You may keep the same one). Auto pick if <2 choices. + CardCollection creatures = p.getCreaturesInPlay(); + Card ringBearer = p.getController().chooseSingleEntityForEffect(creatures, sa, Localizer.getInstance().getMessageorUseDefault("lblChooseRingBearer", "Choose your Ring-bearer"), false, null); + p.setRingBearer(ringBearer); + + // 701.52a That creature becomes your Ring-bearer until another player gains control of it. + if (ringBearer != null) { + GameCommand loseCommand = new GameCommand() { + private static final long serialVersionUID = 1L; + @Override + public void run() { + if (ringBearer.isRingBearer()) { + p.clearRingBearer(); + } + } + }; + ringBearer.addChangeControllerCommand(loseCommand); + ringBearer.addLeavesPlayCommand(loseCommand); + } + + // Run triggers + final Map runParams = AbilityKey.mapFromPlayer(p); + runParams.put(AbilityKey.Card, ringBearer); + game.getTriggerHandler().runTrigger(TriggerType.RingTemptsYou, runParams, false); + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 085498ca580..b7b558cba2c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -30,7 +30,7 @@ public class TwoPilesEffect extends SpellAbilityEffect { sb.append("Separate all ").append(valid).append(" cards "); sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); - sb.append("controls into two piles."); + sb.append(" controls into two piles."); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 976bd9d0592..8cc94cbff18 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -209,7 +209,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private boolean copiedSpell = false; private boolean unearthed; - + private boolean ringbearer; private boolean monstrous; private boolean renowned; @@ -225,7 +225,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private int timesCrewedThisTurn = 0; private int classLevel = 1; - private long bestowTimestamp = -1; private long transformedTimestamp = 0; private long mutatedTimestamp = -1; @@ -6032,6 +6031,16 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public boolean wasDiscarded() { return discarded; } public void setDiscarded(boolean state) { discarded = state; } + public final boolean isRingBearer() { + return ringbearer; + } + public final void setRingBearer(final boolean ringbearer0) { + ringbearer = ringbearer0; + view.updateRingBearer(this); + } + public final void clearRingBearer() { + setRingBearer(false); + } public final boolean isMonstrous() { return monstrous; } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 6f99a4ba06f..8842fb5b037 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -167,6 +167,10 @@ public class CardProperty { if (!card.isAdventureCard()) { return false; } + } else if (property.equals("IsRingbearer")) { + if (!card.isRingBearer()) { + return false; + } } else if (property.equals("IsTriggerRemembered")) { boolean found = false; for (Object o : spellAbility.getTriggerRemembered()) { diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 0729f6de972..56cf2f352cb 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -466,6 +466,15 @@ public class CardView extends GameEntityView { set(TrackableProperty.ClassLevel, c.getClassLevel()); } + public int getRingLevel() { + return get(TrackableProperty.RingLevel); + } + void updateRingLevel(Card c) { + Player p = c.getController(); + if (p != null && p.getTheRing() == c) + set(TrackableProperty.RingLevel, p.getNumRingTemptedYou()); + } + private String getRemembered() { return get(TrackableProperty.Remembered); } @@ -925,6 +934,7 @@ public class CardView extends GameEntityView { updateZoneText(c); updateDamage(c); updateSpecialize(c); + updateRingLevel(c); if (c.getIntensity(false) > 0) { updateIntensity(c); @@ -1064,6 +1074,14 @@ public class CardView extends GameEntityView { set(TrackableProperty.BlockAny, c.canBlockAny()); } + public boolean isRingBearer() { + return get(TrackableProperty.IsRingBearer); + } + + void updateRingBearer(Card c) { + set(TrackableProperty.IsRingBearer, c.isRingBearer()); + } + Set getCantHaveKeyword() { return get(TrackableProperty.CantHaveKeyword); } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 364a0ab174b..1f976461df5 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -34,6 +34,7 @@ import java.util.Set; import java.util.SortedSet; import forge.game.event.*; +import forge.game.spellability.AbilitySub; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -166,12 +167,14 @@ public class Player extends GameEntity implements Comparable { private int startingHandSize = 7; private boolean unlimitedHandSize = false; private Card lastDrawnCard; + private Card ringBearer, theRing; private String namedCard = ""; private String namedCard2 = ""; private int simultaneousDamage = 0; private int lastTurnNr = 0; + private int numRingTemptedYou = 0; private final Map> notes = Maps.newHashMap(); private final Map notedNum = Maps.newHashMap(); @@ -1829,7 +1832,28 @@ public class Player extends GameEntity implements Comparable { lastDrawnCard = c; return lastDrawnCard; } - + public final Card getRingBearer() { + return ringBearer; + } + public final Card getTheRing() { + return theRing; + } + public final void clearTheRing() { + theRing = null; + } + public final void setRingBearer(Card bearer) { + if (bearer == null) + return; + clearRingBearer(); + ringBearer = bearer; + ringBearer.setRingBearer(true); + } + public void clearRingBearer() { + if (ringBearer == null) + return; + ringBearer.setRingBearer(false); + ringBearer = null; + } public final String getNamedCard() { return namedCard; } @@ -1927,6 +1951,19 @@ public class Player extends GameEntity implements Comparable { completedDungeons.clear(); } + public final int getNumRingTemptedYou() { + return numRingTemptedYou; + } + public final void incrementRingTemptedYou() { + numRingTemptedYou++; + } + public final void setNumRingTemptedYou(int value) { + numRingTemptedYou = value; + } + public final void resetRingTemptedYou() { + numRingTemptedYou = 0; + } + public final List getPlaneswalkedToThisTurn() { return planeswalkedToThisTurn; } @@ -3116,7 +3153,72 @@ public class Player extends GameEntity implements Comparable { eff.addStaticAbility(mayBePlayedAbility); return eff; } + public void createTheRing(Card host) { + final PlayerZone com = getZone(ZoneType.Command); + if (theRing == null) { + theRing = new Card(game.nextCardId(), null, game); + theRing.setOwner(this); + theRing.setImmutable(true); + String image = ImageKeys.getTokenKey("the_ring"); + if (host != null) { + theRing.setImageKey("t:the_ring_" + host.getSetCode().toLowerCase()); + theRing.setSetCode(host.getSetCode()); + } else { + theRing.setImageKey(image); + } + theRing.setName("The Ring"); + theRing.updateStateForView(); + com.add(theRing); + this.updateZoneForView(com); + } + } + public void setRingLevel(int level) { + if (getTheRing() == null) + createTheRing(null); + if (level == 1) { + String legendary = "Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouCtrl+IsRingbearer | AddType$ Legendary | Description$ Your Ring-bearer is legendary."; + String cantBeBlocked = "Mode$ CantBlockBy | EffectZone$ Command | ValidAttacker$ Card.YouCtrl+IsRingbearer | ValidBlockerRelative$ Creature.powerGTX | Description$ Your Ring-bearer can't be blocked by creatures with greater power."; + getTheRing().addStaticAbility(legendary); + StaticAbility st = getTheRing().addStaticAbility(cantBeBlocked); + st.setSVar("X", "Count$CardPower"); + } else if (level == 2) { + final String attackTrig = "Mode$ Attacks | ValidCard$ Card.YouCtrl+IsRingbearer | TriggerDescription$ Whenever your ring-bearer attacks, draw a card, then discard a card. | TriggerZones$ Command"; + final String drawEffect = "DB$ Draw | Defined$ You | NumCards$ 1"; + final String discardEffect = "DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose"; + final Trigger attackTrigger = TriggerHandler.parseTrigger(attackTrig, getTheRing(), true); + + SpellAbility drawExecute = AbilityFactory.getAbility(drawEffect, getTheRing()); + AbilitySub discardExecute = (AbilitySub) AbilityFactory.getAbility(discardEffect, getTheRing()); + + drawExecute.setSubAbility(discardExecute); + attackTrigger.setOverridingAbility(drawExecute); + getTheRing().addTrigger(attackTrigger); + } else if (level == 3) { + final String becomesBlockedTrig = "Mode$ AttackerBlockedByCreature | ValidCard$ Card.YouCtrl+IsRingbearer| ValidBlocker$ Creature | TriggerZones$ Command | TriggerDescription$ Whenever your Ring-bearer becomes blocked a creature, that creature's controller sacrifices it at the end of combat."; + final String endOfCombatTrig = "DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | RememberObjects$ TriggeredBlockerLKICopy | TriggerDescription$ At end of combat, the controller of the creature that blocked CARDNAME sacrifices that creature."; + final String sacBlockerEffect = "DB$ Destroy | Defined$ DelayTriggerRememberedLKI | Sacrifice$ True"; + + final Trigger becomesBlockedTrigger = TriggerHandler.parseTrigger(becomesBlockedTrig, getTheRing(), true); + + SpellAbility endCombatExecute = AbilityFactory.getAbility(endOfCombatTrig, getTheRing()); + AbilitySub sacExecute = (AbilitySub) AbilityFactory.getAbility(sacBlockerEffect, getTheRing()); + + endCombatExecute.setAdditionalAbility("Execute", sacExecute); + becomesBlockedTrigger.setOverridingAbility(endCombatExecute); + getTheRing().addTrigger(becomesBlockedTrigger); + } else if (level == 4) { + final String damageTrig = "Mode$ DamageDone | ValidSource$ Card.YouCtrl+IsRingbearer | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Command | TriggerDescription$ Whenever your Ring-bearer deals combat damage to a player, each opponent loses 3 life."; + final String loseEffect = "DB$ LoseLife | Defined$ Opponent | LifeAmount$ 3"; + + final Trigger damageTrigger = TriggerHandler.parseTrigger(damageTrig, getTheRing(), true); + SpellAbility loseExecute = AbilityFactory.getAbility(loseEffect, getTheRing()); + + damageTrigger.setOverridingAbility(loseExecute); + getTheRing().addTrigger(damageTrigger); + } + getTheRing().updateStateForView(); + } public void changeOwnership(Card card) { // If lost then gained, just clear out of lost. // If gained then lost, just clear out of gained. diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRingTemptsYou.java b/forge-game/src/main/java/forge/game/trigger/TriggerRingTemptsYou.java new file mode 100644 index 00000000000..ee0f8beb74f --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRingTemptsYou.java @@ -0,0 +1,42 @@ +package forge.game.trigger; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; +import forge.util.Localizer; + +import java.util.Map; + +public class TriggerRingTemptsYou extends Trigger { + + public TriggerRingTemptsYou(Map params, Card host, boolean intrinsic) { + super(params, host, intrinsic); + } + + @Override + public boolean performTest(Map runParams) { + + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { + sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player, AbilityKey.Card); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append(Localizer.getInstance().getMessage("lblPlayer")).append(": "); + sb.append(sa.getTriggeringObject(AbilityKey.Player)).append(", "); + return sb.toString(); + } +} 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 90b6f1f21e6..6723f597b35 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -1,183 +1,184 @@ -package forge.game.trigger; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -import forge.game.card.Card; - - -/** - * TODO: Write javadoc for this type. - * - */ -public enum TriggerType { - Abandoned(TriggerAbandoned.class), - AbilityCast(TriggerSpellAbilityCastOrCopy.class), - AbilityResolves(TriggerAbilityResolves.class), - AbilityTriggered(TriggerAbilityTriggered.class), - Adapt(TriggerAdapt.class), - Always(TriggerAlways.class), - Attached(TriggerAttached.class), - AttackerBlocked(TriggerAttackerBlocked.class), - AttackerBlockedOnce(TriggerAttackerBlockedOnce.class), - AttackerBlockedByCreature(TriggerAttackerBlockedByCreature.class), - AttackersDeclared(TriggerAttackersDeclared.class), - AttackersDeclaredOneTarget(TriggerAttackersDeclared.class), - AttackerUnblocked(TriggerAttackerUnblocked.class), - AttackerUnblockedOnce(TriggerAttackerUnblockedOnce.class), - Attacks(TriggerAttacks.class), - BecomeMonarch(TriggerBecomeMonarch.class), - BecomeMonstrous(TriggerBecomeMonstrous.class), - BecomeRenowned(TriggerBecomeRenowned.class), - BecomesCrewed(TriggerBecomesCrewed.class), - BecomesTarget(TriggerBecomesTarget.class), - BecomesTargetOnce(TriggerBecomesTargetOnce.class), - BlockersDeclared(TriggerBlockersDeclared.class), - Blocks(TriggerBlocks.class), - Championed(TriggerChampioned.class), - ChangesController(TriggerChangesController.class), - ChangesZone(TriggerChangesZone.class), - ChangesZoneAll(TriggerChangesZoneAll.class), - ChaosEnsues(TriggerChaosEnsues.class), - Clashed(TriggerClashed.class), - ClassLevelGained(TriggerClassLevelGained.class), - ConjureAll(TriggerConjureAll.class), - CounterAdded(TriggerCounterAdded.class), - CounterAddedOnce(TriggerCounterAddedOnce.class), - CounterPlayerAddedAll(TriggerCounterPlayerAddedAll.class), - CounterAddedAll(TriggerCounterAddedAll.class), - Countered(TriggerCountered.class), - CounterRemoved(TriggerCounterRemoved.class), - CounterRemovedOnce(TriggerCounterRemovedOnce.class), - Crewed(TriggerCrewed.class), - Cycled(TriggerCycled.class), - DamageAll(TriggerDamageAll.class), - DamageDealtOnce(TriggerDamageDealtOnce.class), - DamageDone(TriggerDamageDone.class), - DamageDoneOnce(TriggerDamageDoneOnce.class), - DamageDoneOnceByController(TriggerDamageDoneOnceByController.class), - DamagePrevented(TriggerDamagePrevented.class), - DamagePreventedOnce(TriggerDamagePreventedOnce.class), - DayTimeChanges (TriggerDayTimeChanges.class), - Destroyed(TriggerDestroyed.class), - Devoured(TriggerDevoured.class), - Discarded(TriggerDiscarded.class), - DiscardedAll(TriggerDiscardedAll.class), - Drawn(TriggerDrawn.class), - DungeonCompleted(TriggerCompletedDungeon.class), - Evolved(TriggerEvolved.class), - ExcessDamage(TriggerExcessDamage.class), - Enlisted(TriggerEnlisted.class), - Exerted(TriggerExerted.class), - Exiled(TriggerExiled.class), - Exploited(TriggerExploited.class), - Explores(TriggerExplores.class), - Fight(TriggerFight.class), - FightOnce(TriggerFightOnce.class), - FlippedCoin(TriggerFlippedCoin.class), - Foretell(TriggerForetell.class), - Immediate(TriggerImmediate.class), - Investigated(TriggerInvestigated.class), - IsForetold(TriggerIsForetold.class), - LandPlayed(TriggerLandPlayed.class), - LifeGained(TriggerLifeGained.class), - LifeLost(TriggerLifeLost.class), - LifeLostAll(TriggerLifeLostAll.class), - LosesGame(TriggerLosesGame.class), - ManaAdded(TriggerManaAdded.class), - MilledAll(TriggerMilledAll.class), - Mutates(TriggerMutates.class), - NewGame(TriggerNewGame.class), - PayCumulativeUpkeep(TriggerPayCumulativeUpkeep.class), - PayEcho(TriggerPayEcho.class), - PayLife(TriggerPayLife.class), - Phase(TriggerPhase.class), - PhaseIn(TriggerPhaseIn.class), - PhaseOut(TriggerPhaseOut.class), - PlanarDice(TriggerPlanarDice.class), - PlaneswalkedFrom(TriggerPlaneswalkedFrom.class), - PlaneswalkedTo(TriggerPlaneswalkedTo.class), - Proliferate(TriggerProliferate.class), - Regenerated(TriggerRegenerated.class), - Revealed(TriggerRevealed.class), - RolledDie(TriggerRolledDie.class), - RolledDieOnce(TriggerRolledDieOnce.class), - RoomEntered(TriggerEnteredRoom.class), - Sacrificed(TriggerSacrificed.class), - Scry(TriggerScry.class), - SearchedLibrary(TriggerSearchedLibrary.class), - SeekAll(TriggerSeekAll.class), - SetInMotion(TriggerSetInMotion.class), - Shuffled(TriggerShuffled.class), - Specializes(TriggerSpecializes.class), - SpellAbilityCast(TriggerSpellAbilityCastOrCopy.class), - SpellAbilityCopy(TriggerSpellAbilityCastOrCopy.class), - SpellCast(TriggerSpellAbilityCastOrCopy.class), - SpellCastOrCopy(TriggerSpellAbilityCastOrCopy.class), - SpellCopy(TriggerSpellAbilityCastOrCopy.class), - Surveil(TriggerSurveil.class), - TakesInitiative(TriggerTakesInitiative.class), - Taps(TriggerTaps.class), - TapsForMana(TriggerTapsForMana.class), - TokenCreated(TriggerTokenCreated.class), - TokenCreatedOnce(TriggerTokenCreatedOnce.class), - Trains(TriggerTrains.class), - Transformed(TriggerTransformed.class), - TurnBegin(TriggerTurnBegin.class), - TurnFaceUp(TriggerTurnFaceUp.class), - Unattach(TriggerUnattach.class), - Untaps(TriggerUntaps.class), - Vote(TriggerVote.class); - - private final Constructor constructor; - - TriggerType(Class clasz) { - constructor = findConstructor(clasz); - } - - private static Constructor findConstructor(Class clasz) { - @SuppressWarnings("unchecked") - Constructor[] cc = (Constructor[]) clasz.getDeclaredConstructors(); - for (Constructor c : cc) { - Class[] pp = c.getParameterTypes(); - if (pp[0].isAssignableFrom(Map.class)) { - return c; - } - } - throw new RuntimeException("No constructor found that would take Map as 1st parameter in class " + clasz.getName()); - } - - /** - * TODO: Write javadoc for this method. - * @param value - * @return - */ - public static TriggerType smartValueOf(String value) { - final String valToCompate = value.trim(); - for (final TriggerType v : TriggerType.values()) { - if (v.name().compareToIgnoreCase(valToCompate) == 0) { - return v; - } - } - - throw new RuntimeException("Element " + value + " not found in TriggerType enum"); - } - - /** - * TODO: Write javadoc for this method. - * @param mapParams - * @param host - * @param intrinsic - * @return - */ - public Trigger createTrigger(Map mapParams, Card host, boolean intrinsic) { - try { - Trigger res = constructor.newInstance(mapParams, host, intrinsic); - res.setMode(this); - return res; - } catch (IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } -} +package forge.game.trigger; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +import forge.game.card.Card; + + +/** + * TODO: Write javadoc for this type. + * + */ +public enum TriggerType { + Abandoned(TriggerAbandoned.class), + AbilityCast(TriggerSpellAbilityCastOrCopy.class), + AbilityResolves(TriggerAbilityResolves.class), + AbilityTriggered(TriggerAbilityTriggered.class), + Adapt(TriggerAdapt.class), + Always(TriggerAlways.class), + Attached(TriggerAttached.class), + AttackerBlocked(TriggerAttackerBlocked.class), + AttackerBlockedOnce(TriggerAttackerBlockedOnce.class), + AttackerBlockedByCreature(TriggerAttackerBlockedByCreature.class), + AttackersDeclared(TriggerAttackersDeclared.class), + AttackersDeclaredOneTarget(TriggerAttackersDeclared.class), + AttackerUnblocked(TriggerAttackerUnblocked.class), + AttackerUnblockedOnce(TriggerAttackerUnblockedOnce.class), + Attacks(TriggerAttacks.class), + BecomeMonarch(TriggerBecomeMonarch.class), + BecomeMonstrous(TriggerBecomeMonstrous.class), + BecomeRenowned(TriggerBecomeRenowned.class), + BecomesCrewed(TriggerBecomesCrewed.class), + BecomesTarget(TriggerBecomesTarget.class), + BecomesTargetOnce(TriggerBecomesTargetOnce.class), + BlockersDeclared(TriggerBlockersDeclared.class), + Blocks(TriggerBlocks.class), + Championed(TriggerChampioned.class), + ChangesController(TriggerChangesController.class), + ChangesZone(TriggerChangesZone.class), + ChangesZoneAll(TriggerChangesZoneAll.class), + ChaosEnsues(TriggerChaosEnsues.class), + Clashed(TriggerClashed.class), + ClassLevelGained(TriggerClassLevelGained.class), + ConjureAll(TriggerConjureAll.class), + CounterAdded(TriggerCounterAdded.class), + CounterAddedOnce(TriggerCounterAddedOnce.class), + CounterPlayerAddedAll(TriggerCounterPlayerAddedAll.class), + CounterAddedAll(TriggerCounterAddedAll.class), + Countered(TriggerCountered.class), + CounterRemoved(TriggerCounterRemoved.class), + CounterRemovedOnce(TriggerCounterRemovedOnce.class), + Crewed(TriggerCrewed.class), + Cycled(TriggerCycled.class), + DamageAll(TriggerDamageAll.class), + DamageDealtOnce(TriggerDamageDealtOnce.class), + DamageDone(TriggerDamageDone.class), + DamageDoneOnce(TriggerDamageDoneOnce.class), + DamageDoneOnceByController(TriggerDamageDoneOnceByController.class), + DamagePrevented(TriggerDamagePrevented.class), + DamagePreventedOnce(TriggerDamagePreventedOnce.class), + DayTimeChanges (TriggerDayTimeChanges.class), + Destroyed(TriggerDestroyed.class), + Devoured(TriggerDevoured.class), + Discarded(TriggerDiscarded.class), + DiscardedAll(TriggerDiscardedAll.class), + Drawn(TriggerDrawn.class), + DungeonCompleted(TriggerCompletedDungeon.class), + Evolved(TriggerEvolved.class), + ExcessDamage(TriggerExcessDamage.class), + Enlisted(TriggerEnlisted.class), + Exerted(TriggerExerted.class), + Exiled(TriggerExiled.class), + Exploited(TriggerExploited.class), + Explores(TriggerExplores.class), + Fight(TriggerFight.class), + FightOnce(TriggerFightOnce.class), + FlippedCoin(TriggerFlippedCoin.class), + Foretell(TriggerForetell.class), + Immediate(TriggerImmediate.class), + Investigated(TriggerInvestigated.class), + IsForetold(TriggerIsForetold.class), + LandPlayed(TriggerLandPlayed.class), + LifeGained(TriggerLifeGained.class), + LifeLost(TriggerLifeLost.class), + LifeLostAll(TriggerLifeLostAll.class), + LosesGame(TriggerLosesGame.class), + ManaAdded(TriggerManaAdded.class), + MilledAll(TriggerMilledAll.class), + Mutates(TriggerMutates.class), + NewGame(TriggerNewGame.class), + PayCumulativeUpkeep(TriggerPayCumulativeUpkeep.class), + PayEcho(TriggerPayEcho.class), + PayLife(TriggerPayLife.class), + Phase(TriggerPhase.class), + PhaseIn(TriggerPhaseIn.class), + PhaseOut(TriggerPhaseOut.class), + PlanarDice(TriggerPlanarDice.class), + PlaneswalkedFrom(TriggerPlaneswalkedFrom.class), + PlaneswalkedTo(TriggerPlaneswalkedTo.class), + Proliferate(TriggerProliferate.class), + Regenerated(TriggerRegenerated.class), + Revealed(TriggerRevealed.class), + RingTemptsYou(TriggerRingTemptsYou.class), + RolledDie(TriggerRolledDie.class), + RolledDieOnce(TriggerRolledDieOnce.class), + RoomEntered(TriggerEnteredRoom.class), + Sacrificed(TriggerSacrificed.class), + Scry(TriggerScry.class), + SearchedLibrary(TriggerSearchedLibrary.class), + SeekAll(TriggerSeekAll.class), + SetInMotion(TriggerSetInMotion.class), + Shuffled(TriggerShuffled.class), + Specializes(TriggerSpecializes.class), + SpellAbilityCast(TriggerSpellAbilityCastOrCopy.class), + SpellAbilityCopy(TriggerSpellAbilityCastOrCopy.class), + SpellCast(TriggerSpellAbilityCastOrCopy.class), + SpellCastOrCopy(TriggerSpellAbilityCastOrCopy.class), + SpellCopy(TriggerSpellAbilityCastOrCopy.class), + Surveil(TriggerSurveil.class), + TakesInitiative(TriggerTakesInitiative.class), + Taps(TriggerTaps.class), + TapsForMana(TriggerTapsForMana.class), + TokenCreated(TriggerTokenCreated.class), + TokenCreatedOnce(TriggerTokenCreatedOnce.class), + Trains(TriggerTrains.class), + Transformed(TriggerTransformed.class), + TurnBegin(TriggerTurnBegin.class), + TurnFaceUp(TriggerTurnFaceUp.class), + Unattach(TriggerUnattach.class), + Untaps(TriggerUntaps.class), + Vote(TriggerVote.class); + + private final Constructor constructor; + + TriggerType(Class clasz) { + constructor = findConstructor(clasz); + } + + private static Constructor findConstructor(Class clasz) { + @SuppressWarnings("unchecked") + Constructor[] cc = (Constructor[]) clasz.getDeclaredConstructors(); + for (Constructor c : cc) { + Class[] pp = c.getParameterTypes(); + if (pp[0].isAssignableFrom(Map.class)) { + return c; + } + } + throw new RuntimeException("No constructor found that would take Map as 1st parameter in class " + clasz.getName()); + } + + /** + * TODO: Write javadoc for this method. + * @param value + * @return + */ + public static TriggerType smartValueOf(String value) { + final String valToCompate = value.trim(); + for (final TriggerType v : TriggerType.values()) { + if (v.name().compareToIgnoreCase(valToCompate) == 0) { + return v; + } + } + + throw new RuntimeException("Element " + value + " not found in TriggerType enum"); + } + + /** + * TODO: Write javadoc for this method. + * @param mapParams + * @param host + * @param intrinsic + * @return + */ + public Trigger createTrigger(Map mapParams, Card host, boolean intrinsic) { + try { + Trigger res = constructor.newInstance(mapParams, host, intrinsic); + res.setMode(this); + return res; + } catch (IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } +} diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 452d4d6b25b..c573634a63b 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -55,6 +55,7 @@ public enum TrackableProperty { Token(TrackableTypes.BooleanType), TokenCard(TrackableTypes.BooleanType), IsCommander(TrackableTypes.BooleanType), + IsRingBearer(TrackableTypes.BooleanType), CommanderAltType(TrackableTypes.StringType), Damage(TrackableTypes.IntegerType), AssignedDamage(TrackableTypes.IntegerType), @@ -74,6 +75,7 @@ public enum TrackableProperty { ChosenSector(TrackableTypes.StringType), Sector(TrackableTypes.StringType), ClassLevel(TrackableTypes.IntegerType), + RingLevel(TrackableTypes.IntegerType), CurrentRoom(TrackableTypes.StringType), Intensity(TrackableTypes.IntegerType), Remembered(TrackableTypes.StringType), diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java index 50247ffceb3..62fc5c66fcc 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java @@ -152,6 +152,7 @@ public class CardFaceSymbols { //ability icons MANA_IMAGES.put("commander", FSkin.getImage(FSkinProp.IMG_ABILITY_COMMANDER)); + MANA_IMAGES.put("ringbearer", FSkin.getImage(FSkinProp.IMG_ABILITY_RINGBEARER)); MANA_IMAGES.put("toxic", FSkin.getImage(FSkinProp.IMG_ABILITY_TOXIC)); MANA_IMAGES.put("deathtouch", FSkin.getImage(FSkinProp.IMG_ABILITY_DEATHTOUCH)); MANA_IMAGES.put("defender", FSkin.getImage(FSkinProp.IMG_ABILITY_DEFENDER)); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 5e8b770ce38..b5899e44317 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -555,6 +555,10 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl CardFaceSymbols.drawAbilitySymbol("commander", g, abiX, abiY, abiScale, abiScale); abiY += abiSpace; } + if (card.isRingBearer()) { + CardFaceSymbols.drawAbilitySymbol("ringbearer", g, abiX, abiY, abiScale, abiScale); + abiY += abiSpace; + } if (card.getCurrentState().hasFlying()) { CardFaceSymbols.drawAbilitySymbol("flying", g, abiX, abiY, abiScale, abiScale); abiY += abiSpace; diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index d6e8916280e..d0adce5553d 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -420,6 +420,7 @@ public enum FSkinImage implements FImage { //COMMANDER IMG_ABILITY_COMMANDER (FSkinProp.IMG_ABILITY_COMMANDER, SourceFile.ABILITIES), + IMG_ABILITY_RINGBEARER (FSkinProp.IMG_ABILITY_RINGBEARER, SourceFile.MANAICONS), //TOXIC IMG_ABILITY_TOXIC (FSkinProp.IMG_ABILITY_TOXIC, SourceFile.ICONS), diff --git a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java index 8c31f792614..7578ce5df58 100644 --- a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java +++ b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java @@ -129,6 +129,7 @@ public class CardFaceSymbols { Forge.getAssets().manaImages().put("foil20", FSkinImage.FOIL_20); Forge.getAssets().manaImages().put("commander", FSkinImage.IMG_ABILITY_COMMANDER); + Forge.getAssets().manaImages().put("ringbearer", FSkinImage.IMG_ABILITY_RINGBEARER); Forge.getAssets().manaImages().put("toxic", FSkinImage.IMG_ABILITY_TOXIC); Forge.getAssets().manaImages().put("deathtouch", FSkinImage.IMG_ABILITY_DEATHTOUCH); Forge.getAssets().manaImages().put("defender", FSkinImage.IMG_ABILITY_DEFENDER); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 37c4c0087b3..e05025c3009 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -756,7 +756,13 @@ public class CardRenderer { //Class level if (card.getCurrentState().getType().hasStringType("Class") && ZoneType.Battlefield.equals(card.getZone())) { List markers = new ArrayList<>(); - markers.add("LV:" + card.getClassLevel()); + markers.add("CL:" + card.getClassLevel()); + drawMarkersTabs(markers, g, x, y - markersHeight, w, h, true); + } + //Ring level + if (card.getRingLevel() > 0) { + List markers = new ArrayList<>(); + markers.add("RL:" + card.getRingLevel()); drawMarkersTabs(markers, g, x, y - markersHeight, w, h, true); } @@ -872,6 +878,11 @@ public class CardRenderer { abiY += abiSpace; abiCount += 1; } + if (card.isRingBearer()) { + CardFaceSymbols.drawSymbol("ringbearer", g, abiX, abiY, abiScale, abiScale); + abiY += abiSpace; + abiCount += 1; + } if (card.getCurrentState().hasFlying()) { CardFaceSymbols.drawSymbol("flying", g, abiX, abiY, abiScale, abiScale); abiY += abiSpace; diff --git a/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt b/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt new file mode 100644 index 00000000000..654c0501d0c --- /dev/null +++ b/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt @@ -0,0 +1,10 @@ +Name:Aragorn, Company Leader +ManaCost:1 G U +Types:Legendary Creature Human Ranger +PT:3/3 +T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigPutCounters | TriggerDescription$ Whenever the Ring tempts you, if you chose a creature other than CARDNAME as your Ring-bearer, put your choice of a counter from among first strike, vigilance, deathtouch, and lifelink on NICKNAME. +SVar:TrigPutCounters:DB$ PutCounter | CounterType$ First Strike,Vigilance,Deathtouch,Lifelink | Defined$ Self +T:Mode$ CounterPlayerAddedAll | ValidObject$ Card.Self+inRealZoneBattlefield | TriggerZones$ Battlefield | ValidSource$ You | Execute$ TrigPutCountersOther | TriggerDescription$ Whenever you put one or more counters on NICKNAME, put one of each of those kinds of counters on up to one other target creature. +SVar:TrigPutCountersOther:DB$ PutCounter | Placer$ TriggeredSource | TriggeredCounterMap$ True | CounterMapValues$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target other creature | ValidTgts$ Creature.Other +DeckHas:Ability$Counters +Oracle:Whenever the Ring tempts you, if you chose a creature other than Aragorn, Company Leader as your Ring-bearer, put your choice of a counter from among first strike, vigilance, deathtouch, and lifelink on Aragorn.\nWhenever you put one or more counters on Aragorn, put one of each of those kinds of counters on up to one other target creature. diff --git a/forge-gui/res/cardsfolder/b/bilbo_retired_burglar.txt b/forge-gui/res/cardsfolder/b/bilbo_retired_burglar.txt new file mode 100644 index 00000000000..78a345b65b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bilbo_retired_burglar.txt @@ -0,0 +1,11 @@ +Name:Bilbo, Retired Burglar +ManaCost:1 U R +Types:Legendary Creature Halfling Rogue +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters or leaves the battlefield, the Ring tempts you. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigTempt | Secondary$ True | TriggerDescription$ When CARDNAME enters or leaves the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigTreasure | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, create a Treasure token. +SVar:TrigTreasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You +DeckHas:Ability$Counters|Token +Oracle:When Bilbo, Retired Burglar enters or leaves the battlefield, the Ring tempts you.\nWhenever Bilbo deals combat damage to a player, create a Treasure token. diff --git a/forge-gui/res/cardsfolder/b/birthday_escape.txt b/forge-gui/res/cardsfolder/b/birthday_escape.txt new file mode 100644 index 00000000000..48991460667 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/birthday_escape.txt @@ -0,0 +1,6 @@ +Name:Birthday Escape +ManaCost:U +Types:Sorcery +A:SP$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ TrigTempt | StackDescription$ SpellDescription | SpellDescription$ Draw a card. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Draw a card. The Ring tempts you. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/bloodhill_bastion.txt b/forge-gui/res/cardsfolder/b/bloodhill_bastion.txt index 23b23f1c97e..35f2c840963 100644 --- a/forge-gui/res/cardsfolder/b/bloodhill_bastion.txt +++ b/forge-gui/res/cardsfolder/b/bloodhill_bastion.txt @@ -4,7 +4,7 @@ Types:Plane Equilor T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Command | ValidCard$ Creature | Execute$ TrigPump | TriggerDescription$ Whenever a creature enters the battlefield, it gains double strike and haste until end of turn. SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | KW$ Double Strike & Haste T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, exile target nontoken creature you control, then return it to the battlefield under your control. -SVar:RolledChaos:DB$ ChangeZone | ValidTgts$ Creature.nonToken+YouCtrl | TgtPrompt$ Select target non-Token creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ RestorationReturn +SVar:RolledChaos:DB$ ChangeZone | ValidTgts$ Creature.nonToken+YouCtrl | TgtPrompt$ Select target nontoken creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ RestorationReturn SVar:RestorationReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | RollInMain1$ True Oracle:Whenever a creature enters the battlefield, it gains double strike and haste until end of turn.\nWhenever chaos ensues, exile target nontoken creature you control, then return it to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/b/bombadils_song.txt b/forge-gui/res/cardsfolder/b/bombadils_song.txt new file mode 100644 index 00000000000..4b828c593ab --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bombadils_song.txt @@ -0,0 +1,7 @@ +Name:Bombadil's Song +ManaCost:1 G +Types:Instant +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | TgtPrompt$ Select target creature you control | KW$ Hexproof | SubAbility$ TrigTempt | SpellDescription$ Target creature you control gets +1/+1 and gains hexproof until end of turn. The Ring tempts you. (A creature with hexproof can't be the target of spells or abilities your opponents control.) +SVar:TrigTempt:DB$ RingTemptsYou +DeckHas:Keyword$Hexproof +Oracle:Target creature you control gets +1/+1 and gains hexproof until end of turn. The Ring tempts you. (A creature with hexproof can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/b/boon_bringer_valkyrie.txt b/forge-gui/res/cardsfolder/b/boon_bringer_valkyrie.txt index ed4e7889ca5..b5bfaf88bc1 100644 --- a/forge-gui/res/cardsfolder/b/boon_bringer_valkyrie.txt +++ b/forge-gui/res/cardsfolder/b/boon_bringer_valkyrie.txt @@ -8,4 +8,4 @@ K:Flying K:First Strike K:Lifelink DeckHas:Ability$Counters|LifeGain -Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that’s another creature, it gains the following abilities until end of turn.)\nFlying, first strike, lifelink +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following abilities until end of turn.)\nFlying, first strike, lifelink diff --git a/forge-gui/res/cardsfolder/b/borborygmos_and_fblthp.txt b/forge-gui/res/cardsfolder/b/borborygmos_and_fblthp.txt index 5b6ff85117f..76f9ec985bd 100644 --- a/forge-gui/res/cardsfolder/b/borborygmos_and_fblthp.txt +++ b/forge-gui/res/cardsfolder/b/borborygmos_and_fblthp.txt @@ -13,4 +13,4 @@ SVar:X:Count$RememberedSize/Twice A:AB$ ChangeZone | Cost$ 1 U | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 2 | SpellDescription$ Put CARDNAME into its owner's library third from the top. DeckHas:Ability$Discard SVar:HasAttackEffect:TRUE -Oracle:Whenever Borborygmos and Fblthp enters the battlefield or attacks, draw a card, then you may discard any number of land cards. When you discard one or more cards this way, Borborygmos and Fblthp deals twice that much damage to target creature.\n{1}{U}: Put Borborygmos and Fblthp into its owner’s library third from the top. +Oracle:Whenever Borborygmos and Fblthp enters the battlefield or attacks, draw a card, then you may discard any number of land cards. When you discard one or more cards this way, Borborygmos and Fblthp deals twice that much damage to target creature.\n{1}{U}: Put Borborygmos and Fblthp into its owner's library third from the top. diff --git a/forge-gui/res/cardsfolder/b/boromir_warden_of_the_tower.txt b/forge-gui/res/cardsfolder/b/boromir_warden_of_the_tower.txt new file mode 100644 index 00000000000..12d546fbb0a --- /dev/null +++ b/forge-gui/res/cardsfolder/b/boromir_warden_of_the_tower.txt @@ -0,0 +1,10 @@ +Name:Boromir, Warden of the Tower +ManaCost:2 W +Types:Legendary Creature Human Soldier +PT:3/3 +K:Vigilance +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigCounter | ValidSA$ Spell.ManaSpent EQ0 | TriggerDescription$ Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. +SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility +A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ TrigTempt | SpellDescription$ Creatures you control gain indestructible until end of turn. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Vigilance\nWhenever an opponent casts a spell, if no mana was spent to cast it, counter that spell.\nSacrifice Boromir, Warden of the Tower: Creatures you control gain indestructible until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/b/breaking_of_the_fellowship.txt b/forge-gui/res/cardsfolder/b/breaking_of_the_fellowship.txt new file mode 100644 index 00000000000..bf45b629f9b --- /dev/null +++ b/forge-gui/res/cardsfolder/b/breaking_of_the_fellowship.txt @@ -0,0 +1,8 @@ +Name:Breaking of the Fellowship +ManaCost:1 R +Types:Sorcery +A:SP$ Pump | Cost$ R | ValidTgts$ Creature.OppCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature an opponent controls | SubAbility$ MutinyDamage | StackDescription$ None | SpellDescription$ Target creature an opponent controls deals damage equal to its power to another target creature that player controls. The Ring tempts you. +SVar:MutinyDamage:DB$ DealDamage | ValidTgts$ Creature | TargetUnique$ True | TargetsWithDefinedController$ ParentTargetedController | AILogic$ PowerDmg | NumDmg$ X | DamageSource$ ParentTarget | SubAbility$ TrigTempt +SVar:X:ParentTargeted$CardPower +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Target creature an opponent controls deals damage equal to its power to another target creature that player controls. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/c/call_of_the_ring.txt b/forge-gui/res/cardsfolder/c/call_of_the_ring.txt new file mode 100644 index 00000000000..57a2ef046b0 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/call_of_the_ring.txt @@ -0,0 +1,8 @@ +Name:Call of the Ring +ManaCost:1 B +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTempt | TriggerDescription$ At the beginning of your upkeep, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you choose a creature as your Ring-bearer, you may pay 2 life. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ PayLife<2> +Oracle:At the beginning of your upkeep, the Ring tempts you.\nWhenever you choose a creature as your Ring-bearer, you may pay 2 life. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/c/claim_the_precious.txt b/forge-gui/res/cardsfolder/c/claim_the_precious.txt new file mode 100644 index 00000000000..887bbc312b5 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/claim_the_precious.txt @@ -0,0 +1,6 @@ +Name:Claim the Precious +ManaCost:1 B B +Types:Sorcery +A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ TrigTempt | SpellDescription$ Destroy target creature. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Destroy target creature. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/c/collective_nightmare.txt b/forge-gui/res/cardsfolder/c/collective_nightmare.txt index 975dea8e2df..d34d6b67733 100644 --- a/forge-gui/res/cardsfolder/c/collective_nightmare.txt +++ b/forge-gui/res/cardsfolder/c/collective_nightmare.txt @@ -3,4 +3,4 @@ ManaCost:2 B Types:Instant K:Convoke A:SP$ Pump | ValidTgts$ Creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. -Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature’s color.)\nTarget creature gets -3/-3 until end of turn. \ No newline at end of file +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTarget creature gets -3/-3 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/copper_host_crusher.txt b/forge-gui/res/cardsfolder/c/copper_host_crusher.txt index a1b5febd10f..98f7d119dbb 100644 --- a/forge-gui/res/cardsfolder/c/copper_host_crusher.txt +++ b/forge-gui/res/cardsfolder/c/copper_host_crusher.txt @@ -4,4 +4,4 @@ Types:Creature Phyrexian Bear Rhino PT:8/8 K:Trample K:Hexproof -Oracle:Trample\nHexproof (This creature can’t be the target of spells or abilities your opponents control.) \ No newline at end of file +Oracle:Trample\nHexproof (This creature can't be the target of spells or abilities your opponents control.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/dreadful_as_the_storm.txt b/forge-gui/res/cardsfolder/d/dreadful_as_the_storm.txt new file mode 100644 index 00000000000..a8f04bf07d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/d/dreadful_as_the_storm.txt @@ -0,0 +1,6 @@ +Name:Dreadful as the Storm +ManaCost:2 U +Types:Instant +A:SP$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 5 | Toughness$ 5 | SubAbility$ TrigTempt | SpellDescription$ Target creature has base power and toughness 5/5 until end of turn. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Target creature has base power and toughness 5/5 until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/d/dunedain_rangers.txt b/forge-gui/res/cardsfolder/d/dunedain_rangers.txt new file mode 100644 index 00000000000..f30f2dee53b --- /dev/null +++ b/forge-gui/res/cardsfolder/d/dunedain_rangers.txt @@ -0,0 +1,7 @@ +Name:Dunedain Rangers +ManaCost:3 G +Types:Creature Human Ranger +PT:4/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | IsPresent$ Card.YouCtrl+IsRingbearer | PresentCompare$ EQ0 | Execute$ TrigTempt | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, if you don't control a Ring-bearer, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Landfall — Whenever a land enters the battlefield under your control, if you don't control a Ring-bearer, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/e/elrond_lord_of_rivendell.txt b/forge-gui/res/cardsfolder/e/elrond_lord_of_rivendell.txt new file mode 100644 index 00000000000..717cf081bba --- /dev/null +++ b/forge-gui/res/cardsfolder/e/elrond_lord_of_rivendell.txt @@ -0,0 +1,9 @@ +Name:Elrond, Lord of Rivendell +ManaCost:2 U +Types:Legendary Creature Elf Noble +PT:3/2 +T:Mode$ ChangesZone | ValidCard$ Card.Self,Creature.YouCtrl+Other | Origin$ Any | Destination$ Battlefield | Execute$ TrigScry | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, scry 1. If this is the second time this ability has resolved this turn, the Ring tempts you. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 | SubAbility$ TrigTempt +SVar:TrigTempt:DB$ RingTemptsYou | ConditionCheckSVar$ Resolved | ConditionSVarCompare$ EQ2 +SVar:Resolved:Count$ResolvedThisTurn +Oracle:Whenever Elrond, Lord of Rivendell or another creature enters the battlefield under your control, scry 1. If this is the second time this ability has resolved this turn, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/e/enraged_huorn.txt b/forge-gui/res/cardsfolder/e/enraged_huorn.txt new file mode 100644 index 00000000000..118e4fc8f6a --- /dev/null +++ b/forge-gui/res/cardsfolder/e/enraged_huorn.txt @@ -0,0 +1,8 @@ +Name:Enraged Huorn +ManaCost:4 G +Types:Creature Treefolk +PT:4/5 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Trample\nWhen Enraged Huorn enters the battlefield, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/e/exsanguinator_cavalry.txt b/forge-gui/res/cardsfolder/e/exsanguinator_cavalry.txt index f4a3add8cc0..85869a35d35 100644 --- a/forge-gui/res/cardsfolder/e/exsanguinator_cavalry.txt +++ b/forge-gui/res/cardsfolder/e/exsanguinator_cavalry.txt @@ -4,7 +4,7 @@ Types:Creature Vampire Knight PT:2/3 K:Menace K:Lifelink -T:Mode$ DamageDone | ValidSource$ Knight.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Knight you control deals combat damage to a player, put a +1/+1 counter on that creature and create a Blood token. (It’s an artifact with “{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.”) +T:Mode$ DamageDone | ValidSource$ Knight.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Knight you control deals combat damage to a player, put a +1/+1 counter on that creature and create a Blood token. (It's an artifact with "{1}, {T}, Discard a card, Sacrifice this artifact: Draw a card.") SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredSourceLKICopy | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenScript$ c_a_blood_draw DeckHas:Ability$LifeGain|Token|Counters & Type$Blood|Artifact diff --git a/forge-gui/res/cardsfolder/f/faramir_field_commander.txt b/forge-gui/res/cardsfolder/f/faramir_field_commander.txt new file mode 100644 index 00000000000..ce7445e226a --- /dev/null +++ b/forge-gui/res/cardsfolder/f/faramir_field_commander.txt @@ -0,0 +1,11 @@ +Name:Faramir, Field Commander +ManaCost:3 W +Types:Legendary Creature Human Soldier +PT:3/3 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, if a creature died under your control this turn, draw a card. +T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever the Ring tempts you, if you chose a creature other than CARDNAME as your Ring-bearer, create a 1/1 white Human Soldier creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You +SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature.YouCtrl +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +DeckHas:Ability$Token +Oracle:At the beginning of your end step, if a creature died under your control this turn, draw a card.\nWhenever the Ring tempts you, if you chose a creature other than Faramir, Field Commander as your Ring-bearer, create a 1/1 white Human Soldier creature token. diff --git a/forge-gui/res/cardsfolder/f/fiery_inscription.txt b/forge-gui/res/cardsfolder/f/fiery_inscription.txt new file mode 100644 index 00000000000..40c741a2de9 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/fiery_inscription.txt @@ -0,0 +1,9 @@ +Name:Fiery Inscription +ManaCost:2 R +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast an instant or sorcery spell, CARDNAME deals 1 damage to each opponent. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 +DeckHints:Type$Instant|Sorcery +Oracle:When Fiery Inscription enters the battlefield, the Ring tempts you.\nWhenever you cast an instant or sorcery spell, Fiery Inscription deals 2 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/f/frodo_adventurous_hobbit.txt b/forge-gui/res/cardsfolder/f/frodo_adventurous_hobbit.txt new file mode 100644 index 00000000000..d905680b229 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/frodo_adventurous_hobbit.txt @@ -0,0 +1,12 @@ +Name:Frodo, Adventurous Hobbit +ManaCost:W B +Types:Legendary Creature Halfling Scout +PT:1/3 +K:Partner:Sam, Loyal Attendant:Sam +K:Vigilance +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTempt | CheckSVar$ YouLifeGained | SVarCompare$ GE3 | TriggerDescription$ Whenever CARDNAME attacks, if you gained 3 or more life this turn, the Ring tempts you. Then if NICKNAME is your Ring-bearer and the Ring has tempted you two or more times this game, draw a card. +SVar:TrigTempt:DB$ RingTemptsYou | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionCheckSVar$ NumRingTempted | ConditionSVarCompare$ GE2 | ConditionPresent$ Card.Self+IsRingbearer | ConditionCompare$ GE1 +SVar:YouLifeGained:Count$LifeYouGainedThisTurn +SVar:NumRingTempted:PlayerCountPropertyYou$RingTemptedYou +Oracle:Partner with Sam, Loyal Attendant\nVigilance\nWhenever Frodo, Adventurous Hobbit attacks, if you gained 3 or more life this turn, the Ring tempts you. Then if Frodo is your Ring-bearer and the Ring has tempted you two or more times this game, draw a card. diff --git a/forge-gui/res/cardsfolder/f/frodo_baggins.txt b/forge-gui/res/cardsfolder/f/frodo_baggins.txt new file mode 100644 index 00000000000..60ff152a28b --- /dev/null +++ b/forge-gui/res/cardsfolder/f/frodo_baggins.txt @@ -0,0 +1,8 @@ +Name:Frodo Baggins +ManaCost:G W +Types:Legendary Creature Halfling Scout +PT:1/3 +T:Mode$ ChangesZone | ValidCard$ Card.Self,Creature.Other+Legendary+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigTempt | TriggerDescription$ Whenever CARDNAME or another legendary creature enters the battlefield under your control, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +S:Mode$ Continuous | Affected$ Card.Self+IsRingbearer | AddHiddenKeyword$ CARDNAME must be blocked if able. | Description$ As long as NICKNAME is your Ring-bearer, it must be blocked if able. +Oracle:Whenever Frodo Baggins or another legendary creature enters the battlefield under your control, the Ring tempts you.\nAs long as Frodo is your Ring-bearer, it must be blocked if able. diff --git a/forge-gui/res/cardsfolder/f/frodo_saurons_bane.txt b/forge-gui/res/cardsfolder/f/frodo_saurons_bane.txt new file mode 100644 index 00000000000..4d5b5fe44d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/frodo_saurons_bane.txt @@ -0,0 +1,13 @@ +Name:Frodo, Sauron's Bane +ManaCost:W +Types:Legendary Creature Halfling Citizen +PT:1/2 +A:AB$ Animate | Cost$ WB WB | ConditionPresent$ Card.Self+Citizen | Types$ Halfling,Scout | RemoveCreatureTypes$ True | Duration$ Permanent | Power$ 2 | Toughness$ 3 | Keywords$ Lifelink | SpellDescription$ If CARDNAME is a Citizen, it becomes a Halfling Scout with base power and toughness 2/3 and lifelink. +A:AB$ Animate | Cost$ B B B | ConditionPresent$ Card.Self+Scout | Types$ Halfling,Rogue | RemoveCreatureTypes$ True | Duration$ Permanent | Triggers$ TrigDamageDone | SpellDescription$ If NICKNAME is a Scout, it becomes a Halfling Rogue with "Whenever this creature deals combat damage to a player, that player loses the game if the Ring has tempted you four or more times this game. Otherwise, the Ring tempts you." +SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBranch | TriggerDescription$ Whenever this creature deals combat damage to a player, that player loses the game if the Ring has tempted you four or more times this game. Otherwise, the Ring tempts you. +SVar:TrigBranch:DB$ Branch | BranchConditionSVar$ NumRingTempted | BranchConditionSVarCompare$ GE4 | TrueSubAbility$ TrigTheyLose | FalseSubAbility$ TrigTempt +SVar:TrigTheyLose:DB$ LosesGame | Defined$ TriggeredTarget +SVar:TrigTempt:DB$ RingTemptsYou +SVar:NumRingTempted:PlayerCountPropertyYou$RingTemptedYou +DeckHas:Ability$LifeGain +Oracle:{W/B}{W/B}: If Frodo, Sauron's Bane is a Citizen, it becomes a Halfling Scout with base power and toughness 2/3 and lifelink.\n{B}{B}{B}: If Frodo is a Scout, it becomes a Halfling Rogue with "Whenever this creature deals combat damage to a player, that player loses the game if the Ring has tempted you four or more times this game. Otherwise, the Ring tempts you." diff --git a/forge-gui/res/cardsfolder/g/galadriel_of_lothlorien.txt b/forge-gui/res/cardsfolder/g/galadriel_of_lothlorien.txt new file mode 100644 index 00000000000..0d2ffdc9ec2 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/galadriel_of_lothlorien.txt @@ -0,0 +1,9 @@ +Name:Galadriel of Lothlorien +ManaCost:1 G U +Types:Legendary Creature Elf Noble +PT:3/3 +T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ Whenever the Ring tempts you, if you chose a creature other than CARDNAME as your Ring-bearer, scry 3. +SVar:TrigScry:DB$ Scry | ScryNum$ 3 +T:Mode$ Scry | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBReveal | TriggerDescription$ Whenever you scry, you may reveal the top card of your library. If a land card is revealed this way, put it onto the battlefield tapped. +SVar:DBReveal:DB$ Dig | DigNum$ 1 | Reveal$ True | Optional$ True | ChangeNum$ 1 | ChangeValid$ Land | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0 +Oracle:Whenever the Ring tempts you, if you chose a creature other than Galadriel of Lothlorien as your Ring-bearer, scry 3.\nWhenever you scry, you may reveal the top card of your library. If a land card is revealed this way, put it onto the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/g/gandalf_friend_of_the_shire.txt b/forge-gui/res/cardsfolder/g/gandalf_friend_of_the_shire.txt new file mode 100644 index 00000000000..7d585b9d55f --- /dev/null +++ b/forge-gui/res/cardsfolder/g/gandalf_friend_of_the_shire.txt @@ -0,0 +1,9 @@ +Name:Gandalf, Friend of the Shire +ManaCost:3 U +Types:Legendary Creature Avatar Wizard +PT:2/4 +K:Flash +S:Mode$ CastWithFlash | ValidCard$ Sorcery | ValidSA$ Spell | Caster$ You | Description$ You may cast sorcery spells as though they had flash. +T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever the Ring tempts you, if you chose a creature other than CARDNAME as your Ring-bearer, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +Oracle:Flash\nYou may cast sorcery spells as though they had flash.\nWhenever the Ring tempts you, if you chose a creature other than Gandalf, Friend of the Shire as your Ring-bearer, draw a card. diff --git a/forge-gui/res/cardsfolder/g/glorious_gale.txt b/forge-gui/res/cardsfolder/g/glorious_gale.txt new file mode 100644 index 00000000000..98267af470e --- /dev/null +++ b/forge-gui/res/cardsfolder/g/glorious_gale.txt @@ -0,0 +1,6 @@ +Name:Glorious Gale +ManaCost:1 U +Types:Instant +A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target creature spell | RememberCountered$ True | ValidTgts$ Card.Creature | SubAbility$ TrigTempt | SpellDescription$ Counter target creature spell. If it was a legendary spell, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou | ConditionDefined$ Targeted | ConditionPresent$ Spell.Legendary +Oracle:Counter target creature spell. If it was a legendary spell, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/g/gollum_patient_plotter.txt b/forge-gui/res/cardsfolder/g/gollum_patient_plotter.txt new file mode 100644 index 00000000000..3c9415dd134 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/gollum_patient_plotter.txt @@ -0,0 +1,9 @@ +Name:Gollum, Patient Plotter +ManaCost:1 B +Types:Legendary Creature Halfling Horror +PT:3/1 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Execute$ TrigTempt | TriggerDescription$ When CARDNAME leaves the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +A:AB$ ChangeZone | Cost$ B Sac<1/Creature> | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SorcerySpeed$ True | SpellDescription$ Return NICKNAME from your graveyard to your hand. Activate only as a sorcery. | CostDesc$ Sacrifice a creature: +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE1 +Oracle:When Gollum, Patient Plotter leaves the battlefield, the Ring tempts you.\n{B}, Sacrifice a creature: Return Gollum from your graveyard to your hand. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/g/gollums_bite.txt b/forge-gui/res/cardsfolder/g/gollums_bite.txt new file mode 100644 index 00000000000..3346ef8cea6 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/gollums_bite.txt @@ -0,0 +1,6 @@ +Name:Gollum's Bite +ManaCost:B +Types:Instant +A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. +A:AB$ RingTemptsYou | Cost$ 3 B ExileFromGrave<1/CARDNAME> | SorcerySpeed$ True | ActivationZone$ Graveyard | SpellDescription$ The Ring tempts you. Activate only as a sorcery. +Oracle:Target creature gets -2/-2 until end of turn.\n{3}{B}, Exile Gollum's Bite from your graveyard: The Ring tempts you. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/h/horses_of_the_bruinen.txt b/forge-gui/res/cardsfolder/h/horses_of_the_bruinen.txt new file mode 100644 index 00000000000..11e2bb19eeb --- /dev/null +++ b/forge-gui/res/cardsfolder/h/horses_of_the_bruinen.txt @@ -0,0 +1,7 @@ +Name:Horses of the Bruinen +ManaCost:3 U U +Types:Sorcery +A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBScry | SpellDescription$ Return up to two target creatures to their owners' hands. +SVar:DBScry:DB$ Scry | ScryNum$ 1 | SubAbility$ TrigTempt +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Return up to two target creatures to their owners' hands. Scry 1. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/i/in_the_darkness_bind_them.txt b/forge-gui/res/cardsfolder/i/in_the_darkness_bind_them.txt new file mode 100644 index 00000000000..97b2f6b608f --- /dev/null +++ b/forge-gui/res/cardsfolder/i/in_the_darkness_bind_them.txt @@ -0,0 +1,10 @@ +Name:In the Darkness Bind Them +ManaCost:2 U B R +Types:Enchantment Saga +K:Saga:4:DBToken,DBToken,DBToken,DBGainControl +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_3_3_wraith_menace | TokenOwner$ You | SubAbility$ TrigTempt | SpellDescription$ Create a 3/3 black Wraith creature token with menace. The Ring tempts you. +SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature.OppCtrl | SubAbility$ TrigTempt | TgtPrompt$ Select target creature an opponent controls to gain control of. | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn. The Ring tempts you. +SVar:OneEach:PlayerCountOpponents$Amount +SVar:TrigTempt:DB$ RingTemptsYou +DeckHas:Ability$Token +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)\nI, II, III — Create a 3/3 black Wraith creature token with menace. The Ring tempts you.\nIV — For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/i/inherited_envelope.txt b/forge-gui/res/cardsfolder/i/inherited_envelope.txt new file mode 100644 index 00000000000..4e0cb2e1100 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/inherited_envelope.txt @@ -0,0 +1,7 @@ +Name:Inherited Envelope +ManaCost:3 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:When Inherited Envelope enters the battlefield, the Ring tempts you.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/j/jaces_defeat.txt b/forge-gui/res/cardsfolder/j/jaces_defeat.txt index 776b3e5caa8..61a3e28a667 100644 --- a/forge-gui/res/cardsfolder/j/jaces_defeat.txt +++ b/forge-gui/res/cardsfolder/j/jaces_defeat.txt @@ -2,6 +2,6 @@ Name:Jace's Defeat ManaCost:1 U Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Blue spell | ValidTgts$ Card.Blue | SubAbility$ DBScry | SpellDescription$ Counter target blue spell. If it was a Jace planeswalker spell, scry 2. -SVar:DBScry:DB$ Scry | ScryNum$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Jace +SVar:DBScry:DB$ Scry | ScryNum$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Spell.Jace+Planeswalker AI:RemoveDeck:Random Oracle:Counter target blue spell. If it was a Jace planeswalker spell, scry 2. diff --git a/forge-gui/res/cardsfolder/m/mirrormere_guardian.txt b/forge-gui/res/cardsfolder/m/mirrormere_guardian.txt new file mode 100644 index 00000000000..23fadb85c85 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/mirrormere_guardian.txt @@ -0,0 +1,7 @@ +Name:Mirrormere Guardian +ManaCost:2 G +Types:Creature Dwarf Soldier +PT:4/2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME dies, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:When Mirrormere Guardian dies, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/n/nazgul.txt b/forge-gui/res/cardsfolder/n/nazgul.txt new file mode 100644 index 00000000000..811c72a6174 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nazgul.txt @@ -0,0 +1,13 @@ +Name:Nazgul +ManaCost:2 B +Types:Creature Wraith Knight +PT:1/2 +K:Deathtouch +K:DeckLimit:9:A deck can have up to nine cards named CARDNAME. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ RingTemptsYou | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounters | TriggerDescription$ Whenever the Ring tempts you, put a +1/+1 counter on each Wraith you control. +SVar:TrigCounters:DB$ PutCounterAll | ValidCards$ Creature.Wraith+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +DeckNeeds:Name$Nazgul +DeckHas:Ability$Token +Oracle:Deathtouch\nWhen Nazgul enters the battlefield, the Ring tempts you.\nWhenever the Ring tempts you, put a +1/+1 counter on each Wraith you control.\nA deck can have up to nine cards named Nazgul. diff --git a/forge-gui/res/cardsfolder/n/netherborn_phalanx.txt b/forge-gui/res/cardsfolder/n/netherborn_phalanx.txt index 78b2feee506..2fefa613bf2 100644 --- a/forge-gui/res/cardsfolder/n/netherborn_phalanx.txt +++ b/forge-gui/res/cardsfolder/n/netherborn_phalanx.txt @@ -5,7 +5,6 @@ PT:2/4 K:Transmute:1 B B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEachOpp | TriggerDescription$ When CARDNAME enters the battlefield, each opponent loses 1 life for each creature they control. SVar:TrigEachOpp:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ TrigLoseLife -SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X SVar:X:Count$Valid Creature.RememberedPlayerCtrl Oracle:When Netherborn Phalanx enters the battlefield, each opponent loses 1 life for each creature they control.\nTransmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same mana value as this card, reveal it, put it into your hand, then then shuffle. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/n/now_for_wrath_now_for_ruin.txt b/forge-gui/res/cardsfolder/n/now_for_wrath_now_for_ruin.txt new file mode 100644 index 00000000000..6bcf8f76124 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/now_for_wrath_now_for_ruin.txt @@ -0,0 +1,9 @@ +Name:Now for Wrath, Now for Ruin! +ManaCost:3 W +Types:Sorcery +A:SP$ PutCounterAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll | SpellDescription$ Put a +1/+1 counter on each creature you control. They gain vigilance until end of turn. The Ring tempts you. +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | SubAbility$ TrigTempt +SVar:TrigTempt:DB$ RingTemptsYou +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +Oracle:Put a +1/+1 counter on each creature you control. They gain vigilance until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/o/one_ring_to_rule_them_all.txt b/forge-gui/res/cardsfolder/o/one_ring_to_rule_them_all.txt new file mode 100644 index 00000000000..16d395d4efd --- /dev/null +++ b/forge-gui/res/cardsfolder/o/one_ring_to_rule_them_all.txt @@ -0,0 +1,12 @@ +Name:One Ring to Rule Them All +ManaCost:2 B B +Types:Enchantment Saga +K:Saga:3:DBTempt,DBDestroy,DBEachOpp +SVar:DBTempt:DB$ RingTemptsYou | SubAbility$ DBMill | SpellDescription$ The Ring tempts you, then each player mills cards equal to your Ring-bearer's power. +SVar:DBMill:DB$ Mill | NumCards$ X | Defined$ Player +SVar:X:Count$Valid Creature.YouCtrl+IsRingbearer$CardPower +SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.nonLegendary | SpellDescription$ Destroy all nonlegendary creatures. +SVar:DBEachOpp:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ TrigLoseLife | SpellDescription$ Each opponent loses 1 life for each creature card in that player's graveyard. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ Y +SVar:Y:Count$ValidGraveyard Creature.RememberedPlayerCtrl +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — The Ring tempts you, then each player mills cards equal to your Ring-bearer's power.\nII — Destroy all nonlegendary creatures.\nIII — Each opponent loses 1 life for each creature card in that player's graveyard. diff --git a/forge-gui/res/cardsfolder/r/ramosian_greatsword.txt b/forge-gui/res/cardsfolder/r/ramosian_greatsword.txt index 3aa6ef8cd25..9f0d8b5e416 100644 --- a/forge-gui/res/cardsfolder/r/ramosian_greatsword.txt +++ b/forge-gui/res/cardsfolder/r/ramosian_greatsword.txt @@ -4,4 +4,4 @@ Types:Artifact Equipment K:Convoke K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddToughness$ 1 | AddKeyword$ Trample | Description$ Equipped creature gets +3/+1 and has trample. -Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for 1 or one mana of that creature’s color.)\nEquipped creature gets +3/+1 and has trample.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) \ No newline at end of file +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for 1 or one mana of that creature's color.)\nEquipped creature gets +3/+1 and has trample.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/rangers_firebrand.txt b/forge-gui/res/cardsfolder/r/rangers_firebrand.txt new file mode 100644 index 00000000000..1dbe4949026 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rangers_firebrand.txt @@ -0,0 +1,6 @@ +Name:Ranger's Firebrand +ManaCost:R +Types:Sorcery +A:SP$ DealDamage | Cost$ R | ValidTgts$ Any | NumDmg$ 2 | SubAbility$ TrigTempt | SpellDescription$ CARDNAME deals 2 damage to any target. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Ranger's Firebrand deals 2 damage to any target. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/r/rangers_of_Ithilien.txt b/forge-gui/res/cardsfolder/r/rangers_of_Ithilien.txt new file mode 100644 index 00000000000..c8e3dfab8d1 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rangers_of_Ithilien.txt @@ -0,0 +1,10 @@ +Name:Rangers of Ithilien +ManaCost:2 U U +Types:Creature Human Ranger +PT:3/3 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, gain control of up to one target creature with lesser power for as long as you control CARDNAME. Then the Ring tempts you. +SVar:TrigChange:DB$ GainControl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature | ValidTgts$ Creature.powerLTZ | SubAbility$ TrigTempt | LoseControl$ LeavesPlay,LoseControl | SpellDescription$ Gain control of up to one target creature with lesser power for as long as you control CARDNAME. Then the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +SVar:Z:Count$CardPower +Oracle:Vigilance\nWhen Rangers of Ithilien enters the battlefield, gain control of up to one target creature with lesser power for as long as you control Rangers of Ithilien. Then the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/r/relentless_rohirrim.txt b/forge-gui/res/cardsfolder/r/relentless_rohirrim.txt new file mode 100644 index 00000000000..e3911875c96 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/relentless_rohirrim.txt @@ -0,0 +1,7 @@ + Name:Relentless Rohirrim + ManaCost:3 R + Types:Creature Human Knight + PT:4/3 + T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. + SVar:TrigTempt:DB$ RingTemptsYou + Oracle:When Relentless Rohirrim enters the battlefield, the Ring tempts you. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/ringsight.txt b/forge-gui/res/cardsfolder/r/ringsight.txt new file mode 100644 index 00000000000..dcb33d70ffa --- /dev/null +++ b/forge-gui/res/cardsfolder/r/ringsight.txt @@ -0,0 +1,6 @@ +Name:Ringsight +ManaCost:1 U B +Types:Sorcery +A:SP$ RingTemptsYou | SubAbility$ TrigSearch | SpellDescription$ The Ring tempts you. Search your library for a card that shares a color with a legendary creature you control, reveal it, put it into your hand, then shuffle. +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.SharesColorWith Creature.Legendary+YouCtrl +Oracle:The Ring tempts you. Search your library for a card that shares a color with a legendary creature you control, reveal it, put it into your hand, then shuffle. diff --git a/forge-gui/res/cardsfolder/r/ringwraiths.txt b/forge-gui/res/cardsfolder/r/ringwraiths.txt new file mode 100644 index 00000000000..190b80bb52b --- /dev/null +++ b/forge-gui/res/cardsfolder/r/ringwraiths.txt @@ -0,0 +1,10 @@ +Name:Ringwraiths +ManaCost:4 B B +Types:Creature Wraith Knight +PT:5/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls gets -3/-3 until end of turn. If that creature is legendary, its controller loses 3 life. +SVar:TrigPump:DB$ Pump | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature | SubAbility$ TrigLose +SVar:TrigLose:DB$ LoseLife | Defined$ TargetedController | LifeAmount$ 3 | ConditionDefined$ Targeted | ConditionPresent$ Legendary +T:Mode$ RingTemptsYou | Execute$ TrigReturn | TriggerZones$ Graveyard | TriggerDescription$ When the Ring tempts you, return CARDNAME from your graveyard to your hand. +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self +Oracle:When Ringwraiths enters the battlefield, target creature an opponent controls gets -3/-3 until end of turn. If that creature is legendary, its controller loses 3 life.\nWhen the Ring tempts you, return Ringwraiths from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/r/rohirrim_lancer.txt b/forge-gui/res/cardsfolder/r/rohirrim_lancer.txt new file mode 100644 index 00000000000..bbb8a48ec38 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rohirrim_lancer.txt @@ -0,0 +1,8 @@ +Name:Rohirrim Lancer +ManaCost:R +Types:Creature Human Knight +PT:1/1 +K:Menace +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME dies, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Menace (This creature can’t be blocked except by two or more creatures.)\nWhen Rohirrim Lancer dies, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/saint_traft_and_rem_karolus.txt b/forge-gui/res/cardsfolder/s/saint_traft_and_rem_karolus.txt index 13460ce8685..ddc9825a6f5 100644 --- a/forge-gui/res/cardsfolder/s/saint_traft_and_rem_karolus.txt +++ b/forge-gui/res/cardsfolder/s/saint_traft_and_rem_karolus.txt @@ -2,7 +2,7 @@ Name:Saint Traft and Rem Karolus ManaCost:U R W Types:Legendary Creature Spirit Human PT:3/4 -T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME becomes tapped, create a 1/1 red Human creature token if this is the first time this ability has resolved this turn. If it’s the second time, create a 1/1 blue Spirit creature token with flying. If it’s the third time, create a 4/4 white Angel creature token with flying. +T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME becomes tapped, create a 1/1 red Human creature token if this is the first time this ability has resolved this turn. If it's the second time, create a 1/1 blue Spirit creature token with flying. If it's the third time, create a 4/4 white Angel creature token with flying. SVar:TrigToken:DB$ Token | TokenScript$ r_1_1_human | ConditionCheckSVar$ Resolved | ConditionSVarCompare$ EQ1 | SubAbility$ DBTokenBis SVar:DBTokenBis:DB$ Token | TokenScript$ u_1_1_spirit_flying | ConditionCheckSVar$ Resolved | ConditionSVarCompare$ EQ2 | SubAbility$ DBTokenTrice SVar:DBTokenTrice:DB$ Token | TokenScript$w_4_4_angel_flying | ConditionCheckSVar$ Resolved | ConditionSVarCompare$ EQ3 diff --git a/forge-gui/res/cardsfolder/s/sams_desperate_rescue.txt b/forge-gui/res/cardsfolder/s/sams_desperate_rescue.txt new file mode 100644 index 00000000000..8cfb549d089 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sams_desperate_rescue.txt @@ -0,0 +1,6 @@ +Name:Sam's Desperate Rescue +ManaCost:B +Types:Sorcery +A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | SubAbility$ TrigTempt | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Return target creature card from your graveyard to your hand. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/samwise_the_stouthearted.txt b/forge-gui/res/cardsfolder/s/samwise_the_stouthearted.txt new file mode 100644 index 00000000000..ab855c11065 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/samwise_the_stouthearted.txt @@ -0,0 +1,10 @@ +Name:Samwise the Stouthearted +ManaCost:1 W +Types:Legendary Creature Halfling Peasant +PT:2/1 +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, choose up to one target permanent card in your graveyard that was put there from the battlefield this turn. Return it to your hand. Then the Ring tempts you. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Permanent.YouOwn+ThisTurnEnteredFrom_Battlefield | Origin$ Graveyard | Destination$ Hand | SubAbility$ TrigTempt | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target permanent card in your graveyard that was put there from the battlefield this turn +SVar:TrigTempt:DB$ RingTemptsYou +DeckHas:Ability$Graveyard +Oracle:Flash\nWhen Samwise the Stouthearted enters the battlefield, choose up to one target permanent card in your graveyard that was put there from the battlefield this turn. Return it to your hand. Then the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/sauron_lord_of_the_rings.txt b/forge-gui/res/cardsfolder/s/sauron_lord_of_the_rings.txt new file mode 100644 index 00000000000..3dc22366bca --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sauron_lord_of_the_rings.txt @@ -0,0 +1,13 @@ +Name:Sauron, Lord of the Rings +ManaCost:5 U B R +Types:Legendary Creature Avatar Horror +PT:9/9 +K:Trample +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigAmass | TriggerDescription$ When you cast this spell, amass Orcs 5, mill five cards, then return a creature card from your graveyard to the battlefield. +SVar:TrigAmass:DB$ Amass | Type$ Orc | Num$ 5 | SubAbility$ TrigMill +SVar:TrigMill:DB$ Mill | Defined$ You | NumCards$ 5 | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Mandatory$ True | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Hidden$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.OppCtrl+IsCommander | TriggerZones$ Battlefield | Execute$ TrigTempt | TriggerDescription$ Whenever a commander an opponent controls dies, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +DeckHas:Ability$Token|Graveyard +Oracle:When you cast this spell, amass Orcs 5, mill five cards, then return a creature card from your graveyard to the battlefield.\nTrample\nWhenever a commander an opponent controls dies, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/sauron_the_dark_lord.txt b/forge-gui/res/cardsfolder/s/sauron_the_dark_lord.txt new file mode 100644 index 00000000000..9cd6460cddf --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sauron_the_dark_lord.txt @@ -0,0 +1,13 @@ +Name:Sauron, the Dark Lord +ManaCost:3 U B R +Types:Legendary Creature Avatar Horror +PT:7/6 +K:Ward:Sac<1/Artifact.Legendary;Creature.Legendary/legendary artifact or legendary creature> +T:Mode$ SpellCast | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigAmass | TriggerDescription$ Whenever an opponent casts a spell, amass Orcs 1. +SVar:TrigAmass:DB$ Amass | Type$ Orc | Num$ 1 +T:Mode$ DamageDone | ValidSource$ Army.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigTempt | TriggerZones$ Battlefield | TriggerDescription$ Whenever an Army you control deals combat damage to a player, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ RingTemptsYou | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever the Ring tempts you, you may discard your hand. If you do, draw four cards. +SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Hand> | NumCards$ 4 +DeckHas:Ability$Token +Oracle:Ward—Sacrifice a legendary artifact or legendary creature.\nWhenever an opponent casts a spell, amass Orcs 1.\nWhenever an Army you control deals combat damage to a player, the Ring tempts you.\nWhenever the Ring tempts you, you may discard your hand. If you do, draw four cards. diff --git a/forge-gui/res/cardsfolder/s/saurons_ransom.txt b/forge-gui/res/cardsfolder/s/saurons_ransom.txt new file mode 100644 index 00000000000..68c45a74c1c --- /dev/null +++ b/forge-gui/res/cardsfolder/s/saurons_ransom.txt @@ -0,0 +1,8 @@ +Name:Sauron's Ransom +ManaCost:1 U B +Types:Instant +A:SP$ TwoPiles | Defined$ You | Separator$ Opponent | Chooser$ You | DefinedCards$ Top_4_OfLibrary | ChosenPile$ DBHand | UnchosenPile$ DBGrave | FaceDown$ One | SubAbility$ TrigTempt | SpellDescription$ Choose an opponent. They look at the top four cards of your library and separate them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. The Ring tempts you. +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Choose an opponent. They look at the top four cards of your library and separate them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/schema_thief.txt b/forge-gui/res/cardsfolder/s/schema_thief.txt index 6fb96eec507..819b0632534 100644 --- a/forge-gui/res/cardsfolder/s/schema_thief.txt +++ b/forge-gui/res/cardsfolder/s/schema_thief.txt @@ -6,4 +6,4 @@ K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, create a token that's a copy of target artifact that player controls. SVar:TrigToken:DB$ CopyPermanent | ValidTgts$ Artifact.ControlledBy TriggeredTarget | Defined$ Targeted DeckHas:Ability$Token -Oracle:Flying\nWhenever Schema Thief deals combat damage to a player, create a token that’s a copy of target artifact that player controls. \ No newline at end of file +Oracle:Flying\nWhenever Schema Thief deals combat damage to a player, create a token that's a copy of target artifact that player controls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/scroll_of_isildur.txt b/forge-gui/res/cardsfolder/s/scroll_of_isildur.txt new file mode 100644 index 00000000000..8490efad752 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/scroll_of_isildur.txt @@ -0,0 +1,12 @@ +Name:Scroll of Isildur +ManaCost:2 U +Types:Enchantment Saga +K:Saga:3:DBGainControl,DBTap,DBDraw +SVar:DBGainControl:DB$ GainControl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target artifact | ValidTgts$ Artifact | SubAbility$ TrigTempt | LoseControl$ LeavesPlay,LoseControl | SpellDescription$ Gain control of up to one target artifact for as long as you control CARDNAME. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +SVar:DBTap:DB$ Tap | ValidTgts$ Creature | SubAbility$ DBCounter | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | SpellDescription$ Tap up to two target creatures. Put a stun counter on each of them. +SVar:DBCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 +SVar:DBDraw:DB$ Draw | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Defined$ You | NumCards$ X | SpellDescription$ Draw a card for each tapped creature target opponent controls. +SVar:X:Count$Valid Creature.tapped+TargetedPlayerCtrl +DeckHas:Ability$Counters +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of up to one target artifact for as long as you control Scroll of Isildur. The Ring tempts you.\nII — Tap up to two target creatures. Put a stun counter on each of them.\nIII — Draw a card for each tapped creature target opponent controls. diff --git a/forge-gui/res/cardsfolder/s/shortcut_to_mushrooms.txt b/forge-gui/res/cardsfolder/s/shortcut_to_mushrooms.txt new file mode 100644 index 00000000000..0de9d0bcc77 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shortcut_to_mushrooms.txt @@ -0,0 +1,9 @@ +Name:Shortcut to Mushrooms +ManaCost:1 G +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Revolt$ True | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a permanent you controlled left the battlefield this turn, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:When Shortcut to Mushrooms enters the battlefield, the Ring tempts you.\nAt the beginning of your end step, if a permanent you controlled left the battlefield this turn, put a +1/+1 counter on target creature you control. diff --git a/forge-gui/res/cardsfolder/s/slip_on_the_ring.txt b/forge-gui/res/cardsfolder/s/slip_on_the_ring.txt new file mode 100644 index 00000000000..3f84378f4e8 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/slip_on_the_ring.txt @@ -0,0 +1,8 @@ +Name:Slip On the Ring +ManaCost:1 W +Types:Instant +A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Creature.YouOwn | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target creature you own | RememberTargets$ True | SubAbility$ DBReturn | SpellDescription$ Exile target creature you own, then return it to the battlefield under your control. The Ring tempts you. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ TrigTempt +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Exile target creature you own, then return it to the battlefield under your control. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/smeagol_helpful_guide.txt b/forge-gui/res/cardsfolder/s/smeagol_helpful_guide.txt new file mode 100644 index 00000000000..0963203c197 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/smeagol_helpful_guide.txt @@ -0,0 +1,10 @@ +Name:Smeagol, Helpful Guide +ManaCost:1 B G +Types:Legendary Creature Halfling Horror +PT:4/2 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigTempt | TriggerDescription$ At the beginning of your end step, if a creature died under your control this turn, the Ring tempts you. +SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature.YouCtrl +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ RingTemptsYou | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDigUntil | TriggerDescription$ Whenever the Ring tempts you, target opponent reveals cards from the top of their library until they reveal a land card. Put that card onto the battlefield tapped under your control and the rest into their graveyard. +SVar:TrigDigUntil:DB$ DigUntil | Reveal$ True | ValidTgts$ Opponent | IsCurse$ True | Valid$ Land | ValidDescription$ land card | FoundDestination$ Battlefield | GainControl$ True | Tapped$ True | RevealedDestination$ Graveyard +Oracle:At the beginning of your end step, if a creature died under your control this turn, the Ring tempts you.\nWhenever the Ring tempts you, target opponent reveals cards from the top of their library until they reveal a land card. Put that card onto the battlefield tapped under your control and the rest into their graveyard. diff --git a/forge-gui/res/cardsfolder/s/soothing_of_smeagol.txt b/forge-gui/res/cardsfolder/s/soothing_of_smeagol.txt new file mode 100644 index 00000000000..470a95e50fd --- /dev/null +++ b/forge-gui/res/cardsfolder/s/soothing_of_smeagol.txt @@ -0,0 +1,6 @@ +Name:Soothing of Smeagol +ManaCost:1 U +Types:Instant +A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature.nonToken | TgtPrompt$ Select target nontoken creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ TrigTempt | SpellDescription$ Return target nontoken creature to its owner's hand. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Return target nontoken creature to its owner's hand. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/s/stalwarts_of_osgiliath.txt b/forge-gui/res/cardsfolder/s/stalwarts_of_osgiliath.txt new file mode 100644 index 00000000000..d354800d24d --- /dev/null +++ b/forge-gui/res/cardsfolder/s/stalwarts_of_osgiliath.txt @@ -0,0 +1,10 @@ +Name:Stalwarts of Osgiliath +ManaCost:4 W +Types:Creature Human Soldier +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw your second card each turn, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:When Stalwarts of Osgiliath enters the battlefield, the Ring tempts you.\nWhenever you draw your second card each turn, put a +1/+1 counter on Stalwarts of Osgiliath. diff --git a/forge-gui/res/cardsfolder/t/the_black_breath.txt b/forge-gui/res/cardsfolder/t/the_black_breath.txt new file mode 100644 index 00000000000..7519931da2d --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_black_breath.txt @@ -0,0 +1,6 @@ +Name:The Black Breath +ManaCost:2 B +Types:Sorcery +A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ TrigTempt | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:Creatures your opponents control get -1/-1 until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/t/the_ring_goes_south.txt b/forge-gui/res/cardsfolder/t/the_ring_goes_south.txt new file mode 100644 index 00000000000..5f9d787978f --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_ring_goes_south.txt @@ -0,0 +1,7 @@ +Name:The Ring Goes South +ManaCost:3 G +Types:Sorcery +A:SP$ RingTemptsYou | SubAbility$ DBDigUntil | SpellDescription$ The Ring tempts you. Then reveal cards from the top of your library until you reveal X land cards, where X is the number of legendary creatures you control. Put those land cards onto the battlefield tapped and the rest on the bottom of your library in a random order. +SVar:DBDigUntil:DB$ DigUntil | Amount$ X | Valid$ Land | ValidDescription$ land | FoundDestination$ Battlefield | Tapped$ True | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True +SVar:X:Count$Valid Creature.Legendary+YouCtrl +Oracle:The Ring tempts you. Then reveal cards from the top of your library until you reveal X land cards, where X is the number of legendary creatures you control. Put those land cards onto the battlefield tapped and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/t/there_and_back_again.txt b/forge-gui/res/cardsfolder/t/there_and_back_again.txt new file mode 100644 index 00000000000..08afbfddf48 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/there_and_back_again.txt @@ -0,0 +1,10 @@ +Name:There and Back Again +ManaCost:3 R R +Types:Enchantment Saga +K:Saga:3:DBCantBlock,DBSearch,DBToken +SVar:DBCantBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature | KW$ HIDDEN CARDNAME can't block. | SubAbility$ TrigTempt | IsCurse$ True | Duration$ UntilLoseControlOfHost | SpellDescription$ Up to one target creature can't block for as long as you control CARDNAME. The Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Mountain | SpellDescription$ Search your library for a Mountain card, put it onto the battlefield, then shuffle. +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ smaug | SpellDescription$ Create Smaug, a legendary 6/6 red Dragon creature token with flying, haste, and "When this creature dies, create fourteen Treasure tokens." +DeckHas:Ability$Token +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Up to one target creature can't block for as long as you control There and Back Again. The Ring tempts you.\nII — Search your library for a Mountain card, put it onto the battlefield, then shuffle.\nIII — Create Smaug, a legendary 6/6 red Dragon creature token with flying, haste, and "When this creature dies, create fourteen Treasure tokens." diff --git a/forge-gui/res/cardsfolder/t/took_reaper.txt b/forge-gui/res/cardsfolder/t/took_reaper.txt new file mode 100644 index 00000000000..b2c27bb40fc --- /dev/null +++ b/forge-gui/res/cardsfolder/t/took_reaper.txt @@ -0,0 +1,7 @@ +Name:Took Reaper +ManaCost:1 W +Types:Creature Halfling Peasant +PT:2/1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME dies, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:When Took Reaper dies, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/u/uruk_hai_berserker.txt b/forge-gui/res/cardsfolder/u/uruk_hai_berserker.txt new file mode 100644 index 00000000000..4d22be8ae84 --- /dev/null +++ b/forge-gui/res/cardsfolder/u/uruk_hai_berserker.txt @@ -0,0 +1,7 @@ +Name:Uruk-hai Berserker +ManaCost:2 B +Types:Creature Orc Berserker +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTempt | TriggerDescription$ When CARDNAME enters the battlefield, the Ring tempts you. +SVar:TrigTempt:DB$ RingTemptsYou +Oracle:When Uruk-hai Berserker enters the battlefield, the Ring tempts you. diff --git a/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt b/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt index 6412e132462..300bb3b7ef7 100644 --- a/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt +++ b/forge-gui/res/cardsfolder/upcoming/bill_the_pony.txt @@ -2,7 +2,7 @@ Name:Bill the Pony ManaCost:3 W Types:Legendary Creature Horse PT:1/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create two Food tokens. (They’re artifacts with "{2}, Sacrifice this artifact: You gain 3 life.") +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create two Food tokens. (They're artifacts with "{2}, Sacrifice this artifact: You gain 3 life.") SVar:TrigFood:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_food_sac | TokenOwner$ You A:AB$ Effect | Cost$ Sac<1/Food> | ValidTgts$ Creature.YouCtrl | RememberObjects$ Targeted | StaticAbilities$ CombatDamageToughness | ForgetOnMoved$ Battlefield | TgtPrompt$ Select target creature you control | SpellDescription$ Until end of turn, target creature you control assigns combat damage equal to its toughness rather than its power. SVar:CombatDamageToughness:Mode$ CombatDamageToughness | ValidCard$ Card.IsRemembered | Description$ This creature assigns combat damage equal to its toughness rather than its power. diff --git a/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt b/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt index a3dd4aaaf1e..8a30b1d839a 100644 --- a/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt +++ b/forge-gui/res/cardsfolder/upcoming/lord_of_the_nazgul.txt @@ -3,7 +3,7 @@ ManaCost:3 U B Types:Legendary Creature Wraith Noble PT:4/4 K:Flying -S:Mode$ Continuous | Affected$ Creature.Wraith+YouCtrl | AddKeyword$ Protection from Ringbearers | Description$ Wraiths you control have protection from Ring-bearers. +S:Mode$ Continuous | Affected$ Creature.Wraith+YouCtrl | AddKeyword$ Protection:Card.IsRingbearer:Protection from Ring-bearers | Description$ Wraiths you control have protection from Ring-bearers. T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 3/3 black Wraith creature token with menace. Then if you control nine or more Wraiths, Wraiths you control have base power and toughness 9/9 until end of turn. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_3_3_wraith_menace | TokenOwner$ You | SubAbility$ DBAnimateAll SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Wraith.YouCtrl | Power$ 9 | Toughness$ 9 | ConditionPresent$ Card.Wraith+YouCtrl | ConditionCompare$ GE9 diff --git a/forge-gui/res/cardsfolder/upcoming/saruman_the_white_hand.txt b/forge-gui/res/cardsfolder/upcoming/saruman_the_white_hand.txt index 00949ba4f4f..d840ae929ef 100644 --- a/forge-gui/res/cardsfolder/upcoming/saruman_the_white_hand.txt +++ b/forge-gui/res/cardsfolder/upcoming/saruman_the_white_hand.txt @@ -8,4 +8,4 @@ SVar:X:TriggeredStackInstance$CardManaCostLKI S:Mode$ Continuous | Affected$ Goblin.YouCtrl,Orc.YouCtrl | AddKeyword$ Ward:2 | Description$ Goblins and Orcs you control have ward {2}. DeckHas:Ability$Token|Counters & Type$Orc|Army DeckHints:Type$Goblin|Orc -Oracle:Whenever you cast a noncreature spell, amass Orcs X, where X is that spell’s mana value. (Put X +1/+1 counters on an Army you control. It’s also an Orc. If you don’t control an Army, create a 0/0 black Orc Army creature token first.)\nGoblins and Orcs you control have ward {2}. \ No newline at end of file +Oracle:Whenever you cast a noncreature spell, amass Orcs X, where X is that spell's mana value. (Put X +1/+1 counters on an Army you control. It's also an Orc. If you don't control an Army, create a 0/0 black Orc Army creature token first.)\nGoblins and Orcs you control have ward {2}. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/sting_the_glinting_dagger.txt b/forge-gui/res/cardsfolder/upcoming/sting_the_glinting_dagger.txt index 2c62b871b1e..006504bfdd5 100644 --- a/forge-gui/res/cardsfolder/upcoming/sting_the_glinting_dagger.txt +++ b/forge-gui/res/cardsfolder/upcoming/sting_the_glinting_dagger.txt @@ -5,5 +5,5 @@ K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Haste | Description$ Equipped creature gets +1/+1 and has haste. T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of each combat, untap equipped creature. SVar:TrigUntap:DB$ Untap | Defined$ Equipped -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ First Strike | IsPresent$ Creature.EquippedBy+blockingValid Goblin,Creature.EquippedBy+blockingValid Orc,Goblin.blockingValid Creature.EquippedBy,Orc.blockingValid Creature.EquippedBy | Description$ Equipped creature has first strike as long as it’s blocking or blocked by a Goblin or Orc. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ First Strike | IsPresent$ Creature.EquippedBy+blockingValid Goblin,Creature.EquippedBy+blockingValid Orc,Goblin.blockingValid Creature.EquippedBy,Orc.blockingValid Creature.EquippedBy | Description$ Equipped creature has first strike as long as it's blocking or blocked by a Goblin or Orc. Oracle:Equipped creature gets +1/+1 and has haste.\nAt the beginning of each combat, untap equipped creature.\nEquipped creature has first strike as long as it's blocking or blocked by a Goblin or Orc.\nEquip {2} \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/stone_of_erech.txt b/forge-gui/res/cardsfolder/upcoming/stone_of_erech.txt index 702ace5aa3c..8a3e230b353 100644 --- a/forge-gui/res/cardsfolder/upcoming/stone_of_erech.txt +++ b/forge-gui/res/cardsfolder/upcoming/stone_of_erech.txt @@ -6,4 +6,4 @@ SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | De A:AB$ ChangeZoneAll | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | SubAbility$ DBDraw | SpellDescription$ Exile target player's graveyard. Draw a card. SVar:DBDraw:DB$ Draw DeckHas:Ability$Graveyard|Sacrifice -Oracle:If a creature an opponent controls would die, exile it instead.\n{2}, {T}, Sacrifice Stone of Erech: Exile target player’s graveyard. Draw a card. +Oracle:If a creature an opponent controls would die, exile it instead.\n{2}, {T}, Sacrifice Stone of Erech: Exile target player's graveyard. Draw a card. diff --git a/forge-gui/res/cardsfolder/v/vorinclex_the_grand_evolution.txt b/forge-gui/res/cardsfolder/v/vorinclex_the_grand_evolution.txt index aae787c3618..6bf74bea92b 100644 --- a/forge-gui/res/cardsfolder/v/vorinclex_the_grand_evolution.txt +++ b/forge-gui/res/cardsfolder/v/vorinclex_the_grand_evolution.txt @@ -8,7 +8,7 @@ K:Trample K:Reach T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 2 -A:AB$ ChangeZone | Cost$ 6 G G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return it to the battlefield transformed under its owner’s control. Activate only as a sorcery. +A:AB$ ChangeZone | Cost$ 6 G G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AlternateMode:DoubleFaced diff --git a/forge-gui/res/cardsfolder/w/war_of_the_last_alliance.txt b/forge-gui/res/cardsfolder/w/war_of_the_last_alliance.txt new file mode 100644 index 00000000000..1d971268ef6 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/war_of_the_last_alliance.txt @@ -0,0 +1,9 @@ +Name:War of the Last Alliance +ManaCost:3 W +Types:Enchantment Saga +K:Saga:3:DBSearch,DBSearch,DBPump +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary creature card, reveal it, put it into your hand, then shuffle. +SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Double Strike | SubAbility$ TrigTempt | SpellDescription$ Creatures you control gain double strike until end of turn. +SVar:TrigTempt:DB$ RingTemptsYou +DeckNeeds:Type$Legendary & Type$Creature +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI, II — Search your library for a legendary creature card, reveal it, put it into your hand, then shuffle.\nIII — Creatures you control gain double strike until end of turn. The Ring tempts you. diff --git a/forge-gui/res/cardsfolder/w/witchking_of_angmar.txt b/forge-gui/res/cardsfolder/w/witchking_of_angmar.txt new file mode 100644 index 00000000000..441b1acf08b --- /dev/null +++ b/forge-gui/res/cardsfolder/w/witchking_of_angmar.txt @@ -0,0 +1,11 @@ +Name:Witch-king of Angmar +ManaCost:3 B B +Types:Legendary Creature Wraith Noble +PT:5/3 +K:Flying +T:Mode$ DamageDoneOnce | ValidSource$ Creature | TriggerZones$ Battlefield | ValidTarget$ You | CombatDamage$ True | Execute$ TrigSac | TriggerDescription$ Whenever one or more creatures deal combat damage to you, each opponent sacrifices a creature that dealt combat damage to you this turn. The Ring tempts you. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature.dealtCombatDamage You | Defined$ Player.Opponent | SubAbility$ TrigTempt +SVar:TrigTempt:DB$ RingTemptsYou +A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | KW$ Indestructible | SubAbility$ DBTap | SpellDescription$ CARDNAME gains indestructible until end of turn. Tap it. +SVar:DBTap:DB$ Tap | Defined$ Self +Oracle:Flying\nWhenever one or more creatures deal combat damage to you, each opponent sacrifices a creature that dealt combat damage to you this turn. The Ring tempts you.\nDiscard a card: Witch-king of Angmar gains indestructible until end of turn. Tap it. diff --git a/forge-gui/res/cardsfolder/w/wrenn_and_realmbreaker.txt b/forge-gui/res/cardsfolder/w/wrenn_and_realmbreaker.txt index 5f7c07fc0bb..9adc8df668e 100644 --- a/forge-gui/res/cardsfolder/w/wrenn_and_realmbreaker.txt +++ b/forge-gui/res/cardsfolder/w/wrenn_and_realmbreaker.txt @@ -11,4 +11,4 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Wrenn and Realmbreaker | Image$ emblem_wrenn_and_realmbreaker | StaticAbilities$ PermanentRecycle | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "You may play lands and cast permanent spells from your graveyard." SVar:PermanentRecycle:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Permanent+YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands and cast permanent spells from your graveyard. DeckHas:Ability$Graveyard -Oracle:Lands you control have "{T}: Add one mana of any color."\n[+1]: Up to one target land you control becomes a 3/3 Elemental creature with vigilance, hexproof, and haste until your next turn. It’s still a land.\n[−2]: Mill three cards. You may put a permanent card from among the milled cards into your hand.\n[−7]: You get an emblem with "You may play lands and cast permanent spells from your graveyard." +Oracle:Lands you control have "{T}: Add one mana of any color."\n[+1]: Up to one target land you control becomes a 3/3 Elemental creature with vigilance, hexproof, and haste until your next turn. It's still a land.\n[−2]: Mill three cards. You may put a permanent card from among the milled cards into your hand.\n[−7]: You get an emblem with "You may play lands and cast permanent spells from your graveyard." diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index c82a4e8b89c..a0ee950342c 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1355,6 +1355,8 @@ lblGraveyard=Friedhof lblAssignSectorCreature=Weise {0} einem Bereich zu lblChooseSectorEffect=Wähle Bereich lblChooseRollIgnore=Welchen Wurf ignorieren? +lblChooseRingBearer=Wählen Sie Ihren Ringträger +lblTheRingTempts=Der Ring verführt {0} lblTop=Oben drauf lblBottom=Unten drunter lblNColorManaFromCard={0} {1} Mana von {2} diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 9736105a85f..cd41de76cdd 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1360,6 +1360,8 @@ lblGraveyard=Graveyard lblAssignSectorCreature=Assign {0} to a sector lblChooseSectorEffect=Choose a sector lblChooseRollIgnore=Choose a roll to ignore +lblChooseRingBearer=Choose your Ring-bearer +lblTheRingTempts=The Ring tempts {0} lblTop=Top lblBottom=Bottom lblNColorManaFromCard={0} {1} mana from {2} diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index db51a1489a5..6578d9f01a2 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1353,9 +1353,11 @@ lblThereNoCardInPlayerZone=No hay cartas en {0} {1} lblPutCardsOnTheTopLibraryOrGraveyard=¿Poner {0} en la parte superior de la biblioteca o en el cementerio? lblLibrary=Biblioteca lblGraveyard=Cementerio -lblAssignSectorCreature=Assign {0} to a sector -lblChooseSectorEffect=Choose a sector -lblChooseRollIgnore=Choose a roll to ignore +lblAssignSectorCreature=Asignar {0} a un sector +lblChooseSectorEffect=Elija un sector +lblChooseRollIgnore=Elija un rollo para ignorar +lblChooseRingBearer=Elige a tu portador de anillo +lblTheRingTempts=El anillo tienta {0} lblTop=Superior lblBottom=Fondo lblNColorManaFromCard={0} {1} maná de {2} diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 07aab7dfcbb..2fe88e77f9e 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -1356,8 +1356,11 @@ lblThereNoCardInPlayerZone=Il n''y a pas de cartes dans {0} {1} lblPutCardsOnTheTopLibraryOrGraveyard=Placer {0} au-dessus de la bibliothèque ou du cimetière ? lblLibrary=Bibliothèque lblGraveyard=Cimetière -lblAssignSectorCreature=Assign {0} to a sectorlblChooseSectorEffect=Choose a sector -lblChooseRollIgnore=Choose a roll to ignore +lblAssignSectorCreature=Attribuer {0} à un secteur +lblChooseSectorEffect=Choisissez un secteur +lblChooseRollIgnore=Choisissez un rouleau pour ignorer +lblChooseRingBearer=Choisissez votre porte-anneau +lblTheRingTempts=L''anneau tente {0} lblTop=Haut lblBottom=Bas lblNColorManaFromCard={0} {1} mana de {2} @@ -2115,7 +2118,7 @@ lblRemoveFromGame=Supprimer la carte du jeu lblRiggedRoll=Roll planaire gréé lblWalkTo=Transplaner vers lblAskAI=Demander une suggestion à l''IA -lblAskSimulationAI=Demander à l'IA de simulation une suggestion +lblAskSimulationAI=Demander à l''IA de simulation une suggestion #PhaseType.java lblUntapStep=Étape de dégagement lblUpkeepStep=Étape d''entretien @@ -2984,9 +2987,9 @@ lblToken=Jeton lblBackToAdventure=Retour à l'aventure lblDisableWinLose=Désactiver la superposition Winlose lblExitToWoldMap=Sortir sur la carte du monde? -lblStartArena=Voulez-vous entrer dans l'arène? +lblStartArena=Voulez-vous entrer dans l''arène? lblWouldYouLikeDestroy=Souhaitez-vous détruire {0}? -lblAdventureDescription=Le mode aventure est l'endroit où vous explorez le paysage en constante évolution de Shandalar, et des créatures duel pour gagner de l'or, des éclats, de l'équipement et de nouvelles cartes pour devenir les meilleurs et les récupérer tous! +lblAdventureDescription=Le mode aventure est l''endroit où vous explorez le paysage en constante évolution de Shandalar, et des créatures duel pour gagner de l'or, des éclats, de l'équipement et de nouvelles cartes pour devenir les meilleurs et les récupérer tous! lblEmptyDeck=Jeu de cartes vide lblNoAvailableSlots=Aucune fente disponible lblAdventure=Aventure diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 2bea9a82e70..e7610f1fa66 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1353,9 +1353,11 @@ lblThereNoCardInPlayerZone=Non ci sono carte in {0} {1} lblPutCardsOnTheTopLibraryOrGraveyard=Metti {0} in cima al grimorio o nel cimitero? lblLibrary=Grimorio lblGraveyard=Cimitero -lblAssignSectorCreature=Assign {0} to a sector -lblChooseSectorEffect=Choose a sector -lblChooseRollIgnore=Choose a roll to ignore +lblAssignSectorCreature=Assegna {0} a un settore +lblChooseSectorEffect=Scegli un settore +lblChooseRollIgnore=Scegli un tiro per ignorare +lblChooseRingBearer=Scegli il tuo anello +lblTheRingTempts=L''anello tenta {0} lblTop=Cima lblBottom=Fondo lblNColorManaFromCard={0} {1} mana da {2} @@ -2983,7 +2985,7 @@ lblToken=Gettone lblBackToAdventure=Torna all'avventura lblDisableWinLose=Disabilita overlay winlose lblExitToWoldMap=Esci alla mappa del mondo? -lblStartArena=Vuoi andare nell'arena? +lblStartArena=Vuoi andare nell''arena? lblWouldYouLikeDestroy=Vorresti distruggere {0}? lblAdventureDescription=La modalità Adventure è dove esplori il paesaggio in continua evoluzione di Shandalar e le creature di duello per guadagnare oro, frammenti, attrezzature e nuove carte per diventare i migliori e raccoglierle tutte! lblEmptyDeck=Mazzo di carte vuoto diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index a5e4ed6c775..d63f43ce5f0 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -1354,9 +1354,11 @@ lblThereNoCardInPlayerZone={0} {1}にカードがありません lblPutCardsOnTheTopLibraryOrGraveyard=ライブラリまたは墓地の一番上に{0}を置きますか? lblLibrary=ライブラリー lblGraveyard=墓地 -lblAssignSectorCreature=Assign {0} to a sector -lblChooseSectorEffect=Choose a sector -lblChooseRollIgnore=Choose a roll to ignore +lblAssignSectorCreature={0}をセクターに割り当てます +lblChooseSectorEffect=セクターを選択してください +lblChooseRollIgnore=無視するロールを選択してください +lblChooseRingBearer=リングベアラーを選択してください +lblTheRingTempts=リングが誘惑されます {0} lblTop=タップ lblBottom=ボトム lblNColorManaFromCard={2}から {0} {1} のマナ diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index e1c2677a35e..7b077ea3523 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -1384,9 +1384,11 @@ lblThereNoCardInPlayerZone=Sem cartas em {0} {1} lblPutCardsOnTheTopLibraryOrGraveyard=Colocar {0} no topo do grimório ou cemitério? lblLibrary=Grimório lblGraveyard=Cemitério -lblAssignSectorCreature=Assign {0} to a sector -lblChooseSectorEffect=Choose a sector -lblChooseRollIgnore=Choose a roll to ignore +lblAssignSectorCreature=Atribuir {0} a um setor +lblChooseSectorEffect=Escolha um setor +lblChooseRollIgnore=Escolha um rolo para ignorar +lblChooseRingBearer=Escolha o seu portador de anel +lblTheRingTempts=O anel tenta {0} lblTop=Topo lblBottom=Fundo lblNColorManaFromCard={0} {1} mana de {2} diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 3cfbca058d0..0a7a5b1c012 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1360,6 +1360,8 @@ lblGraveyard=坟场 lblAssignSectorCreature=将{0}分配给一部分 lblChooseSectorEffect=选择一部分 lblChooseRollIgnore=选择要忽略的骰子 +lblChooseRingBearer=选择您的戒指者 +lblTheRingTempts=戒指 {0} lblTop=顶 lblBottom=底 lblNColorManaFromCard={2}产{0}个{1}法术力 diff --git a/forge-gui/res/lists/token-images.txt b/forge-gui/res/lists/token-images.txt index 3a2dcba16ab..f193a4e5808 100644 --- a/forge-gui/res/lists/token-images.txt +++ b/forge-gui/res/lists/token-images.txt @@ -2303,6 +2303,7 @@ monarch_cmr.jpg https://downloads.cardforge.org/images/tokens/monarch_cmr.jpg monarch_moc.jpg https://downloads.cardforge.org/images/tokens/monarch_moc.jpg morph.jpg https://downloads.cardforge.org/images/tokens/morph.jpg night_mid.jpg https://downloads.cardforge.org/images/tokens/night_mid.jpg +the_ring.jpg https://downloads.cardforge.org/images/tokens/the_ring.jpg #Pets diff --git a/forge-gui/res/skins/default/sprite_manaicons.png b/forge-gui/res/skins/default/sprite_manaicons.png index 1984711327fc03d9abb7b69728cc1d6419815ba3..1b189e9e7404d18686f900939bb0357436a55d2b 100644 GIT binary patch delta 38056 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 delta 28896 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 diff --git a/forge-gui/res/tokenscripts/smaug.txt b/forge-gui/res/tokenscripts/smaug.txt new file mode 100644 index 00000000000..d6db40ec5b0 --- /dev/null +++ b/forge-gui/res/tokenscripts/smaug.txt @@ -0,0 +1,10 @@ +Name:Smaug +ManaCost:no cost +Types:Legendary Creature Dragon +Colors:red +PT:6/6 +K:Flying +K:Haste +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature dies, create fourteen Treasure tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 14 | TokenScript$ c_a_treasure_sac +Oracle:Flying, haste\nWhen this creature dies, create fourteen Treasure tokens. diff --git a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java index 917cf365d9b..35638a2c13e 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java @@ -534,6 +534,14 @@ public class CardDetailUtil { area.append("(Class Level:").append(card.getClassLevel()).append(")"); } + //ring level + if (card.getRingLevel() > 0 && card.getZone() == ZoneType.Command) { + if (area.length() != 0) { + area.append("\n\n"); + } + area.append("(Ring Level:").append(card.getRingLevel()).append(")"); + } + // sector if (!card.getSector().isEmpty()) { if (area.length() != 0) { diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index ad9a5ee6fcc..015d8212584 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -489,6 +489,7 @@ public enum FSkinProp { IMG_QUEST_DRAFT_DECK (new int[] {0, 0, 680, 475}, PropType.IMAGE), //COMMANDER IMG_ABILITY_COMMANDER (new int[] {330, 576, 80, 80}, PropType.ABILITY), + IMG_ABILITY_RINGBEARER (new int[] {410, 822, 80, 80}, PropType.MANAICONS), //TOXIC IMG_ABILITY_TOXIC (new int[] {630, 1536, 46, 46}, PropType.ICON), //Ability Icons