Card: store created CardTraits by Text Change: Volrath’s Shapeshifter

This commit is contained in:
Hans Mackowiak
2023-07-22 17:45:47 +02:00
parent 8a0be83b33
commit 5c4d1ce92b
2 changed files with 82 additions and 24 deletions

View File

@@ -152,6 +152,14 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private final Table<StaticAbility, String, ReplacementEffect> storedReplacementEffect = TreeBasedTable.create(); private final Table<StaticAbility, String, ReplacementEffect> storedReplacementEffect = TreeBasedTable.create();
private final Table<StaticAbility, String, StaticAbility> storedStaticAbility = TreeBasedTable.create(); private final Table<StaticAbility, String, StaticAbility> storedStaticAbility = TreeBasedTable.create();
private final Table<StaticAbility, SpellAbility, SpellAbility> storedSpellAbililityByText = HashBasedTable.create();
private final Table<StaticAbility, String, SpellAbility> storedSpellAbililityGainedByText = TreeBasedTable.create();
private final Table<StaticAbility, Trigger, Trigger> storedTriggerByText = HashBasedTable.create();
private final Table<StaticAbility, ReplacementEffect, ReplacementEffect> storedReplacementEffectByText = HashBasedTable.create();
private final Table<StaticAbility, StaticAbility, StaticAbility> storedStaticAbilityByText = HashBasedTable.create();
private final Map<Triple<String, Long, Long>, KeywordInterface> storedKeywordByText = Maps.newHashMap();
// 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
@@ -4525,6 +4533,71 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
return result; return result;
} }
public final SpellAbility getSpellAbilityForStaticAbilityByText(final SpellAbility sa, final StaticAbility stAb) {
SpellAbility result = storedSpellAbililityByText.get(stAb, sa);
if (result == null) {
result = sa.copy(this, false);
result.setOriginalAbility(sa); // need to be set to get the Once Per turn Clause correct
result.setGrantorStatic(stAb);
result.setIntrinsic(true); // needs to be changed by CardTextChanges
storedSpellAbililityByText.put(stAb, sa, result);
}
return result;
}
public final SpellAbility getSpellAbilityForStaticAbilityGainedByText(final String str, final StaticAbility stAb) {
SpellAbility result = storedSpellAbililityGainedByText.get(stAb, str);
if (result == null) {
result = AbilityFactory.getAbility(str, this, stAb);
result.setIntrinsic(true); // needs to be affected by Text
result.setGrantorStatic(stAb);
storedSpellAbililityGainedByText.put(stAb, str, result);
}
return result;
}
public final Trigger getTriggerForStaticAbilityByText(final Trigger tr, final StaticAbility stAb) {
Trigger result = storedTriggerByText.get(stAb, tr);
if (result == null) {
result = tr.copy(this, false);
result.setIntrinsic(false); // needs to be changed by CardTextChanges
storedTriggerByText.put(stAb, tr, result);
}
return result;
}
public final ReplacementEffect getReplacementEffectForStaticAbilityByText(final ReplacementEffect re, final StaticAbility stAb) {
ReplacementEffect result = storedReplacementEffectByText.get(stAb, re);
if (result == null) {
result = re.copy(this, false);
result.setIntrinsic(false); // needs to be changed by CardTextChanges
storedReplacementEffectByText.put(stAb, re, result);
}
return result;
}
public final StaticAbility getStaticAbilityForStaticAbilityByText(final StaticAbility st, final StaticAbility stAb) {
StaticAbility result = storedStaticAbilityByText.get(stAb, st);
if (result == null) {
result = st.copy(this, false);
result.setIntrinsic(false); // needs to be changed by CardTextChanges
storedStaticAbilityByText.put(stAb, st, result);
}
return result;
}
public final KeywordInterface getKeywordForStaticAbilityByText(final KeywordInterface ki, final StaticAbility stAb, long idx) {
Triple<String, Long, Long> triple = Triple.of(ki.getOriginal(), (long)stAb.getId(), idx);
KeywordInterface result = storedKeywordByText.get(triple);
if (result == null) {
result = ki.copy(this, false);
result.setStaticId(stAb.getId());
result.setIdx(idx);
storedKeywordByText.put(triple, 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

@@ -43,7 +43,6 @@ import forge.game.Game;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.StaticEffect; import forge.game.StaticEffect;
import forge.game.StaticEffects; import forge.game.StaticEffects;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType; import forge.game.ability.ApiType;
import forge.game.card.Card; import forge.game.card.Card;
@@ -630,40 +629,26 @@ public final class StaticAbilityContinuous {
List<KeywordInterface> keywords = Lists.newArrayList(); List<KeywordInterface> keywords = Lists.newArrayList();
for (SpellAbility sa : state.getSpellAbilities()) { for (SpellAbility sa : state.getSpellAbilities()) {
SpellAbility newSA = sa.copy(affectedCard, false); spellAbilities.add(affectedCard.getSpellAbilityForStaticAbilityByText(sa, stAb));
newSA.setOriginalAbility(sa); // need to be set to get the Once Per turn Clause correct
newSA.setGrantorStatic(stAb);
//newSA.setIntrinsic(false); needs to be changed by CardTextChanges
spellAbilities.add(newSA);
} }
if (params.containsKey("GainTextAbilities")) { if (params.containsKey("GainTextAbilities")) {
for (String ability : params.get("GainTextAbilities").split(" & ")) { for (String ability : params.get("GainTextAbilities").split(" & ")) {
final SpellAbility sa = AbilityFactory.getAbility(AbilityUtils.getSVar(stAb, ability), affectedCard, stAb); spellAbilities.add(affectedCard.getSpellAbilityForStaticAbilityGainedByText(AbilityUtils.getSVar(stAb, ability), stAb));
sa.setIntrinsic(true); // needs to be affected by Text
sa.setGrantorStatic(stAb);
spellAbilities.add(sa);
} }
} }
for (Trigger tr : state.getTriggers()) { for (Trigger tr : state.getTriggers()) {
Trigger newTr = tr.copy(affectedCard, false); trigger.add(affectedCard.getTriggerForStaticAbilityByText(tr, stAb));
//newTr.setIntrinsic(false); needs to be changed by CardTextChanges
trigger.add(newTr);
} }
for (ReplacementEffect re : state.getReplacementEffects()) { for (ReplacementEffect re : state.getReplacementEffects()) {
ReplacementEffect newRE = re.copy(affectedCard, false); replacementEffects.add(affectedCard.getReplacementEffectForStaticAbilityByText(re, stAb));
//newRE.setIntrinsic(false); needs to be changed by CardTextChanges
replacementEffects.add(newRE);
} }
for (StaticAbility sa : state.getStaticAbilities()) { for (StaticAbility st : state.getStaticAbilities()) {
StaticAbility newST = sa.copy(affectedCard, false); staticAbilities.add(affectedCard.getStaticAbilityForStaticAbilityByText(st, stAb));
//newST.setIntrinsic(false); needs to be changed by CardTextChanges
staticAbilities.add(newST);
} }
long kwIdx = 1;
for (KeywordInterface ki : state.getIntrinsicKeywords()) { for (KeywordInterface ki : state.getIntrinsicKeywords()) {
KeywordInterface newKi = ki.copy(affectedCard, false); keywords.add(affectedCard.getKeywordForStaticAbilityByText(ki, stAb, kwIdx));
//newKi.setIntrinsic(false); needs to be changed by CardTextChanges kwIdx++;
keywords.add(newKi);
} }
// Volraths Shapeshifter has that cards name, mana cost, color, types, abilities, power, and toughness. // Volraths Shapeshifter has that cards name, mana cost, color, types, abilities, power, and toughness.