diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 86506b96595..a18c6216817 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -50,6 +50,7 @@ import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.replacement.ReplaceMoved; import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementResult; import forge.game.replacement.ReplacementType; import forge.game.spellability.*; @@ -60,6 +61,7 @@ import forge.game.staticability.StaticAbilityCantSacrifice; import forge.game.staticability.StaticAbilityCantTarget; import forge.game.staticability.StaticAbilityCantTransform; import forge.game.trigger.Trigger; +import forge.game.trigger.TriggerHandler; import forge.game.trigger.TriggerType; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -149,6 +151,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private final Table changedCardTraitsByText = TreeBasedTable.create(); // Layer 3 by Text Change private final Table changedCardTraits = TreeBasedTable.create(); // Layer 6 + // stores the card traits created by static abilities + private final Table storedSpellAbilility = TreeBasedTable.create(); + private final Table storedTrigger = TreeBasedTable.create(); + private final Table storedReplacementEffect = TreeBasedTable.create(); + private final Table storedStaticAbility = TreeBasedTable.create(); + // x=timestamp y=StaticAbility id private final Table changedCardColorsByText = TreeBasedTable.create(); // Layer 3 by Text Change private final Table changedCardColorsCharacterDefining = TreeBasedTable.create(); // Layer 5 CDA @@ -4263,6 +4271,45 @@ public class Card extends GameEntity implements Comparable, IHasSVars { updateAbilityTextForView(); } + public final SpellAbility getSpellAbilityForStaticAbility(final String str, final StaticAbility stAb) { + SpellAbility result = storedSpellAbilility.get(stAb, str); + if (result == null) { + result = AbilityFactory.getAbility(str, this, stAb); + result.setIntrinsic(false); + result.setGrantorStatic(stAb); + storedSpellAbilility.put(stAb, str, result); + } + return result; + } + + public final Trigger getTriggerForStaticAbility(final String str, final StaticAbility stAb) { + Trigger result = storedTrigger.get(stAb, str); + if (result == null) { + result = TriggerHandler.parseTrigger(str, this, false, stAb); + storedTrigger.put(stAb, str, result); + } + return result; + + } + + public final ReplacementEffect getReplacementEffectForStaticAbility(final String str, final StaticAbility stAb) { + ReplacementEffect result = storedReplacementEffect.get(stAb, str); + if (result == null) { + result = ReplacementHandler.parseReplacement(str, this, false, stAb); + storedReplacementEffect.put(stAb, str, result); + } + return result; + } + + public final StaticAbility getStaticAbilityForStaticAbility(final String str, final StaticAbility stAb) { + StaticAbility result = storedStaticAbility.get(stAb, str); + if (result == null) { + result = StaticAbility.create(str, this, stAb.getCardState(), false); + storedStaticAbility.put(stAb, str, result); + } + return result; + } + public final void addChangedCardTraits(Collection spells, Collection removedAbilities, Collection trigger, Collection replacements, Collection statics, boolean removeAll, boolean removeNonMana, long timestamp, long staticId) { 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 1b5210d0d9b..09dcc08f7b0 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -56,11 +56,9 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; -import forge.game.replacement.ReplacementHandler; import forge.game.spellability.AbilityStatic; import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; -import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; import forge.util.TextUtil; @@ -804,10 +802,7 @@ public final class StaticAbilityContinuous { abilty = TextUtil.fastReplace(abilty, "ConvertedManaCost", costcmc); } if (abilty.startsWith("AB") || abilty.startsWith("ST")) { // grant the ability - final SpellAbility sa = AbilityFactory.getAbility(abilty, affectedCard, stAb); - sa.setIntrinsic(false); - sa.setGrantorStatic(stAb); - addedAbilities.add(sa); + addedAbilities.add(affectedCard.getSpellAbilityForStaticAbility(abilty, stAb)); } } } @@ -853,15 +848,14 @@ public final class StaticAbilityContinuous { // add Replacement effects if (addReplacements != null) { for (String rep : addReplacements) { - final ReplacementEffect actualRep = ReplacementHandler.parseReplacement(rep, affectedCard, false, stAb); - addedReplacementEffects.add(actualRep); + addedReplacementEffects.add(affectedCard.getReplacementEffectForStaticAbility(rep, stAb)); } } // add triggers if (addTriggers != null) { for (final String trigger : addTriggers) { - final Trigger actualTrigger = TriggerHandler.parseTrigger(trigger, affectedCard, false, stAb); + final Trigger actualTrigger = affectedCard.getTriggerForStaticAbility(trigger, stAb); // if the trigger has Execute param, which most trigger gained by Static Abilties should have // turn them into SpellAbility object before adding to card // with that the TargetedCard does not need the Svars added to them anymore @@ -886,7 +880,7 @@ public final class StaticAbilityContinuous { s = TextUtil.fastReplace(s, "ConvertedManaCost", costcmc); } - addedStaticAbility.add(StaticAbility.create(s, affectedCard, stAb.getCardState(), false)); + addedStaticAbility.add(affectedCard.getStaticAbilityForStaticAbility(s, stAb)); } }