mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
CloneEffect: now with NewName and GainThisAbility
This commit is contained in:
@@ -62,7 +62,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView {
|
||||
* Keys that should not changed
|
||||
*/
|
||||
private static final ImmutableList<String> noChangeKeys = ImmutableList.<String>builder()
|
||||
.add("TokenScript", "LegacyImage", "TokenImage").build();
|
||||
.add("TokenScript", "LegacyImage", "TokenImage", "NewName").build();
|
||||
/**
|
||||
* Sets the temporary.
|
||||
*
|
||||
|
||||
@@ -113,6 +113,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
final boolean keepName = sa.hasParam("KeepName");
|
||||
final String newName = sa.getParamOrDefault("NewName", null);
|
||||
final String originalName = tgtCard.getName();
|
||||
final boolean copyingSelf = (tgtCard == cardToCopy);
|
||||
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
|
||||
// this should only be used for Sakashima the Impostor Avatar
|
||||
if (keepName) {
|
||||
tgtCard.setName(originalName);
|
||||
}
|
||||
if (newName != null) {
|
||||
tgtCard.setName(newName);
|
||||
}
|
||||
|
||||
// If target is a flip card, also set characteristics of the flipped
|
||||
// state.
|
||||
@@ -168,6 +173,9 @@ public class CloneEffect extends SpellAbilityEffect {
|
||||
if (keepName) {
|
||||
flippedState.setName(originalName);
|
||||
}
|
||||
if (newName != null) {
|
||||
tgtCard.setName(newName);
|
||||
}
|
||||
//keep the Clone card image for the cloned card
|
||||
flippedState.setImageKey(imageFileName);
|
||||
}
|
||||
@@ -350,6 +358,18 @@ public class CloneEffect extends SpellAbilityEffect {
|
||||
tgtCard.setBasePower(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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ public class ReplacementHandler {
|
||||
final String effectAbString = host.getSVar(effectSVar);
|
||||
// TODO: the source of replacement effect should be the source of the original effect
|
||||
effectSA = AbilityFactory.getAbility(effectAbString, host);
|
||||
effectSA.setTrigger(true);
|
||||
//effectSA.setTrigger(true);
|
||||
|
||||
SpellAbility tailend = effectSA;
|
||||
do {
|
||||
@@ -209,8 +209,9 @@ public class ReplacementHandler {
|
||||
if (replacementEffect.isIntrinsic()) {
|
||||
effectSA.setIntrinsic(true);
|
||||
effectSA.changeText();
|
||||
effectSA.setReplacementAbility(true);
|
||||
}
|
||||
effectSA.setReplacementAbility(true);
|
||||
effectSA.setReplacementEffect(replacementEffect);
|
||||
}
|
||||
|
||||
// Decider gets to choose whether or not to apply the replacement.
|
||||
|
||||
@@ -38,7 +38,9 @@ import forge.game.cost.CostRemoveCounter;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.game.mana.Mana;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.replacement.ReplacementEffect;
|
||||
import forge.game.staticability.StaticAbility;
|
||||
import forge.game.trigger.Trigger;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.game.trigger.WrappedAbility;
|
||||
import forge.util.Expressions;
|
||||
@@ -87,8 +89,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
|
||||
private boolean basicSpell = true;
|
||||
private boolean trigger = false;
|
||||
private Trigger triggerObj = null;
|
||||
private boolean optionalTrigger = false;
|
||||
private boolean replacementAbility = false;
|
||||
private ReplacementEffect replacementEffect = null;
|
||||
private int sourceTrigger = -1;
|
||||
private List<Object> triggerRemembered = Lists.newArrayList();
|
||||
|
||||
@@ -913,6 +917,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
trigger = trigger0;
|
||||
}
|
||||
|
||||
public Trigger getTrigger() {
|
||||
return triggerObj;
|
||||
}
|
||||
|
||||
public void setTrigger(final Trigger t) {
|
||||
triggerObj = t;
|
||||
}
|
||||
|
||||
public boolean isOptionalTrigger() {
|
||||
return optionalTrigger;
|
||||
}
|
||||
@@ -934,6 +946,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
replacementAbility = replacement;
|
||||
}
|
||||
|
||||
public ReplacementEffect getReplacementEffect() {
|
||||
return replacementEffect;
|
||||
}
|
||||
|
||||
public void setReplacementEffect(final ReplacementEffect re) {
|
||||
this.replacementEffect = re;
|
||||
}
|
||||
|
||||
public boolean isMandatory() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -27,14 +27,13 @@ import com.google.common.collect.Lists;
|
||||
public class WrappedAbility extends Ability {
|
||||
|
||||
private final SpellAbility sa;
|
||||
private final Trigger regtrig;
|
||||
private final Player decider;
|
||||
|
||||
boolean mandatory = false;
|
||||
|
||||
public WrappedAbility(final Trigger regtrig0, final SpellAbility sa0, final Player decider0) {
|
||||
super(regtrig0.getHostCard(), ManaCost.ZERO, sa0.getView());
|
||||
regtrig = regtrig0;
|
||||
setTrigger(regtrig0);
|
||||
sa = sa0;
|
||||
decider = decider0;
|
||||
sa.setDescription(this.getStackDescription());
|
||||
@@ -49,10 +48,6 @@ public class WrappedAbility extends Ability {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Trigger getTrigger() {
|
||||
return regtrig;
|
||||
}
|
||||
|
||||
public Player getDecider() {
|
||||
return decider;
|
||||
}
|
||||
@@ -218,6 +213,7 @@ public class WrappedAbility extends Ability {
|
||||
|
||||
@Override
|
||||
public String getStackDescription() {
|
||||
final Trigger regtrig = getTrigger();
|
||||
final StringBuilder sb = new StringBuilder(regtrig.replaceAbilityText(regtrig.toString(true), this));
|
||||
if (usesTargeting()) {
|
||||
sb.append(" (Targeting ");
|
||||
@@ -445,6 +441,7 @@ public class WrappedAbility extends Ability {
|
||||
@Override
|
||||
public void resolve() {
|
||||
final Game game = sa.getActivatingPlayer().getGame();
|
||||
final Trigger regtrig = getTrigger();
|
||||
Map<String, String> triggerParams = regtrig.getMapParams();
|
||||
|
||||
if (!(regtrig instanceof TriggerAlways) && !triggerParams.containsKey("NoResolvingCheck")) {
|
||||
@@ -476,6 +473,9 @@ public class WrappedAbility extends Ability {
|
||||
return;
|
||||
}
|
||||
|
||||
// set Trigger
|
||||
sa.setTrigger(regtrig);
|
||||
|
||||
if (!triggerParams.containsKey("NoTimestampCheck")) {
|
||||
timestampCheck();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user