CloneEffect: now with NewName and GainThisAbility

This commit is contained in:
Hanmac
2018-10-11 08:09:48 +02:00
committed by Agetian
parent 5589b4a70b
commit d76aa634c9
5 changed files with 50 additions and 9 deletions

View File

@@ -62,7 +62,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView {
* Keys that should not changed * Keys that should not changed
*/ */
private static final ImmutableList<String> noChangeKeys = ImmutableList.<String>builder() private static final ImmutableList<String> noChangeKeys = ImmutableList.<String>builder()
.add("TokenScript", "LegacyImage", "TokenImage").build(); .add("TokenScript", "LegacyImage", "TokenImage", "NewName").build();
/** /**
* Sets the temporary. * Sets the temporary.
* *

View File

@@ -113,6 +113,7 @@ public class CloneEffect extends SpellAbilityEffect {
} }
final boolean keepName = sa.hasParam("KeepName"); final boolean keepName = sa.hasParam("KeepName");
final String newName = sa.getParamOrDefault("NewName", null);
final String originalName = tgtCard.getName(); final String originalName = tgtCard.getName();
final boolean copyingSelf = (tgtCard == cardToCopy); final boolean copyingSelf = (tgtCard == cardToCopy);
final boolean isTransformed = cardToCopy.getCurrentStateName() == CardStateName.Transformed || cardToCopy.getCurrentStateName() == CardStateName.Meld; final boolean isTransformed = cardToCopy.getCurrentStateName() == CardStateName.Transformed || cardToCopy.getCurrentStateName() == CardStateName.Meld;
@@ -157,9 +158,13 @@ public class CloneEffect extends SpellAbilityEffect {
} }
// restore name if it should be unchanged // restore name if it should be unchanged
// this should only be used for Sakashima the Impostor Avatar
if (keepName) { if (keepName) {
tgtCard.setName(originalName); tgtCard.setName(originalName);
} }
if (newName != null) {
tgtCard.setName(newName);
}
// If target is a flip card, also set characteristics of the flipped // If target is a flip card, also set characteristics of the flipped
// state. // state.
@@ -168,6 +173,9 @@ public class CloneEffect extends SpellAbilityEffect {
if (keepName) { if (keepName) {
flippedState.setName(originalName); flippedState.setName(originalName);
} }
if (newName != null) {
tgtCard.setName(newName);
}
//keep the Clone card image for the cloned card //keep the Clone card image for the cloned card
flippedState.setImageKey(imageFileName); flippedState.setImageKey(imageFileName);
} }
@@ -350,6 +358,18 @@ public class CloneEffect extends SpellAbilityEffect {
tgtCard.setBasePower(4); tgtCard.setBasePower(4);
tgtCard.setBaseToughness(4); tgtCard.setBaseToughness(4);
} }
if (sa.hasParam("GainThisAbility")) {
SpellAbility root = sa.getRootAbility();
if (root.isTrigger() && root.getTrigger() != null) {
tgtCard.addTrigger(root.getTrigger().copy(tgtCard, false));
} else if (root.isReplacementAbility()) {
tgtCard.addReplacementEffect(root.getReplacementEffect().copy(tgtCard, false));
} else {
tgtCard.addSpellAbility(root.copy(tgtCard, false));
}
}
} }
} }

View File

@@ -181,7 +181,7 @@ public class ReplacementHandler {
final String effectAbString = host.getSVar(effectSVar); final String effectAbString = host.getSVar(effectSVar);
// TODO: the source of replacement effect should be the source of the original effect // TODO: the source of replacement effect should be the source of the original effect
effectSA = AbilityFactory.getAbility(effectAbString, host); effectSA = AbilityFactory.getAbility(effectAbString, host);
effectSA.setTrigger(true); //effectSA.setTrigger(true);
SpellAbility tailend = effectSA; SpellAbility tailend = effectSA;
do { do {
@@ -209,8 +209,9 @@ public class ReplacementHandler {
if (replacementEffect.isIntrinsic()) { if (replacementEffect.isIntrinsic()) {
effectSA.setIntrinsic(true); effectSA.setIntrinsic(true);
effectSA.changeText(); effectSA.changeText();
effectSA.setReplacementAbility(true);
} }
effectSA.setReplacementAbility(true);
effectSA.setReplacementEffect(replacementEffect);
} }
// Decider gets to choose whether or not to apply the replacement. // Decider gets to choose whether or not to apply the replacement.

View File

@@ -38,7 +38,9 @@ import forge.game.cost.CostRemoveCounter;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect;
import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.trigger.WrappedAbility; import forge.game.trigger.WrappedAbility;
import forge.util.Expressions; import forge.util.Expressions;
@@ -87,8 +89,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private boolean basicSpell = true; private boolean basicSpell = true;
private boolean trigger = false; private boolean trigger = false;
private Trigger triggerObj = null;
private boolean optionalTrigger = false; private boolean optionalTrigger = false;
private boolean replacementAbility = false; private boolean replacementAbility = false;
private ReplacementEffect replacementEffect = null;
private int sourceTrigger = -1; private int sourceTrigger = -1;
private List<Object> triggerRemembered = Lists.newArrayList(); private List<Object> triggerRemembered = Lists.newArrayList();
@@ -913,6 +917,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
trigger = trigger0; trigger = trigger0;
} }
public Trigger getTrigger() {
return triggerObj;
}
public void setTrigger(final Trigger t) {
triggerObj = t;
}
public boolean isOptionalTrigger() { public boolean isOptionalTrigger() {
return optionalTrigger; return optionalTrigger;
} }
@@ -934,6 +946,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
replacementAbility = replacement; replacementAbility = replacement;
} }
public ReplacementEffect getReplacementEffect() {
return replacementEffect;
}
public void setReplacementEffect(final ReplacementEffect re) {
this.replacementEffect = re;
}
public boolean isMandatory() { public boolean isMandatory() {
return false; return false;
} }

View File

@@ -27,14 +27,13 @@ import com.google.common.collect.Lists;
public class WrappedAbility extends Ability { public class WrappedAbility extends Ability {
private final SpellAbility sa; private final SpellAbility sa;
private final Trigger regtrig;
private final Player decider; private final Player decider;
boolean mandatory = false; boolean mandatory = false;
public WrappedAbility(final Trigger regtrig0, final SpellAbility sa0, final Player decider0) { public WrappedAbility(final Trigger regtrig0, final SpellAbility sa0, final Player decider0) {
super(regtrig0.getHostCard(), ManaCost.ZERO, sa0.getView()); super(regtrig0.getHostCard(), ManaCost.ZERO, sa0.getView());
regtrig = regtrig0; setTrigger(regtrig0);
sa = sa0; sa = sa0;
decider = decider0; decider = decider0;
sa.setDescription(this.getStackDescription()); sa.setDescription(this.getStackDescription());
@@ -49,10 +48,6 @@ public class WrappedAbility extends Ability {
return true; return true;
} }
public Trigger getTrigger() {
return regtrig;
}
public Player getDecider() { public Player getDecider() {
return decider; return decider;
} }
@@ -218,6 +213,7 @@ public class WrappedAbility extends Ability {
@Override @Override
public String getStackDescription() { public String getStackDescription() {
final Trigger regtrig = getTrigger();
final StringBuilder sb = new StringBuilder(regtrig.replaceAbilityText(regtrig.toString(true), this)); final StringBuilder sb = new StringBuilder(regtrig.replaceAbilityText(regtrig.toString(true), this));
if (usesTargeting()) { if (usesTargeting()) {
sb.append(" (Targeting "); sb.append(" (Targeting ");
@@ -445,6 +441,7 @@ public class WrappedAbility extends Ability {
@Override @Override
public void resolve() { public void resolve() {
final Game game = sa.getActivatingPlayer().getGame(); final Game game = sa.getActivatingPlayer().getGame();
final Trigger regtrig = getTrigger();
Map<String, String> triggerParams = regtrig.getMapParams(); Map<String, String> triggerParams = regtrig.getMapParams();
if (!(regtrig instanceof TriggerAlways) && !triggerParams.containsKey("NoResolvingCheck")) { if (!(regtrig instanceof TriggerAlways) && !triggerParams.containsKey("NoResolvingCheck")) {
@@ -476,6 +473,9 @@ public class WrappedAbility extends Ability {
return; return;
} }
// set Trigger
sa.setTrigger(regtrig);
if (!triggerParams.containsKey("NoTimestampCheck")) { if (!triggerParams.containsKey("NoTimestampCheck")) {
timestampCheck(); timestampCheck();
} }