CardState & Keyword when copying the keywords and cardtraits, update the hostcard for them

for Keyword, update them when the Keyword get's copied
This commit is contained in:
Hanmac
2017-10-30 10:17:18 +00:00
parent b61267d3bd
commit 003d7ac606
4 changed files with 46 additions and 22 deletions

View File

@@ -159,7 +159,7 @@ public class CardState extends GameObject {
public final void setIntrinsicKeywords(final Iterable<KeywordInterface> intrinsicKeyword0) { public final void setIntrinsicKeywords(final Iterable<KeywordInterface> intrinsicKeyword0) {
intrinsicKeywords.clear(); intrinsicKeywords.clear();
for (KeywordInterface k : intrinsicKeyword0) { for (KeywordInterface k : intrinsicKeyword0) {
intrinsicKeywords.insert(k.copy()); intrinsicKeywords.insert(k.copy(card));
} }
} }
@@ -371,28 +371,41 @@ public class CardState extends GameObject {
setBaseToughness(source.getBaseToughness()); setBaseToughness(source.getBaseToughness());
setSVars(source.getSVars()); setSVars(source.getSVars());
this.manaAbilities.clear(); manaAbilities.clear();
for (SpellAbility sa : source.manaAbilities) { for (SpellAbility sa : source.manaAbilities) {
this.manaAbilities.add(sa.copy()); SpellAbility saCopy = sa.copy();
saCopy.setHostCard(card); // update HostCard
manaAbilities.add(saCopy);
} }
this.nonManaAbilities.clear(); nonManaAbilities.clear();
for (SpellAbility sa : source.nonManaAbilities) { for (SpellAbility sa : source.nonManaAbilities) {
this.nonManaAbilities.add(sa.copy()); SpellAbility saCopy = sa.copy();
saCopy.setHostCard(card); // update HostCard
nonManaAbilities.add(saCopy);
} }
setIntrinsicKeywords(source.intrinsicKeywords.getValues()); setIntrinsicKeywords(source.intrinsicKeywords.getValues());
setImageKey(source.getImageKey()); setImageKey(source.getImageKey());
setRarity(source.rarity); setRarity(source.rarity);
setSetCode(source.setCode); setSetCode(source.setCode);
replacementEffects.clear();
for (ReplacementEffect RE : source.replacementEffects) { triggers.clear();
replacementEffects.add(RE.getCopy()); for (Trigger tr : source.triggers) {
triggers.add(tr.getCopyForHostCard(card));
} }
this.staticAbilities.clear();
replacementEffects.clear();
for (ReplacementEffect re : source.replacementEffects) {
ReplacementEffect reCopy = re.getCopy();
reCopy.setHostCard(card);
replacementEffects.add(reCopy);
}
staticAbilities.clear();
for (StaticAbility sa : source.staticAbilities) { for (StaticAbility sa : source.staticAbilities) {
StaticAbility saCopy = new StaticAbility(sa, this.card); StaticAbility saCopy = new StaticAbility(sa, this.card);
this.staticAbilities.add(saCopy); staticAbilities.add(saCopy);
} }
view.updateKeywords(c, this); view.updateKeywords(c, this);
} }
@@ -430,7 +443,10 @@ public class CardState extends GameObject {
public List<String> addIntrinsicKeywords(Collection<KeywordInterface> intrinsicKeywords2) { public List<String> addIntrinsicKeywords(Collection<KeywordInterface> intrinsicKeywords2) {
List<String> names = Lists.newArrayList(); List<String> names = Lists.newArrayList();
for (KeywordInterface inst : intrinsicKeywords2) { for (KeywordInterface inst : intrinsicKeywords2) {
names.add(inst.getOriginal()); String o = inst.getOriginal();
if (addIntrinsicKeyword(o, false) != null) {
names.add(o);
}
} }
return names; return names;
} }

View File

@@ -180,28 +180,32 @@ public abstract class KeywordInstance<T extends KeywordInstance<?>> implements K
* (non-Javadoc) * (non-Javadoc)
* @see forge.game.keyword.KeywordInterface#copy() * @see forge.game.keyword.KeywordInterface#copy()
*/ */
public KeywordInterface copy() { public KeywordInterface copy(final Card host) {
try { try {
KeywordInstance<?> result = (KeywordInstance<?>) super.clone(); KeywordInstance<?> result = (KeywordInstance<?>) super.clone();
result.abilities = Lists.newArrayList(); result.abilities = Lists.newArrayList();
for (SpellAbility sa : this.abilities) { for (SpellAbility sa : this.abilities) {
result.abilities.add(sa.copy()); SpellAbility saCopy = sa.copy();
saCopy.setHostCard(host);
result.abilities.add(saCopy);
} }
result.triggers = Lists.newArrayList(); result.triggers = Lists.newArrayList();
for (Trigger tr : this.triggers) { for (Trigger tr : this.triggers) {
result.triggers.add(tr.getCopyForHostCard(tr.getHostCard())); result.triggers.add(tr.getCopyForHostCard(host));
} }
result.replacements = Lists.newArrayList(); result.replacements = Lists.newArrayList();
for (ReplacementEffect re : this.replacements) { for (ReplacementEffect re : this.replacements) {
result.replacements.add(re.getCopy()); ReplacementEffect reCopy = re.getCopy();
reCopy.setHostCard(host);
result.replacements.add(reCopy);
} }
result.staticAbilities = Lists.newArrayList(); result.staticAbilities = Lists.newArrayList();
for (StaticAbility sa : this.staticAbilities) { for (StaticAbility sa : this.staticAbilities) {
result.staticAbilities.add(new StaticAbility(sa, sa.getHostCard())); result.staticAbilities.add(new StaticAbility(sa, host));
} }
return result; return result;

View File

@@ -49,5 +49,5 @@ public interface KeywordInterface extends Cloneable {
*/ */
public Collection<StaticAbility> getStaticAbilities(); public Collection<StaticAbility> getStaticAbilities();
public KeywordInterface copy(); public KeywordInterface copy(final Card host);
} }

View File

@@ -513,11 +513,15 @@ public abstract class Trigger extends TriggerReplacementBase {
SpellAbility old = this.getOverridingAbility(); SpellAbility old = this.getOverridingAbility();
SpellAbility sa = old; SpellAbility sa = old;
// try to copy it if newHost is not the wanted host // try to copy it if newHost is not the wanted host
if (!newHost.equals(old.getHostCard())) { final Card oldHost = old.getHostCard();
if (old instanceof AbilitySub) { if (!newHost.equals(oldHost)) {
sa = ((AbilitySub)old).getCopy(); if (old instanceof AbilitySub) {
sa.setHostCard(newHost); sa = ((AbilitySub)old).getCopy();
} sa.setHostCard(newHost);
}
} else if (newHost != oldHost) {
//host would be the same, but different state?
sa.setHostCard(newHost);
} }
copy.setOverridingAbility(sa); copy.setOverridingAbility(sa);
} }