mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18: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
|
* 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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user