Card: Store CardTraits created by StaticAbilities

This commit is contained in:
Hans Mackowiak
2022-04-16 11:27:03 +02:00
parent 74e4e9fbcc
commit 817b0ea55b
2 changed files with 51 additions and 10 deletions

View File

@@ -50,6 +50,7 @@ import forge.game.player.Player;
import forge.game.player.PlayerCollection; import forge.game.player.PlayerCollection;
import forge.game.replacement.ReplaceMoved; import forge.game.replacement.ReplaceMoved;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler;
import forge.game.replacement.ReplacementResult; import forge.game.replacement.ReplacementResult;
import forge.game.replacement.ReplacementType; import forge.game.replacement.ReplacementType;
import forge.game.spellability.*; import forge.game.spellability.*;
@@ -60,6 +61,7 @@ import forge.game.staticability.StaticAbilityCantSacrifice;
import forge.game.staticability.StaticAbilityCantTarget; import forge.game.staticability.StaticAbilityCantTarget;
import forge.game.staticability.StaticAbilityCantTransform; import forge.game.staticability.StaticAbilityCantTransform;
import forge.game.trigger.Trigger; import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -149,6 +151,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private final Table<Long, Long, CardTraitChanges> changedCardTraitsByText = TreeBasedTable.create(); // Layer 3 by Text Change private final Table<Long, Long, CardTraitChanges> changedCardTraitsByText = TreeBasedTable.create(); // Layer 3 by Text Change
private final Table<Long, Long, CardTraitChanges> changedCardTraits = TreeBasedTable.create(); // Layer 6 private final Table<Long, Long, CardTraitChanges> changedCardTraits = TreeBasedTable.create(); // Layer 6
// stores the card traits created by static abilities
private final Table<StaticAbility, String, SpellAbility> storedSpellAbilility = TreeBasedTable.create();
private final Table<StaticAbility, String, Trigger> storedTrigger = TreeBasedTable.create();
private final Table<StaticAbility, String, ReplacementEffect> storedReplacementEffect = TreeBasedTable.create();
private final Table<StaticAbility, String, StaticAbility> storedStaticAbility = TreeBasedTable.create();
// x=timestamp y=StaticAbility id // x=timestamp y=StaticAbility id
private final Table<Long, Long, CardColor> changedCardColorsByText = TreeBasedTable.create(); // Layer 3 by Text Change private final Table<Long, Long, CardColor> changedCardColorsByText = TreeBasedTable.create(); // Layer 3 by Text Change
private final Table<Long, Long, CardColor> changedCardColorsCharacterDefining = TreeBasedTable.create(); // Layer 5 CDA private final Table<Long, Long, CardColor> changedCardColorsCharacterDefining = TreeBasedTable.create(); // Layer 5 CDA
@@ -4263,6 +4271,45 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
updateAbilityTextForView(); 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<SpellAbility> spells, Collection<SpellAbility> removedAbilities, public final void addChangedCardTraits(Collection<SpellAbility> spells, Collection<SpellAbility> removedAbilities,
Collection<Trigger> trigger, Collection<ReplacementEffect> replacements, Collection<StaticAbility> statics, Collection<Trigger> trigger, Collection<ReplacementEffect> replacements, Collection<StaticAbility> statics,
boolean removeAll, boolean removeNonMana, long timestamp, long staticId) { boolean removeAll, boolean removeNonMana, long timestamp, long staticId) {

View File

@@ -56,11 +56,9 @@ import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.AbilityStatic; import forge.game.spellability.AbilityStatic;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger; import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.TextUtil; import forge.util.TextUtil;
@@ -804,10 +802,7 @@ public final class StaticAbilityContinuous {
abilty = TextUtil.fastReplace(abilty, "ConvertedManaCost", costcmc); abilty = TextUtil.fastReplace(abilty, "ConvertedManaCost", costcmc);
} }
if (abilty.startsWith("AB") || abilty.startsWith("ST")) { // grant the ability if (abilty.startsWith("AB") || abilty.startsWith("ST")) { // grant the ability
final SpellAbility sa = AbilityFactory.getAbility(abilty, affectedCard, stAb); addedAbilities.add(affectedCard.getSpellAbilityForStaticAbility(abilty, stAb));
sa.setIntrinsic(false);
sa.setGrantorStatic(stAb);
addedAbilities.add(sa);
} }
} }
} }
@@ -853,15 +848,14 @@ public final class StaticAbilityContinuous {
// add Replacement effects // add Replacement effects
if (addReplacements != null) { if (addReplacements != null) {
for (String rep : addReplacements) { for (String rep : addReplacements) {
final ReplacementEffect actualRep = ReplacementHandler.parseReplacement(rep, affectedCard, false, stAb); addedReplacementEffects.add(affectedCard.getReplacementEffectForStaticAbility(rep, stAb));
addedReplacementEffects.add(actualRep);
} }
} }
// add triggers // add triggers
if (addTriggers != null) { if (addTriggers != null) {
for (final String trigger : addTriggers) { 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 // if the trigger has Execute param, which most trigger gained by Static Abilties should have
// turn them into SpellAbility object before adding to card // turn them into SpellAbility object before adding to card
// with that the TargetedCard does not need the Svars added to them anymore // 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); s = TextUtil.fastReplace(s, "ConvertedManaCost", costcmc);
} }
addedStaticAbility.add(StaticAbility.create(s, affectedCard, stAb.getCardState(), false)); addedStaticAbility.add(affectedCard.getStaticAbilityForStaticAbility(s, stAb));
} }
} }