From af76c37cbb1c4fa6f10c0dcc6ed67df998ee6c5a Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 5 Sep 2018 07:24:55 +0200 Subject: [PATCH] ReplaceDying moved to SpellAbilityEffect --- .../game/ability/SpellAbilityEffect.java | 80 +++++++++++++++++++ .../ability/effects/DamageBaseEffect.java | 80 ------------------- .../game/ability/effects/PumpAllEffect.java | 2 + .../game/ability/effects/PumpEffect.java | 2 + 4 files changed, 84 insertions(+), 80 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 6670b9bab6d..cff15f16e83 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -10,6 +10,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Lists; +import forge.GameCommand; import forge.card.CardType; import forge.game.Game; import forge.game.GameObject; @@ -385,4 +386,83 @@ public abstract class SpellAbilityEffect { return eff; } + + protected static void replaceDying(final SpellAbility sa) { + if (sa.hasParam("ReplaceDyingDefined") || sa.hasParam("ReplaceDyingValid")) { + + if (sa.hasParam("ReplaceDyingCondition")) { + // currently there is only one with Kicker + final String condition = sa.getParam("ReplaceDyingCondition"); + if ("Kicked".equals(condition)) { + if (!sa.isKicked()) { + return; + } + } + } + + final Card host = sa.getHostCard(); + final Player controller = sa.getActivatingPlayer(); + final Game game = host.getGame(); + String zone = sa.getParamOrDefault("ReplaceDyingZone", "Exile"); + + CardCollection cards = null; + + if (sa.hasParam("ReplaceDyingDefined")) { + cards = AbilityUtils.getDefinedCards(host, sa.getParam("ReplaceDyingDefined"), sa); + // no cards, no need for Effect + if (cards.isEmpty()) { + return; + } + } + + // build an Effect with that infomation + String name = host.getName() + "'s Effect"; + + final Card eff = createEffect(host, controller, name, host.getImageKey()); + if (cards != null) { + eff.addRemembered(cards); + } + + String valid = sa.getParamOrDefault("ReplaceDyingValid", "Card.IsRemembered"); + + String repeffstr = "Event$ Moved | ValidCard$ " + valid + + "| Origin$ Battlefield | Destination$ Graveyard " + + "| Description$ If the creature would die this turn, exile it instead."; + String effect = "DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ " + zone; + + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); + re.setLayer(ReplacementLayer.Other); + + re.setOverridingAbility(AbilityFactory.getAbility(effect, eff)); + eff.addReplacementEffect(re); + + if (cards != null) { + // Add forgot trigger + addForgetOnMovedTrigger(eff, "Battlefield"); + } + + // Copy text changes + if (sa.isIntrinsic()) { + eff.copyChangedTextFrom(host); + } + + final GameCommand endEffect = new GameCommand() { + private static final long serialVersionUID = -5861759814760561373L; + + @Override + public void run() { + game.getAction().exile(eff, null); + } + }; + + game.getEndOfTurn().addUntil(endEffect); + + eff.updateStateForView(); + + // TODO: Add targeting to the effect so it knows who it's dealing with + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff, sa); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + } + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageBaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageBaseEffect.java index 2f17ffbb8b6..95b5092d6cd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageBaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageBaseEffect.java @@ -1,87 +1,7 @@ package forge.game.ability.effects; -import forge.GameCommand; -import forge.game.Game; -import forge.game.ability.AbilityFactory; -import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.player.Player; -import forge.game.replacement.ReplacementEffect; -import forge.game.replacement.ReplacementHandler; -import forge.game.replacement.ReplacementLayer; -import forge.game.spellability.SpellAbility; -import forge.game.trigger.TriggerType; -import forge.game.zone.ZoneType; abstract public class DamageBaseEffect extends SpellAbilityEffect { - static void replaceDying(final SpellAbility sa) { - if (sa.hasParam("ReplaceDyingDefined")) { - - if (sa.hasParam("ReplaceDyingCondition")) { - // currently there is only one with Kicker - final String condition = sa.getParam("ReplaceDyingCondition"); - if ("Kicked".equals(condition)) { - if (!sa.isKicked()) { - return; - } - } - } - - final Card host = sa.getHostCard(); - final Player controller = sa.getActivatingPlayer(); - final Game game = host.getGame(); - String zone = sa.getParamOrDefault("ReplaceDyingZone", "Exile"); - CardCollection cards = AbilityUtils.getDefinedCards(host, sa.getParam("ReplaceDyingDefined"), sa); - // no cards, no need for Effect - if (cards.isEmpty()) { - return; - } - - // build an Effect with that infomation - String name = host.getName() + "'s Effect"; - - final Card eff = createEffect(host, controller, name, host.getImageKey()); - eff.addRemembered(cards); - - String repeffstr = "Event$ Moved | ValidCard$ Card.IsRemembered " + - "| Origin$ Battlefield | Destination$ Graveyard " + - "| Description$ If the creature would die this turn, exile it instead."; - String effect = "DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ " + zone; - - ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); - re.setLayer(ReplacementLayer.Other); - - re.setOverridingAbility(AbilityFactory.getAbility(effect, eff)); - eff.addReplacementEffect(re); - - // Add forgot trigger - addForgetOnMovedTrigger(eff, "Battlefield"); - - // Copy text changes - if (sa.isIntrinsic()) { - eff.copyChangedTextFrom(host); - } - - final GameCommand endEffect = new GameCommand() { - private static final long serialVersionUID = -5861759814760561373L; - - @Override - public void run() { - game.getAction().exile(eff, null); - } - }; - - game.getEndOfTurn().addUntil(endEffect); - - eff.updateStateForView(); - - // TODO: Add targeting to the effect so it knows who it's dealing with - game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); - game.getAction().moveTo(ZoneType.Command, eff, sa); - game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); - } - } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index e009bc3f718..c149b976412 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -158,6 +158,8 @@ public class PumpAllEffect extends SpellAbilityEffect { keywords = CardFactoryUtil.sharedKeywords(keywords, restrictions, zones, sa.getHostCard()); } applyPumpAll(sa, list, a, d, keywords, affectedZones); + + replaceDying(sa); } // pumpAllResolve() } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index b954cc7cdfc..c7841849b9e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -383,5 +383,7 @@ public class PumpEffect extends SpellAbilityEffect { applyPump(sa, p, keywords, timestamp); } + + replaceDying(sa); } // pumpResolve() }