diff --git a/Mage.Sets/src/mage/cards/a/AlteredEgo.java b/Mage.Sets/src/mage/cards/a/AlteredEgo.java index a1046385ea4..8c8d41448b4 100644 --- a/Mage.Sets/src/mage/cards/a/AlteredEgo.java +++ b/Mage.Sets/src/mage/cards/a/AlteredEgo.java @@ -70,7 +70,7 @@ class AlteredEgoCopyApplier extends CopyApplier { // except it enters with an additional X +1/+1 counters on it blueprint.getAbilities().add( new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance( - (int)CardUtil.getSourceCostsTag(game, source, "X", 0) + CardUtil.getSourceCostsTag(game, source, "X", 0) ))) ); diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index c36be304506..b2cf16b862b 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -170,13 +170,6 @@ public interface Ability extends Controllable, Serializable { * Set tag to the value, initializes this ability's tags map if it is null */ void setCostsTag(String tag, Object value); - /** - * Returns the value of the tag or defaultValue if the tag is not found in this ability's tag map - * does NOT check the source permanent's tags, use CardUtil.getSourceCostsTag for that - * - * @return The given tag value (or the default if not found) - */ - Object getCostsTagOrDefault(String tag, Object defaultValue); /** * Retrieves the effects that are put into the place by the resolution of diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 817f03f9436..8cb62951227 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -721,12 +721,6 @@ public abstract class AbilityImpl implements Ability { } costsTagMap.put(tag, value); } - public Object getCostsTagOrDefault(String tag, Object defaultValue){ - if (costsTagMap != null && costsTagMap.containsKey(tag)){ - return costsTagMap.get(tag); - } - return defaultValue; - } @Override public Effects getEffects() { diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java index cc63b4a614b..43a84eea66a 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java @@ -19,7 +19,7 @@ public enum GetKickerXValue implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { // Currently identical logic to the Manacost X value // which should be fine since you can only have one X at a time - return (int) CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java index 19240bedfbb..97531fe46bf 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java @@ -14,7 +14,7 @@ public enum GetXLoyaltyValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (int) CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java index e0854eaa7da..afe4acdd784 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java @@ -14,7 +14,7 @@ public enum GetXValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (int) CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java index 26c50d8b697..c8be9bd58b9 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java @@ -16,7 +16,7 @@ public enum ManacostVariableValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (int) CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java b/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java index 4e74068c5cc..6291cdef55c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/EntersBattlefieldWithXCountersEffect.java @@ -57,7 +57,7 @@ public class EntersBattlefieldWithXCountersEffect extends OneShotEffect { } } if (permanent != null) { - int amount = ((int) CardUtil.getSourceCostsTag(game, source, "X", 0)) * multiplier; + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0) * multiplier; if (amount > 0) { Counter counterToAdd = counter.copy(); counterToAdd.add(amount - counter.getCount()); diff --git a/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java b/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java index 0796eafd1b7..d19f0da7da6 100644 --- a/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java @@ -137,7 +137,13 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo String finalActivationKey = getActivationKey(needKickerCost); Stream> tagStream = costsTags.entrySet().stream() .filter(x -> x.getKey().startsWith(finalActivationKey)); - return tagStream.mapToInt(x -> (int)x.getValue()).sum(); + return tagStream.mapToInt(x -> { + Object value = x.getValue(); + if (!(value instanceof Integer)){ + throw new IllegalStateException("Wrong code usage: Kicker tag "+x.getKey()+" needs Integer but has "+(value==null?"null":value.getClass().getName())); + } + return (int) value; + }).sum(); } /** @@ -182,7 +188,7 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo game.fireEvent(GameEvent.getEvent(GameEvent.EventType.KICKED, source.getSourceId(), source, source.getControllerId())); String activationKey = getActivationKey(kickerCost.getText(true)); - Integer next = (int)source.getCostsTagOrDefault(activationKey,0)+1; + Integer next = CardUtil.getSourceCostsTag(game, source, activationKey,0)+1; source.setCostsTag(activationKey,next); } diff --git a/Mage/src/main/java/mage/abilities/keyword/SquadAbility.java b/Mage/src/main/java/mage/abilities/keyword/SquadAbility.java index a2448e4b18b..ca7710171b6 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SquadAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SquadAbility.java @@ -121,7 +121,7 @@ class SquadTriggerAbility extends EntersBattlefieldTriggeredAbility { @Override public boolean checkInterveningIfClause(Game game) { - int squadCount = (int)CardUtil.getSourceCostsTag(game, this, SquadAbility.SQUAD_ACTIVATION_VALUE_KEY,0); + int squadCount = CardUtil.getSourceCostsTag(game, this, SquadAbility.SQUAD_ACTIVATION_VALUE_KEY,0); return (squadCount > 0); } @Override @@ -148,7 +148,7 @@ class SquadEffectETB extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int squadCount = (int)CardUtil.getSourceCostsTag(game, source, SquadAbility.SQUAD_ACTIVATION_VALUE_KEY,0); + int squadCount = CardUtil.getSourceCostsTag(game, source, SquadAbility.SQUAD_ACTIVATION_VALUE_KEY,0); CreateTokenCopySourceEffect effect = new CreateTokenCopySourceEffect(squadCount); return effect.apply(game, source); } diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index bc148ae320c..a491cea94b5 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -408,10 +408,6 @@ public class StackAbility extends StackObjectImpl implements Ability { ability.setCostsTag(tag, value); } @Override - public Object getCostsTagOrDefault(String tag, Object defaultValue){ - return ability.getCostsTagOrDefault(tag, defaultValue); - } - @Override public AbilityType getAbilityType() { return ability.getAbilityType(); } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 932d466806e..9a2a21d1408 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -1711,6 +1711,7 @@ public final class CardUtil { /** * Find a specific tag in the cost tags of either the source ability, or the permanent source of the ability. * Works in any moment (even before source ability activated) + * Do not use with null values, use checkSourceCostsTagExists instead * * @param game * @param source @@ -1718,10 +1719,17 @@ public final class CardUtil { * @param defaultValue A default value to return if the tag is not found * @return The object stored by the tag if found, the default if not */ - public static Object getSourceCostsTag(Game game, Ability source, String tag, Object defaultValue){ + public static T getSourceCostsTag(Game game, Ability source, String tag, T defaultValue){ Map costTags = getSourceCostsTagsMap(game, source); if (costTags != null) { - return costTags.getOrDefault(tag, defaultValue); + Object value = costTags.getOrDefault(tag, defaultValue); + if (value == null) { + throw new IllegalStateException("Wrong code usage: Costs tag " + tag + " has value stored of type null but is trying to be read. Use checkSourceCostsTagExists"); + } + if (value.getClass() != defaultValue.getClass()) { + throw new IllegalStateException("Wrong code usage: Costs tag " + tag + " has value stored of type " + value.getClass().getName() + " different from default of type " + defaultValue.getClass().getName()); + } + return (T) value; } return defaultValue; }