From d76aa634c91b328a726aaea49e9179ebb65002ec Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 11 Oct 2018 08:09:48 +0200 Subject: [PATCH] CloneEffect: now with NewName and GainThisAbility --- .../main/java/forge/game/CardTraitBase.java | 2 +- .../game/ability/effects/CloneEffect.java | 20 +++++++++++++++++++ .../game/replacement/ReplacementHandler.java | 5 +++-- .../forge/game/spellability/SpellAbility.java | 20 +++++++++++++++++++ .../forge/game/trigger/WrappedAbility.java | 12 +++++------ 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 59c47275a5d..aacc1d389e1 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -62,7 +62,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { * Keys that should not changed */ private static final ImmutableList noChangeKeys = ImmutableList.builder() - .add("TokenScript", "LegacyImage", "TokenImage").build(); + .add("TokenScript", "LegacyImage", "TokenImage", "NewName").build(); /** * Sets the temporary. * diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index aa0ab0f4215..0dccc07d374 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -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)); + } + } } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index b1843c1850d..f08e0b660a7 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -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. diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 9eddd745b4a..3e866b91fb1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -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 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; } diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 927895756f3..b59580cd366 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -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 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(); }