From 935e4a00d5b57a7ef21296eab6d0ed96cf6df450 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Tue, 8 Jul 2025 21:03:39 +0800 Subject: [PATCH 1/2] Fix Crash for Rug of Smothering TriggeredActivator not defined on AbilityUtils calculateAmount, hence produces ClassCastException. --- .../src/main/java/forge/game/ability/AbilityUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 10a70e8981a..b889153c843 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -733,7 +733,14 @@ public class AbilityUtils { else if (calcX[0].startsWith("Triggered") || (calcX[0].startsWith("CardTriggered"))) { final SpellAbility root = sa.getRootAbility(); final int s = calcX[0].startsWith("Triggered") ? 9 : 13; - list = new CardCollection((Card) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(s)))); + final Object triggeringObject = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(s))); + if (triggeringObject instanceof Card singleton) + list = new CardCollection(singleton); + else if (triggeringObject instanceof Player activator){ + //this is only used for Rug of Smothering + if (calcX[1].equalsIgnoreCase("SpellsCastThisTurn")) + val = activator.getSpellsCastThisTurn(); + } } else if (calcX[0].startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility(); From 783fff300d80cfbaed190a0edb67f700e749ddb1 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Tue, 8 Jul 2025 21:29:53 +0800 Subject: [PATCH 2/2] Update AbilityUtils.java --- .../main/java/forge/game/ability/AbilityUtils.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index b889153c843..e5b0f08409f 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -658,7 +658,7 @@ public class AbilityUtils { val = playerXCount(getDefinedPlayers(card, key, sa), calcX[1], card, ability); } else if (calcX[0].startsWith("TriggeredPlayer") || calcX[0].startsWith("TriggeredTarget") - || calcX[0].startsWith("TriggeredDefendingPlayer")) { + || calcX[0].startsWith("TriggeredDefendingPlayer") || calcX[0].startsWith("TriggeredActivator")) { final SpellAbility root = sa.getRootAbility(); Object o = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9))); val = o instanceof Player ? playerXProperty((Player) o, calcX[1], card, ability) : 0; @@ -733,14 +733,7 @@ public class AbilityUtils { else if (calcX[0].startsWith("Triggered") || (calcX[0].startsWith("CardTriggered"))) { final SpellAbility root = sa.getRootAbility(); final int s = calcX[0].startsWith("Triggered") ? 9 : 13; - final Object triggeringObject = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(s))); - if (triggeringObject instanceof Card singleton) - list = new CardCollection(singleton); - else if (triggeringObject instanceof Player activator){ - //this is only used for Rug of Smothering - if (calcX[1].equalsIgnoreCase("SpellsCastThisTurn")) - val = activator.getSpellsCastThisTurn(); - } + list = new CardCollection((Card) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(s)))); } else if (calcX[0].startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility();