From 26e0a7f4a780e3854d139996ad888098f971e6c1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 11:43:02 -0400 Subject: [PATCH 01/10] Split "confirm" and "select" decisions for removing counters --- forge-gui/res/languages/de-DE.properties | 1 + forge-gui/res/languages/en-US.properties | 3 ++- forge-gui/res/languages/es-ES.properties | 3 ++- forge-gui/res/languages/fr-FR.properties | 3 ++- forge-gui/res/languages/it-IT.properties | 1 + forge-gui/res/languages/ja-JP.properties | 1 + forge-gui/res/languages/pt-BR.properties | 3 ++- forge-gui/res/languages/zh-CN.properties | 1 + forge-gui/src/main/java/forge/player/HumanCostDecision.java | 6 +++--- 9 files changed, 15 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 8b32be964a6..7881180084a 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -2410,6 +2410,7 @@ lblSelectNMoreTypeCardsTpReveal=Wähle {0} weitere {1} Karte(n) zum Vorzeigen. lblSelectTargetCounter=Wähle {0} um Marke zu entfernen lblRemoveCounterFromCard=Entferne Marke von Karte lblRemoveAllCountersConfirm=Entferne alle Marken? +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from lblRemoveNTargetCounterFromCardPayCostConfirm=Zahle Kosten: Entferne {0}{1}-Marken von {2}? lblRemoveCountersFromAInZoneCard=Entferne Marke(n) von einer Karte in {0} lblSacrificeCardConfirm=Opfere {0}? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index c05cb9b8e63..168afa23801 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2408,7 +2408,8 @@ lblSelectNMoreTypeCardsTpReveal=Select {0} more {1} card(s) to reveal. lblSelectTargetCounter=Select {0} to remove a counter lblRemoveCounterFromCard=remove counter from card lblRemoveAllCountersConfirm=Remove all counters? -lblRemoveNTargetCounterFromCardPayCostConfirm=Select {2} to remove {0}{1} counter(s) from +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from +lblRemoveNTargetCounterFromCardPayCostConfirm=Remove {0} {1} counter(s) from {2}? lblRemoveCountersFromAInZoneCard=Remove counter(s) from a card in {0} lblSacrificeCardConfirm=Sacrifice {0}? lblSelectATargetToSacrifice=Select {0} to sacrifice ({1} left) diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index ecb2925ae2e..e61fe9fe460 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2408,7 +2408,8 @@ lblSelectNMoreTypeCardsTpReveal=Selecciona {0} más {1} carta(s) para mostrar. lblSelectTargetCounter=Selecciona {0} para quitar un contador lblRemoveCounterFromCard=quitar contador de la carta lblRemoveAllCountersConfirm=¿Quitar todos los contadores? -lblRemoveNTargetCounterFromCardPayCostConfirm=Paga el coste: ¿Quitar el contador de {0}{1} de {2}? +lblRemoveNTargetCounterFromCardPayCostSelect=Selecciona {2} para quitar {0}{1} contador(es) de +lblRemoveNTargetCounterFromCardPayCostConfirm=Paga el coste: ¿Quitar el contador de {0} {1} de {2}? lblRemoveCountersFromAInZoneCard=Quitar contador(es) de una carta en {0} lblSacrificeCardConfirm=¿Sacrificar {0}? lblSelectATargetToSacrifice=Selecciona un {0} para sacrificar ({1} pendiente) diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index e2dd27d8fe9..fb10fcf90d9 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -2410,7 +2410,8 @@ lblSelectNMoreTypeCardsTpReveal=Sélectionnez {0} plus {1} carte(s) à révéler lblSelectTargetCounter=Sélectionnez {0} pour supprimer un compteur lblRemoveCounterFromCard=supprimer le compteur de la carte lblRemoveAllCountersConfirm=Supprimer tous les compteurs ? -lblRemoveNTargetCounterFromCardPayCostConfirm=Sélectionnez {2} pour supprimer {0}{1} compteur(s) de +lblRemoveNTargetCounterFromCardPayCostSelect=Sélectionnez {2} pour supprimer {0} {1} compteur(s) de +lblRemoveNTargetCounterFromCardPayCostConfirm=Supprimer {0} {1} compteur(s) de {2}? lblRemoveCountersFromAInZoneCard=Supprimer le(s) compteur(s) d''une carte dans {0} lblSacrificeCardConfirm=Sacrifice {0} ? lblSelectATargetToSacrifice=Sélectionnez {0} à sacrifier ({1} à gauche) diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 386c3d730df..429c6863aba 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -2407,6 +2407,7 @@ lblSelectNMoreTypeCardsTpReveal=Seleziona ancora {0} carta/e {1} da rivelare. lblSelectTargetCounter=Seleziona una carta {0} da cui rimuovere un segnalino lblRemoveCounterFromCard=rimuovi un segnalino dalla carta lblRemoveAllCountersConfirm=Vuoi rimuovere tutti i segnalini? +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from lblRemoveNTargetCounterFromCardPayCostConfirm=Paga il costot: Vuoi rimuovere {0} segnalini {1} da {2}? lblRemoveCountersFromAInZoneCard=Rimuovi segnalini da una carta in {0} lblSacrificeCardConfirm=Vuoi sacrificare {0}? diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 6ea2e2b69f0..483fcaf9ad9 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -2407,6 +2407,7 @@ lblSelectNMoreTypeCardsTpReveal=公開するもっと {0}枚の {1}カードを lblSelectTargetCounter=カウンターを取り除く {0}を選ぶ lblRemoveCounterFromCard=カードからカウンターを取り除く lblRemoveAllCountersConfirm=すべてのカウンターを取り除きますか? +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from lblRemoveNTargetCounterFromCardPayCostConfirm=支払い:{2}から {0}個の {1}カウンターを取り除きますか? lblRemoveCountersFromAInZoneCard={0}の 1枚のカードからカウンターを取り除きます lblSacrificeCardConfirm={0}を生け贄に捧げますか? diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 779b35fc2b8..070589f0739 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -2483,7 +2483,8 @@ lblSelectNMoreTypeCardsTpReveal=Escolha mais {0} carta(s) {1} para revelar. lblSelectTargetCounter=Selecione {0} para remover um marcador lblRemoveCounterFromCard=remover marcador do cartão lblRemoveAllCountersConfirm=Remover todos os marcadores? -lblRemoveNTargetCounterFromCardPayCostConfirm=Remover {0}{1} contador(es) de {2}? +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from +lblRemoveNTargetCounterFromCardPayCostConfirm=Remover {0} {1} contador(es) de {2}? lblRemoveCountersFromAInZoneCard=Remover marcador(es) de uma carta em {0} lblSacrificeCardConfirm=Sacrificar {0}? lblSelectATargetToSacrifice=Selecione {0} para sacrificar ({1} restantes) diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index f25952cfc3c..295736eb2f1 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -2409,6 +2409,7 @@ lblSelectNMoreTypeCardsTpReveal=在选择{0}张{1}牌进行展示。 lblSelectTargetCounter=选择{0}移去一个指示物 lblRemoveCounterFromCard=从牌上移去指示物 lblRemoveAllCountersConfirm=移去所有指示物? +lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from lblRemoveNTargetCounterFromCardPayCostConfirm=支付费用:从{2}上移去{0}个{1}指示物? lblRemoveCountersFromAInZoneCard=从一个{0}中的牌移去指示物 lblSacrificeCardConfirm=牺牲{0}? diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index b0d21c28d6b..efabe1d6ce0 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -831,11 +831,11 @@ public class HumanCostDecision extends CostDecisionMakerBase { this.validChoices = validCards; counterType = cType; String fromWhat = costPart.getDescriptiveType(); - if (fromWhat.equals("CARDNAME")) { - fromWhat = sa.getHostCard().getName(); + if (fromWhat.equals("CARDNAME") || fromWhat.equals("NICKNAME")) { + fromWhat = CardTranslation.getTranslatedName(sa.getHostCard().getName()); } - setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm", + setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostSelect", "%d", counterType == null ? "" : " " + counterType.getName().toLowerCase(), fromWhat)); } From 81a9ca2a0a9aa0f41fcf378bcbe6c39e97e348d4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 11:44:23 -0400 Subject: [PATCH 02/10] ManaEffect.getStackDescription add the players making mana to the stackDescription --- .../src/main/java/forge/game/ability/effects/ManaEffect.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 56ae7f19819..75f93f95a0a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -5,6 +5,7 @@ import static forge.util.TextUtil.toManaString; import java.util.List; import java.util.Map; +import forge.util.Lang; import org.apache.commons.lang3.StringUtils; import forge.card.ColorSet; @@ -264,9 +265,11 @@ public class ManaEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); + final List tgtPlayers = getDefinedPlayersOrTargeted(sa); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; - sb.append("Add ").append(toManaString(mana)).append("."); + sb.append(Lang.joinHomogenous(tgtPlayers)).append(tgtPlayers.size() == 1 ? " adds " : " add "); + sb.append(toManaString(mana)).append("."); if (sa.hasParam("RestrictValid")) { sb.append(" "); final String desc = sa.getDescription(); From 1e2bb80e6d8523604f285f1cf520e429d9c045d5 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:05:21 -0400 Subject: [PATCH 03/10] parse and support X1+ in cost for "remove one or more counters" in desc --- .../src/main/java/forge/game/cost/Cost.java | 16 ++++++++++++--- .../forge/game/cost/CostRemoveAnyCounter.java | 20 ++++++++++++------- .../forge/game/cost/CostRemoveCounter.java | 17 ++++++++-------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 731e36e9e1a..45a33863ba1 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -289,13 +289,18 @@ public class Cost implements Serializable { } if (parse.startsWith("SubCounter<")) { - // SubCounter + // SubCounter final String[] splitStr = abCostParse(parse, 5); final String type = splitStr.length > 2 ? splitStr[2] : "CARDNAME"; final String description = splitStr.length > 3 ? splitStr[3] : null; final ZoneType zone = splitStr.length > 4 ? ZoneType.smartValueOf(splitStr[4]) : ZoneType.Battlefield; + boolean oneOrMore = false; + if (splitStr[0].equals("X1+")) { + oneOrMore = true; + splitStr[0] = "X"; + } - return new CostRemoveCounter(splitStr[0], CounterType.getType(splitStr[1]), type, description, zone); + return new CostRemoveCounter(splitStr[0], CounterType.getType(splitStr[1]), type, description, zone, oneOrMore); } if (parse.startsWith("AddCounter<")) { @@ -401,7 +406,12 @@ public class Cost implements Serializable { if (parse.startsWith("RemoveAnyCounter<")) { final String[] splitStr = abCostParse(parse, 4); final String description = splitStr.length > 3 ? splitStr[3] : null; - return new CostRemoveAnyCounter(splitStr[0], CounterType.getType(splitStr[1]), splitStr[2], description); + boolean oneOrMore = false; + if (splitStr[0].equals("X1+")) { + oneOrMore = true; + splitStr[0] = "X"; + } + return new CostRemoveAnyCounter(splitStr[0], CounterType.getType(splitStr[1]), splitStr[2], description, oneOrMore); } if (parse.startsWith("Exile<")) { diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index a9c6f2c0b60..69d3350f2c7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -41,10 +41,11 @@ public class CostRemoveAnyCounter extends CostPart { */ private static final long serialVersionUID = 1L; // RemoveAnyCounter - // Power Conduit and Chisei, Heart of Oceans - // Both cards have "Remove a counter from a permanent you control" + // things like "Remove a counter from a permanent you control" + // or "Remove one or more +1/+1 counters from among artifacts you control" public final CounterType counter; + public final Boolean oneOrMore; /** * Instantiates a new cost CostRemoveAnyCounter. @@ -52,9 +53,10 @@ public class CostRemoveAnyCounter extends CostPart { * @param amount * the amount */ - public CostRemoveAnyCounter(final String amount, final CounterType counter, final String type, final String description) { + public CostRemoveAnyCounter(final String amount, final CounterType counter, final String type, final String description, final boolean oneOrMore) { super(amount, type, description); this.counter = counter; + this.oneOrMore = oneOrMore; } @Override @@ -99,12 +101,16 @@ public class CostRemoveAnyCounter extends CostPart { public final String toString() { final StringBuilder sb = new StringBuilder(); - String counters = this.counter == null ? "counter" : this.counter.getName().toLowerCase() + " counter"; + final String counters = this.counter == null ? "counter" : this.counter.getName().toLowerCase() + " counter"; + final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); sb.append("Remove "); - sb.append(Cost.convertAmountTypeToWords(this.convertAmount(), this.getAmount(), counters)); - sb.append(this.getAmount().equals("1") ? "" : "s"); - final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); + if (oneOrMore) { + sb.append("one or more ").append(counters).append("s"); + } else { + sb.append(Cost.convertAmountTypeToWords(this.convertAmount(), this.getAmount(), counters)); + sb.append(this.getAmount().equals("1") ? "" : "s"); + } sb.append(" from ").append(desc); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index ad143a8cc36..08b3b80c927 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -35,18 +35,13 @@ import forge.game.zone.ZoneType; public class CostRemoveCounter extends CostPart { // SubCounter - // Here are the cards that have RemoveCounter - // Ion Storm, Noviken Sages, Ghave, Guru of Spores, Power Conduit (any - // Counter is tough), - // Quillspike, Rift Elemental, Sage of Fables, Spike Rogue - - /** * Serializables need a version ID. */ private static final long serialVersionUID = 1L; public final CounterType counter; public final ZoneType zone; + public final Boolean oneOrMore; /** * Instantiates a new cost remove counter. @@ -61,11 +56,12 @@ public class CostRemoveCounter extends CostPart { * the description * @param zone the zone. */ - public CostRemoveCounter(final String amount, final CounterType counter, final String type, final String description, ZoneType zone) { + public CostRemoveCounter(final String amount, final CounterType counter, final String type, final String description, final ZoneType zone, final boolean oneOrMore) { super(amount, type, description); this.counter = counter; this.zone = zone; + this.oneOrMore = oneOrMore; } @Override @@ -108,7 +104,12 @@ public class CostRemoveCounter extends CostPart { } else { sb.append("Remove "); if (this.getAmount().equals("X")) { - sb.append("any number of counters"); + if (oneOrMore) { + sb.append("one or more "); + } else { + sb.append("any number of "); + } + sb.append(this.counter.getName().toLowerCase()).append(" counters"); } else if (this.getAmount().equals("All")) { sb.append("all ").append(this.counter.getName().toLowerCase()).append(" counters"); } else { From 2e90cf39fc84bc107458721f30562524de743ff4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:05:35 -0400 Subject: [PATCH 04/10] jetfire_ingenious_scientist_jetfire_air_guardian.txt --- ...genious_scientist_jetfire_air_guardian.txt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/jetfire_ingenious_scientist_jetfire_air_guardian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/jetfire_ingenious_scientist_jetfire_air_guardian.txt b/forge-gui/res/cardsfolder/upcoming/jetfire_ingenious_scientist_jetfire_air_guardian.txt new file mode 100644 index 00000000000..1d730b348c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jetfire_ingenious_scientist_jetfire_air_guardian.txt @@ -0,0 +1,27 @@ +Name:Jetfire, Ingenious Scientist +ManaCost:4 U +Types:Legendary Artifact Creature Robot +PT:3/4 +K:More Than Meets the Eye:3 U +K:Flying +A:AB$ Mana | Cost$ RemoveAnyCounter | ValidTgts$ Player | Produced$ C | Amount$ X | AmountDesc$ for each counter removed | XCantBe0$ True | RestrictValid$ CantCastNonArtifactSpells | SpellDescription$ Target player adds that much {C}. This mana can't be spent to cast nonartifact spells. +SVar:DBConvert:DB$ SetState | Mode$ Convert | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME. +SVar:X:Count$xPaid +AlternateMode:Convert +AI:RemoveDeck:All +DeckHints:Ability$Counters & Keyword$Adapt|Modular +Oracle:More Than Meets the Eye {3}{U} (You may cast this card converted for {3}{U}.)\nFlying\nRemove one or more +1/+1 counters from among artifacts you control: Target player adds that much {C}. This mana can't be spent to cast nonartifact spells. Convert Jetfire. + +ALTERNATE + +Name:Jetfire, Air Guardian +ManaCost:no cost +Colors:blue +Types:Legendary Artifact Vehicle +PT:3/4 +K:Living metal +K:Flying +A:AB$ SetState | Cost$ U U U | Mode$ Convert | SubAbility$ DBAdapt | StackDescription$ Convert NICKNAME, | SpellDescription$ Convert NICKNAME, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.) +SVar:DBAdapt:DB$ PutCounter | Adapt$ True | CounterNum$ 3 | CounterType$ P1P1 | StackDescription$ then adapt 3. +DeckHas:Ability$Counters +Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nFlying\n{U}{U}{U}: Convert Jetfire, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.) From 2361d4a6e6330e40eb3b882e3954ad7daa1ed2f2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:07:48 -0400 Subject: [PATCH 05/10] remove CostDesc from old cards --- forge-gui/res/cardsfolder/b/black_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/b/blue_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/b/bottomless_vault.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_hold.txt | 2 +- forge-gui/res/cardsfolder/f/fountain_of_cho.txt | 2 +- forge-gui/res/cardsfolder/g/green_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/h/hollow_trees.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_store.txt | 2 +- forge-gui/res/cardsfolder/m/mage_ring_network.txt | 2 +- forge-gui/res/cardsfolder/m/mercadian_bazaar.txt | 2 +- forge-gui/res/cardsfolder/r/red_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/r/rushwood_grove.txt | 2 +- forge-gui/res/cardsfolder/s/sand_silos.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_cove.txt | 2 +- forge-gui/res/cardsfolder/s/subterranean_hangar.txt | 2 +- forge-gui/res/cardsfolder/w/white_mana_battery.txt | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/black_mana_battery.txt b/forge-gui/res/cardsfolder/b/black_mana_battery.txt index 89b5501bcd4..a60c3679353 100644 --- a/forge-gui/res/cardsfolder/b/black_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/black_mana_battery.txt @@ -2,7 +2,7 @@ Name:Black Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ B | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ B | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. SVar:DBMana: DB$ Mana | Produced$ B | Amount$ X SVar:X:Count$xPaid AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt index 3930ad99865..117f093403c 100644 --- a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt @@ -2,7 +2,7 @@ Name:Blue Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. SVar:DBMana: DB$ Mana | Produced$ U | Amount$ X SVar:X:Count$xPaid AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/b/bottomless_vault.txt b/forge-gui/res/cardsfolder/b/bottomless_vault.txt index d4e6ca8bcb5..46480279a16 100644 --- a/forge-gui/res/cardsfolder/b/bottomless_vault.txt +++ b/forge-gui/res/cardsfolder/b/bottomless_vault.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. K:You may choose not to untap CARDNAME during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 -A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {B} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {B} for each storage counter removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Bottomless Vault enters the battlefield tapped.\nYou may choose not to untap Bottomless Vault during your untap step.\nAt the beginning of your upkeep, if Bottomless Vault is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Bottomless Vault: Add {B} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/d/dwarven_hold.txt b/forge-gui/res/cardsfolder/d/dwarven_hold.txt index cb501c8603c..46c86e5fb25 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_hold.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_hold.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. K:You may choose not to untap CARDNAME during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {R} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {R} for each storage counter removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Dwarven Hold enters the battlefield tapped.\nYou may choose not to untap Dwarven Hold during your untap step.\nAt the beginning of your upkeep, if Dwarven Hold is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Dwarven Hold: Add {R} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt index 4931bcbbfe9..04540b64f8f 100644 --- a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt +++ b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:Fountain of Cho enters the battlefield tapped.\n{T}: Put a storage counter on Fountain of Cho.\n{T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/g/green_mana_battery.txt b/forge-gui/res/cardsfolder/g/green_mana_battery.txt index c6a15a98ed8..96890f2623c 100644 --- a/forge-gui/res/cardsfolder/g/green_mana_battery.txt +++ b/forge-gui/res/cardsfolder/g/green_mana_battery.txt @@ -2,7 +2,7 @@ Name:Green Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. SVar:DBMana: DB$ Mana | Produced$ G | Amount$ X SVar:X:Count$xPaid AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/h/hollow_trees.txt b/forge-gui/res/cardsfolder/h/hollow_trees.txt index fed17d479f7..04c145d2d52 100644 --- a/forge-gui/res/cardsfolder/h/hollow_trees.txt +++ b/forge-gui/res/cardsfolder/h/hollow_trees.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. K:You may choose not to untap CARDNAME during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {G} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {G} for each storage counter removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Hollow Trees enters the battlefield tapped.\nYou may choose not to untap Hollow Trees during your untap step.\nAt the beginning of your upkeep, if Hollow Trees is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Hollow Trees: Add {G} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/i/icatian_store.txt b/forge-gui/res/cardsfolder/i/icatian_store.txt index a1beaed1559..1575636e018 100644 --- a/forge-gui/res/cardsfolder/i/icatian_store.txt +++ b/forge-gui/res/cardsfolder/i/icatian_store.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. K:You may choose not to untap CARDNAME during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {W} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {W} for each storage counter removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Icatian Store enters the battlefield tapped.\nYou may choose not to untap Icatian Store during your untap step.\nAt the beginning of your upkeep, if Icatian Store is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Icatian Store: Add {W} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/m/mage_ring_network.txt b/forge-gui/res/cardsfolder/m/mage_ring_network.txt index e5e5f296b5b..8300cd85f4f 100644 --- a/forge-gui/res/cardsfolder/m/mage_ring_network.txt +++ b/forge-gui/res/cardsfolder/m/mage_ring_network.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ X | CostDesc$ {T}, Remove X storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {C} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {C} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Mage-Ring Network.\n{T}, Remove any number of storage counters from Mage-Ring Network: Add {C} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt index b5248276be6..1c0dffad09c 100644 --- a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt +++ b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:Mercadian Bazaar enters the battlefield tapped.\n{T}: Put a storage counter on Mercadian Bazaar.\n{T}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/r/red_mana_battery.txt b/forge-gui/res/cardsfolder/r/red_mana_battery.txt index 978489d3922..e84a79f6ce5 100644 --- a/forge-gui/res/cardsfolder/r/red_mana_battery.txt +++ b/forge-gui/res/cardsfolder/r/red_mana_battery.txt @@ -2,7 +2,7 @@ Name:Red Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. SVar:DBMana: DB$ Mana | Produced$ R | Amount$ X SVar:X:Count$xPaid AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/r/rushwood_grove.txt b/forge-gui/res/cardsfolder/r/rushwood_grove.txt index 7e6c88b37a9..362f6b526cd 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_grove.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_grove.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:Rushwood Grove enters the battlefield tapped.\n{T}: Put a storage counter on Rushwood Grove.\n{T}, Remove any number of storage counters from Rushwood Grove: Add {G} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/sand_silos.txt b/forge-gui/res/cardsfolder/s/sand_silos.txt index b964db35146..4c682ebedcb 100644 --- a/forge-gui/res/cardsfolder/s/sand_silos.txt +++ b/forge-gui/res/cardsfolder/s/sand_silos.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. K:You may choose not to untap CARDNAME during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {U} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {U} for each storage counter removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Sand Silos enters the battlefield tapped.\nYou may choose not to untap Sand Silos during your untap step.\nAt the beginning of your upkeep, if Sand Silos is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Sand Silos: Add {U} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt index de5d93e32ba..98791c348f5 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:Saprazzan Cove enters the battlefield tapped.\n{T}: Put a storage counter on Saprazzan Cove.\n{T}, Remove any number of storage counters from Saprazzan Cove: Add {U} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt index 40ac5e83eb6..462138a4361 100644 --- a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt +++ b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each storage counter removed this way. SVar:X:Count$xPaid Oracle:Subterranean Hangar enters the battlefield tapped.\n{T}: Put a storage counter on Subterranean Hangar.\n{T}, Remove any number of storage counters from Subterranean Hangar: Add {B} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/w/white_mana_battery.txt b/forge-gui/res/cardsfolder/w/white_mana_battery.txt index d2994126fb4..ab5cbb293a3 100644 --- a/forge-gui/res/cardsfolder/w/white_mana_battery.txt +++ b/forge-gui/res/cardsfolder/w/white_mana_battery.txt @@ -2,7 +2,7 @@ Name:White Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. SVar:DBMana: DB$ Mana | Produced$ W | Amount$ X SVar:X:Count$xPaid AI:RemoveDeck:Random From 27ae0dc6b67198b3fed58cd9f25be9c5119387c8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:08:29 -0400 Subject: [PATCH 06/10] rasputin_the_oneiromancer.txt refactor costs to match Oracle better --- forge-gui/res/cardsfolder/r/rasputin_the_oneiromancer.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rasputin_the_oneiromancer.txt b/forge-gui/res/cardsfolder/r/rasputin_the_oneiromancer.txt index 9b9465e4cc0..1ef1d448cf3 100644 --- a/forge-gui/res/cardsfolder/r/rasputin_the_oneiromancer.txt +++ b/forge-gui/res/cardsfolder/r/rasputin_the_oneiromancer.txt @@ -5,8 +5,8 @@ PT:4/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a dream counter on it for each opponent you have. Each opponent creates a 1/1 red Goblin creature token. SVar:TrigCounter:DB$ PutCounter | CounterType$ DREAM | CounterNum$ Y | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin | TokenOwner$ Opponent -A:AB$ Mana | Cost$ XCantBe0 T SubCounter | Produced$ C | Amount$ X | SpellDescription$ Add that much {C}. -A:AB$ Token | Cost$ T SubCounter<1/DREAM> | TokenScript$ w_2_2_knight_pro_red | SpellDescription$ Create a 2/2 white Knight creature token with protection from red. +A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ X | XCantBe0$ True | SpellDescription$ Add that much {C}. +A:AB$ Token | Cost$ T SubCounter<1/DREAM/NICKNAME> | TokenScript$ w_2_2_knight_pro_red | SpellDescription$ Create a 2/2 white Knight creature token with protection from red. SVar:Y:PlayerCountOpponents$Amount SVar:X:Count$xPaid DeckHas:Ability$Counters|Token From 4f9ce53f0d08eee29a240c3e47f6d263f8ca17c8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:08:48 -0400 Subject: [PATCH 07/10] catti_brie_of_mithral_hall.txt simplify --- forge-gui/res/cardsfolder/c/catti_brie_of_mithral_hall.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/catti_brie_of_mithral_hall.txt b/forge-gui/res/cardsfolder/c/catti_brie_of_mithral_hall.txt index 0178da6871d..db45175716b 100644 --- a/forge-gui/res/cardsfolder/c/catti_brie_of_mithral_hall.txt +++ b/forge-gui/res/cardsfolder/c/catti_brie_of_mithral_hall.txt @@ -7,7 +7,7 @@ K:Reach T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on it for each Equipment attached to it. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Y SVar:Y:Count$Valid Equipment.Attached -A:AB$ DealDamage | Cost$ 1 SubCounter | NumDmg$ X | ValidTgts$ Creature.attacking+OppCtrl,Creature.blocking+OppCtrl | TgtPrompt$ Select target attacking or blocking creature an opponent controls | SpellDescription$ It deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way. +A:AB$ DealDamage | Cost$ 1 SubCounter | NumDmg$ X | ValidTgts$ Creature.attacking+OppCtrl,Creature.blocking+OppCtrl | TgtPrompt$ Select target attacking or blocking creature an opponent controls | SpellDescription$ It deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way. SVar:X:SVar$CostCountersRemoved SVar:HasAttackEffect:TRUE SVar:EquipMe:Multiple From 055df30462b0bf7f4c911a94d27f988bfb2c95fb Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:09:04 -0400 Subject: [PATCH 08/10] ooze_flux.txt refactor cost --- forge-gui/res/cardsfolder/o/ooze_flux.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/o/ooze_flux.txt b/forge-gui/res/cardsfolder/o/ooze_flux.txt index 8bd5e1ce9aa..bb8395cb063 100644 --- a/forge-gui/res/cardsfolder/o/ooze_flux.txt +++ b/forge-gui/res/cardsfolder/o/ooze_flux.txt @@ -1,7 +1,7 @@ Name:Ooze Flux ManaCost:3 G Types:Enchantment -A:AB$ Token | Cost$ XCantBe0 1 G RemoveAnyCounter | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way. +A:AB$ Token | Cost$ XCantBe0 1 G RemoveAnyCounter | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way. SVar:X:Count$xPaid AI:RemoveDeck:All DeckHints:Ability$Counters From 61300c27aa625938153cc7f4873a5bc1176ffba9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 12:24:35 -0400 Subject: [PATCH 09/10] Cost.add() add boolean to new CostRemoveCounter --- forge-game/src/main/java/forge/game/cost/Cost.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 45a33863ba1..5a3e710bae2 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -926,7 +926,7 @@ public class Cost implements Serializable { if (counters < 0) { costParts.add(new CostPutCounter(String.valueOf(counters *-1), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription())); } else { - costParts.add(new CostRemoveCounter(String.valueOf(counters), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription(), ZoneType.Battlefield)); + costParts.add(new CostRemoveCounter(String.valueOf(counters), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription(), ZoneType.Battlefield, false)); } } else { continue; From ca36b6f6404cddc38dba5452e9e01e7fb4328562 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 21 Oct 2022 15:44:45 -0400 Subject: [PATCH 10/10] ManaEffect.getStackDescription add "AmountDesc" --- .../main/java/forge/game/ability/effects/ManaEffect.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 75f93f95a0a..fbf760c84e9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -268,8 +268,13 @@ public class ManaEffect extends SpellAbilityEffect { final List tgtPlayers = getDefinedPlayersOrTargeted(sa); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; + String manaDesc = ""; + if (mana.equals("mana") && sa.hasParam("Produced") && sa.hasParam("AmountDesc")) { + mana = sa.getParam("Produced"); + manaDesc = sa.getParam("AmountDesc"); + } sb.append(Lang.joinHomogenous(tgtPlayers)).append(tgtPlayers.size() == 1 ? " adds " : " add "); - sb.append(toManaString(mana)).append("."); + sb.append(toManaString(mana)).append(manaDesc).append("."); if (sa.hasParam("RestrictValid")) { sb.append(" "); final String desc = sa.getDescription();