mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Card: Store CardTraits created by StaticAbilities
This commit is contained in:
@@ -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<Card>, IHasSVars {
|
||||
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
|
||||
|
||||
// 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
|
||||
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
|
||||
@@ -4263,6 +4271,45 @@ public class Card extends GameEntity implements Comparable<Card>, 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<SpellAbility> spells, Collection<SpellAbility> removedAbilities,
|
||||
Collection<Trigger> trigger, Collection<ReplacementEffect> replacements, Collection<StaticAbility> statics,
|
||||
boolean removeAll, boolean removeNonMana, long timestamp, long staticId) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user