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 e63f3f8d6a7..ae6b99175f0 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 @@ -23,6 +23,8 @@ import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Localizer; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; public class ManaEffect extends SpellAbilityEffect { @@ -199,13 +201,21 @@ public class ManaEffect extends SpellAbilityEffect { } abMana.setExpressChoice(sb.toString().trim()); } + } - if (abMana.getExpressChoice().isEmpty()) { - System.out.println("AbilityFactoryMana::manaResolve() - special mana effect is empty for " + sa.getHostCard().getName()); - } - } + String mana = GameActionUtil.generatedMana(sa); - abMana.produceMana(GameActionUtil.generatedMana(sa), p, sa); + // this can happen when mana is based on criteria that didn't match + if (mana.isEmpty()) { + String msg = "AbilityFactoryMana::manaResolve() - special mana effect is empty for"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", card.getName()).withData("SA", sa.toString()).build() + ); + continue; + } + + abMana.produceMana(mana, p, sa); } // Only clear express choice after mana has been produced diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 66b641b5f6c..664a417122b 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -500,6 +500,8 @@ public class AbilityManaPart implements java.io.Serializable { * @return a boolean. */ public final boolean canProduce(final String s, final SpellAbility sa) { + // TODO: need to handle replacement effects like 106.7 + // Any mana never means Colorless? if (isAnyMana() && !s.equals("C")) { return true;