From d4030e0f1d458ee52a2c4e4861d94aa2cd1519ab Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 25 May 2023 22:04:17 +0200 Subject: [PATCH] Treat replaceAbilityText bandaids --- .../main/java/forge/ai/ability/PlayAi.java | 2 +- .../main/java/forge/ai/ability/UntapAi.java | 14 +++++++--- .../game/ability/effects/CharmEffect.java | 1 - .../main/java/forge/game/trigger/Trigger.java | 26 +++++++------------ ...primal_conqueror_etali_primal_sickness.txt | 2 +- .../z/zareth_san_the_trickster.txt | 2 +- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 98306dbf385..b0f463fcf60 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -120,7 +120,7 @@ public class PlayAi extends SpellAbilityAi { if ("ReplaySpell".equals(sa.getParam("AILogic"))) { return ComputerUtil.targetPlayableSpellCard(ai, getPlayableCards(sa, ai), sa, sa.hasParam("WithoutManaCost"), mandatory); - } + } return checkApiLogic(ai, sa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 1f6f481be4e..bc5cc48c98e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -5,6 +5,7 @@ import java.util.Map; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; @@ -307,11 +308,18 @@ public class UntapAi extends SpellAbilityAi { return true; } - + @Override public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable list, boolean isOptional, Player targetedPlayer, Map params) { - PlayerCollection pl = ai.getYourTeam(); - return ComputerUtilCard.getBestAI(CardLists.filterControlledBy(list, pl)); + CardCollection pref = CardLists.filterControlledBy(list, ai.getYourTeam()); + if (Iterables.isEmpty(pref)) { + if (isOptional) { + return null; + } + } else { + list = pref; + } + return ComputerUtilCard.getBestAI(list); } private static Card detectPriorityUntapTargets(final List untapList) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index cc416780a1e..2f8e40ee645 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -55,7 +55,6 @@ public class CharmEffect extends SpellAbilityEffect { public static String makeFormatedDescription(SpellAbility sa) { return makeFormatedDescription(sa, true); } - public static String makeFormatedDescription(SpellAbility sa, boolean includeChosen) { Card source = sa.getHostCard(); diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index d414177c2f8..91f003d1777 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -158,7 +158,6 @@ public abstract class Trigger extends TriggerReplacementBase { public final String replaceAbilityText(final String desc, SpellAbility sa) { return replaceAbilityText(desc, sa, false); } - public final String replaceAbilityText(final String desc, SpellAbility sa, boolean forStack) { String result = desc; @@ -184,29 +183,22 @@ public abstract class Trigger extends TriggerReplacementBase { } } if (digMore) { // if ABILITY is used, there is probably Charm somewhere - while (sa != null) { - ApiType api = sa.getApi(); + SpellAbility trigSA = sa; + while (trigSA != null) { + ApiType api = trigSA.getApi(); if (ApiType.Charm.equals(api)) { - saDesc = CharmEffect.makeFormatedDescription(sa, !forStack); + saDesc = CharmEffect.makeFormatedDescription(trigSA, !forStack); break; } if (ApiType.ImmediateTrigger.equals(api) || ApiType.DelayedTrigger.equals(api)) { - SpellAbility trigSA = sa.getAdditionalAbility("Execute"); - while (trigSA != null) { - if (ApiType.Charm.equals(trigSA.getApi())) { - saDesc = CharmEffect.makeFormatedDescription(trigSA, !forStack); - break; - } - trigSA = trigSA.getSubAbility(); - } - break; + trigSA = sa.getAdditionalAbility("Execute"); + } else { + trigSA = sa.getSubAbility(); } - sa = sa.getSubAbility(); } } if (saDesc.equals("")) { // in case we haven't found anything better - if (sa != null) - saDesc = sa.toString(); + saDesc = sa.toString(); } // string might have leading whitespace saDesc = saDesc.trim(); @@ -223,7 +215,7 @@ public abstract class Trigger extends TriggerReplacementBase { } result = TextUtil.fastReplace(result, "ABILITY", saDesc); - String currentName = sa == null ? "" : sa.getHostCard().getName(); + String currentName = sa.getHostCard().getName(); result = CardTranslation.translateMultipleDescriptionText(result, currentName); result = TextUtil.fastReplace(result,"CARDNAME", CardTranslation.getTranslatedName(currentName)); result = TextUtil.fastReplace(result,"NICKNAME", Lang.getInstance().getNickName(CardTranslation.getTranslatedName(currentName))); diff --git a/forge-gui/res/cardsfolder/e/etali_primal_conqueror_etali_primal_sickness.txt b/forge-gui/res/cardsfolder/e/etali_primal_conqueror_etali_primal_sickness.txt index 82f76889c7f..1a3c54e691c 100644 --- a/forge-gui/res/cardsfolder/e/etali_primal_conqueror_etali_primal_sickness.txt +++ b/forge-gui/res/cardsfolder/e/etali_primal_conqueror_etali_primal_sickness.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDig:DB$ DigUntil | Defined$ Player | Valid$ Card.nonLand | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBPlay SVar:DBPlay:DB$ Play | Controller$ You | Defined$ Remembered | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | Amount$ All | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -A:AB$ SetState | Cost$ 9 GP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +A:AB$ SetState | Cost$ 9 GP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform NICKNAME. Activate only as a sorcery. AlternateMode:DoubleFaced Oracle:Trample\nWhen Etali, Primal Conqueror enters the battlefield, each player exiles cards from the top of their library until they exile a nonland card. You may cast any number of spells from among the nonland cards exiled this way without paying their mana costs.\n{9}{G/P}: Transform Etali. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt b/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt index 663cf9caff4..6af4361e1d7 100644 --- a/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt +++ b/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Merfolk Rogue PT:4/4 K:Flash A:AB$ ChangeZone | Cost$ 2 U B Return<1/Rogue.unblocked+attacking+YouCtrl/unblocked attacking Rogue you control> | ActivationZone$ Hand | Defined$ Self | Origin$ Hand | Destination$ Battlefield | Tapped$ True | Attacking$ True | SpellDescription$ Put CARDNAME from your hand onto the battlefield tapped and attacking. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigGainControl | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may put target permanent card from that player's graveyard onto the battlefield under your control. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigGainControl | OptionalDecider$ You | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, you may put target permanent card from that player's graveyard onto the battlefield under your control. SVar:TrigGainControl:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Permanent | TargetsWithDefinedController$ TriggeredTarget | TgtPrompt$ Select target permanent in opponent's graveyard DeckHints:Type$Rogue Oracle:Flash\n{2}{U}{B}, Return an unblocked attacking Rogue you control to its owner's hand: Put Zareth San, the Trickster from your hand onto the battlefield tapped and attacking.\nWhenever Zareth San deals combat damage to a player, you may put target permanent card from that player's graveyard onto the battlefield under your control.