From 6c9ce36c17c98f6b28847ddc1e36d7dc9b0c5cbf Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Tue, 10 May 2022 08:53:49 -0400 Subject: [PATCH] NCC: Gavel of the Righteous and output support (#298) --- .../java/forge/game/card/CardFactoryUtil.java | 15 ++++++++++----- .../forge/game/spellability/SpellAbility.java | 16 +++++++++++----- .../upcoming/gavel_of_the_righteous.txt | 12 ++++++++++++ forge-gui/res/languages/de-DE.properties | 2 +- forge-gui/res/languages/en-US.properties | 2 +- forge-gui/res/languages/es-ES.properties | 2 +- forge-gui/res/languages/pt-BR.properties | 2 +- .../java/forge/player/HumanCostDecision.java | 7 ++++++- 8 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/gavel_of_the_righteous.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 2a3b12529fe..48244a37e8a 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2789,13 +2789,14 @@ public class CardFactoryUtil { String valid = k.length > 2 && !k[2].isEmpty() ? k[2] : "Creature.YouCtrl"; String vstr = k.length > 3 && !k[3].isEmpty() ? k[3] : "creature"; String extra = k.length > 4 ? k[4] : ""; + boolean altCost = extra.contains("AlternateCost"); String extraDesc = k.length > 5 ? k[5] : ""; // Create attach ability string final StringBuilder abilityStr = new StringBuilder(); abilityStr.append("AB$ Attach | Cost$ "); abilityStr.append(equipCost); abilityStr.append("| ValidTgts$ ").append(valid); - abilityStr.append("| TgtPrompt$ Select target ").append(vstr).append(" you control "); + abilityStr.append(" | TgtPrompt$ Select target ").append(vstr).append(" you control "); abilityStr.append("| SorcerySpeed$ True | Equip$ True | AILogic$ Pump | IsPresent$ Equipment.Self+nonCreature "); // add AttachAi for some special cards if (card.hasSVar("AttachAi")) { @@ -2806,19 +2807,23 @@ public class CardFactoryUtil { abilityStr.append(" ").append(vstr); } Cost cost = new Cost(equipCost, true); - if (!cost.isOnlyManaCost()) { //Something other than a mana cost + if (!cost.isOnlyManaCost() || altCost) { //Something other than a mana cost abilityStr.append("—"); } else { abilityStr.append(" "); } - abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + if (!altCost) { + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + } abilityStr.append("| SpellDescription$ "); if (!extraDesc.isEmpty()) { abilityStr.append(". ").append(extraDesc).append(". "); } - abilityStr.append("(").append(inst.getReminderText()).append(")"); + if (!altCost) { + abilityStr.append("(").append(inst.getReminderText()).append(")"); + } if (!extra.isEmpty()) { - abilityStr.append("| ").append(extra); + abilityStr.append(" | ").append(extra); } // instantiate attach ability final SpellAbility newSA = AbilityFactory.getAbility(abilityStr.toString(), card); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 109ba9657a4..6ba34f181cf 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -864,15 +864,21 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (hasParam("CostDesc")) { sb.append(getParam("CostDesc")).append(" "); } else { - sb.append(payCosts.toString()); - - // for cards like Crystal Shard with {3}, {T} or {U}, {T}: if (hasParam("AlternateCost")) { Cost alternateCost = new Cost(getParam("AlternateCost"), payCosts.isAbility()); - sb.append(" or ").append(alternateCost.toString()); + boolean altOnlyMana = alternateCost.isOnlyManaCost(); + if (payCosts.isOnlyManaCost() && !altOnlyMana) { + sb.append("Pay "); + } + sb.append(payCosts.toString()); + sb.append(" or ").append(altOnlyMana ? alternateCost.toString() : + StringUtils.uncapitalize(alternateCost.toString())); + sb.append(isEquip() ? "." : ""); + } else { + sb.append(payCosts.toString()); } - if (payCosts.isAbility()) { + if (payCosts.isAbility() && !isEquip()) { sb.append(": "); } } diff --git a/forge-gui/res/cardsfolder/upcoming/gavel_of_the_righteous.txt b/forge-gui/res/cardsfolder/upcoming/gavel_of_the_righteous.txt new file mode 100644 index 00000000000..c3216a8b856 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gavel_of_the_righteous.txt @@ -0,0 +1,12 @@ +Name:Gavel of the Righteous +ManaCost:2 +Types:Artifact Equipment +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of combat on your turn, put a charge counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ CHARGE +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ X | AddToughness$ X | Description$ Equipped creature gets +1/+1 for each counter on CARDNAME. +SVar:X:Count$CardCounters.ALL +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Double Strike | CheckSVar$ X | SVarCompare$ GE4 | Description$ As long as CARDNAME has four or more counters on it, equipped creature has double strike. +K:Equip:3:::AlternateCost$ RemoveAnyCounter<1/Any/Card.Self/CARDNAME> +DeckHas:Ability$Counters +DeckHints:Ability$Counters +Oracle:At the beginning of combat on your turn, put a charge counter on Gavel of the Righteous.\nEquipped creature gets +1/+1 for each counter on Gavel of the Righteous.\nAs long as Gavel of the Righteous has four or more counters on it, equipped creature has double strike.\nEquip—Pay {3} or remove a counter from Gavel of the Righteous. diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 0fc0e0c349c..d47d2bdac4f 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -2391,7 +2391,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? -lblRemoveNTargetCounterFromCardPayCostConfirm=Zahle Kosten: Entferne {0} {1}-Marken von {2}? +lblRemoveNTargetCounterFromCardPayCostConfirm=Zahle Kosten: Entferne {0}{1}-Marken von {2}? lblRemoveCountersFromAInZoneCard=Entferne Marke(n) von einer Karte in {0} lblSacrificeCardConfirm=Opfere {0}? lblSelectATargetToSacrifice=Wähle ein(e) {0} zum Opfern (noch {1}) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 8381050f9c4..f91adef192a 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2389,7 +2389,7 @@ 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=Remove {0} {1} counter(s) from {2}? +lblRemoveNTargetCounterFromCardPayCostConfirm=Select {2} to remove {0}{1} counter(s) from 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 1319bace9e2..aafa6b8a886 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2389,7 +2389,7 @@ 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}? +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/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 0d9ce9e4668..4a816164188 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -2464,7 +2464,7 @@ 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}? +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/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index d79ad2660c1..cb06d43414d 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -816,8 +816,13 @@ public class HumanCostDecision extends CostDecisionMakerBase { super(controller, cntCounters, cntCounters, sa); this.validChoices = validCards; counterType = cType; + String fromWhat = costPart.getDescriptiveType(); + if (fromWhat.equals("CARDNAME")) { + fromWhat = sa.getHostCard().getName(); + } - setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm", "%d", counterType == null ? "any" : counterType.getName().toLowerCase(), costPart.getDescriptiveType())); + setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm", + "%d", counterType == null ? "" : " " + counterType.getName().toLowerCase(), fromWhat)); } @Override