From 98c0959d8f3a01cc30e0226c97d59535e5fe4f7d Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sun, 20 Oct 2024 12:02:48 +0200 Subject: [PATCH] Fix Embodiment of Agonies counting Asmoranomardicadaistinaculdacar (#6388) --- .../src/main/java/forge/card/mana/ManaCost.java | 7 +++++-- .../java/forge/card/mana/ManaCostParser.java | 2 +- .../java/forge/game/ability/AbilityUtils.java | 1 + .../forge/game/ability/effects/PlayEffect.java | 3 --- .../forge/game/ability/effects/PumpEffect.java | 9 --------- .../java/forge/game/card/CardFactoryUtil.java | 2 +- .../main/java/forge/game/spellability/Spell.java | 16 +++++----------- .../staticability/StaticAbilityContinuous.java | 3 --- 8 files changed, 13 insertions(+), 30 deletions(-) diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index eb96946b575..bd78b9e8519 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -42,7 +42,7 @@ public final class ManaCost implements Comparable, Iterable shards; private final int genericCost; - private final boolean hasNoCost; // lands cost + private boolean hasNoCost = true; // lands cost private String stringValue; // precalculated for toString; private Float compareWeight = null; @@ -92,8 +92,8 @@ public final class ManaCost implements Comparable, Iterable shardsTemp = Lists.newArrayList(); - this.hasNoCost = false; while (parser.hasNext()) { + this.hasNoCost = false; final ManaCostShard shard = parser.next(); if (shard != null && shard != ManaCostShard.GENERIC) { shardsTemp.add(shard); @@ -281,6 +281,9 @@ public final class ManaCost implements Comparable, Iterable s.isKeyword(Keyword.SUSPEND)).getPayCosts(); } else { if (cost.contains("ConvertedManaCost")) { - if (unpayableCost) { - continue; - } final String costcmc = Integer.toString(tgtCard.getCMC()); cost = cost.replace("ConvertedManaCost", costcmc); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index c8982425fc7..f1c797e921e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -474,15 +474,6 @@ public class PumpEffect extends SpellAbilityEffect { List affectedKeywords = Lists.newArrayList(keywords); if (!affectedKeywords.isEmpty()) { - Iterables.removeIf(affectedKeywords, input -> { - if (input.contains("CardManaCost")) { - if (tgtC.getManaCost().isNoCost()) { - return true; - } - } - return false; - }); - affectedKeywords = Lists.transform(affectedKeywords, input -> { if (input.contains("CardManaCost")) { input = input.replace("CardManaCost", tgtC.getManaCost().getShortString()); 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 1eee35c287a..ce9b68189f8 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1462,7 +1462,7 @@ public class CardFactoryUtil { final String trigStr = "Mode$ Exiled | ValidCard$ Card.Self | Madness$ True | Secondary$ True" + " | TriggerDescription$ Play Madness " + ManaCostParser.parse(manacost) + " - " + card.getName(); - final String playMadnessStr = "DB$ Play | Defined$ Self | PlayCost$ " + manacost + + final String playMadnessStr = "DB$ Play | Defined$ Self | ValidSA$ Spell | PlayCost$ " + manacost + " | ConditionDefined$ Self | ConditionPresent$ Card.StrictlySelf+inZoneExile" + " | Optional$ True | RememberPlayed$ True | Madness$ True"; diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 13a379afaa5..81ed51fb199 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -23,7 +23,6 @@ import forge.game.card.CardCopyService; import org.apache.commons.lang3.ObjectUtils; import forge.card.CardStateName; -import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.ability.AbilityKey; import forge.game.card.Card; @@ -71,6 +70,11 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } + // CR 118.6 cost is unpayable + if (getPayCosts().hasManaCost() && getPayCosts().getCostMana().getMana().isNoCost()) { + return false; + } + Player activator = this.getActivatingPlayer(); if (activator == null) { activator = card.getController(); @@ -84,9 +88,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } - // Save the original cost and the face down info for a later check since the LKI copy will overwrite them - ManaCost origCost = card.getState(card.isFaceDown() ? CardStateName.Original : card.getCurrentStateName()).getManaCost(); - // do performanceMode only for cases where the activator is different than controller if (!Spell.performanceMode && !card.getController().equals(activator)) { // always make a lki copy in this case? @@ -100,13 +101,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } - // for uncastables like lotus bloom, check if manaCost is blank (except for morph spells) - // but ignore if it comes from PlayEffect - if (!isCastFaceDown() && !isCastFromPlayEffect() - && isBasicSpell() && origCost.isNoCost()) { - return false; - } - if (!CostPayment.canPayAdditionalCosts(this.getPayCosts(), this, false)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 2a323934c65..6d379797868 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -731,9 +731,6 @@ public final class StaticAbilityContinuous { final List extraKeywords = Lists.newArrayList(); Iterables.removeIf(newKeywords, input -> { - if (input.contains("CardManaCost") && affectedCard.getManaCost().isNoCost()) { - return true; - } // replace one Keyword with list of keywords if (input.startsWith("Protection") && input.contains("CardColors")) { for (Byte color : affectedCard.getColor()) {