From 30af2883188a6226003f77d342e6a1fdcf79e07b Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 5 Sep 2024 15:34:17 +0200 Subject: [PATCH] Fix transformed backside cast failing when some AltCost apply (#6070) --- .../main/java/forge/game/card/CardFactoryUtil.java | 11 +++-------- .../src/main/java/forge/game/card/CardState.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) 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 fe76d4adcd2..806a9a174e9 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2821,12 +2821,7 @@ public class CardFactoryUtil { final String[] k = keyword.split(":"); final Cost disturbCost = new Cost(k[1], true); - SpellAbility newSA; - if (host.getAlternateState().getType().hasSubtype("Aura")) { - newSA = host.getAlternateState().getFirstAbility().copyWithDefinedCost(disturbCost); - } else { - newSA = new SpellPermanent(host, host.getAlternateState(), disturbCost); - } + SpellAbility newSA = host.getAlternateState().getFirstSpellAbilityWithFallback().copyWithDefinedCost(disturbCost); newSA.setCardState(host.getAlternateState()); StringBuilder sbCost = new StringBuilder("Disturb"); @@ -3137,7 +3132,7 @@ public class CardFactoryUtil { } else if (keyword.startsWith("Freerunning")) { final String[] k = keyword.split(":"); final Cost freerunningCost = new Cost(k[1], false); - final SpellAbility newSA = card.getFirstSpellAbility().copyWithDefinedCost(freerunningCost); + final SpellAbility newSA = card.getFirstSpellAbilityWithFallback().copyWithDefinedCost(freerunningCost); if (host.isInstant() || host.isSorcery()) { newSA.putParam("Secondary", "True"); @@ -3463,7 +3458,7 @@ public class CardFactoryUtil { } else if (keyword.startsWith("Prowl")) { final String[] k = keyword.split(":"); final Cost prowlCost = new Cost(k[1], false); - final SpellAbility newSA = card.getFirstSpellAbility().copyWithDefinedCost(prowlCost); + final SpellAbility newSA = card.getFirstSpellAbilityWithFallback().copyWithDefinedCost(prowlCost); if (host.isInstant() || host.isSorcery()) { newSA.putParam("Secondary", "True"); diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 0cfb70e1a66..c6060bdbc7b 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -45,6 +45,7 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; +import forge.game.spellability.SpellPermanent; import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.util.ITranslatable; @@ -377,6 +378,15 @@ public class CardState extends GameObject implements IHasSVars, ITranslatable { return Iterables.getFirst(getNonManaAbilities(), null); } + public final SpellAbility getFirstSpellAbilityWithFallback() { + SpellAbility sa = getFirstSpellAbility(); + if (sa != null || getTypeWithChanges().isLand()) { + return sa; + } + // this happens if it's transformed backside (e.g. Disturbed) + return new SpellPermanent(getCard(), this); + } + public final boolean hasSpellAbility(final SpellAbility sa) { return getSpellAbilities().contains(sa); }