From f792a5b79e9365d2df1a6469ac24904a31494ef4 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 7 Sep 2024 16:19:17 +0200 Subject: [PATCH] Impending: use Effect for Last Time counter removed (#6096) --- .../game/ability/SpellAbilityEffect.java | 21 ++++++++++----- .../game/ability/effects/EffectEffect.java | 4 +++ .../java/forge/game/card/CardFactoryUtil.java | 27 ++++++++++++------- 3 files changed, 36 insertions(+), 16 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 5cc2cc77320..a8f232bb366 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -463,6 +463,11 @@ public abstract class SpellAbilityEffect { card.addChangedSVars(Collections.singletonMap("EndOfTurnLeavePlay", "AtEOT"), card.getGame().getNextTimestamp(), 0); } + protected static SpellAbility getExileSpellAbility(final Card card) { + String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"; + return AbilityFactory.getAbility(effect, card); + } + protected static SpellAbility getForgetSpellAbility(final Card card) { String forgetEffect = "DB$ Pump | ForgetObjects$ TriggeredCard"; String exileEffect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile" @@ -498,17 +503,15 @@ public abstract class SpellAbilityEffect { protected static void addExileOnMovedTrigger(final Card card, final String zone) { String trig = "Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ " + zone + " | Destination$ Any | TriggerZones$ Command | Static$ True"; - String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"; final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true); - parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + parsedTrigger.setOverridingAbility(getExileSpellAbility(card)); card.addTrigger(parsedTrigger); } protected static void addExileOnCounteredTrigger(final Card card) { String trig = "Mode$ Countered | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True"; - String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"; final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true); - parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + parsedTrigger.setOverridingAbility(getExileSpellAbility(card)); card.addTrigger(parsedTrigger); } @@ -520,6 +523,13 @@ public abstract class SpellAbilityEffect { card.addTrigger(parsedTrigger); } + protected static void addExileCounterTrigger(final Card card, final String counterType) { + String trig = "Mode$ CounterRemoved | TriggerZones$ Command | ValidCard$ Card.EffectSource | CounterType$ " + counterType + " | NewCounterAmount$ 0 | Static$ True"; + final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true); + parsedTrigger.setOverridingAbility(getExileSpellAbility(card)); + card.addTrigger(parsedTrigger); + } + protected static void addForgetCounterTrigger(final Card card, final String counterType) { String trig = "Mode$ CounterRemoved | TriggerZones$ Command | ValidCard$ Card.IsRemembered | CounterType$ " + counterType + " | NewCounterAmount$ 0 | Static$ True"; String trig2 = "Mode$ PhaseOut | TriggerZones$ Command | ValidCard$ Card.phasedOutIsRemembered | Static$ True"; @@ -536,9 +546,8 @@ public abstract class SpellAbilityEffect { protected static void addExileOnLostTrigger(final Card card) { String trig = "Mode$ LosesGame | ValidPlayer$ You | TriggerController$ Player | TriggerZones$ Command | Static$ True"; - String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"; final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true); - parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + parsedTrigger.setOverridingAbility(getExileSpellAbility(card)); card.addTrigger(parsedTrigger); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index 38d61b3a4ed..09382b1e310 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -251,6 +251,10 @@ public class EffectEffect extends SpellAbilityEffect { addExileOnLostTrigger(eff); } + if (sa.hasParam("ExileOnCounter")) { + addExileCounterTrigger(eff, sa.getParam("ExileOnCounter")); + } + // Set Imprinted if (effectImprinted != null) { eff.addImprintedCards(AbilityUtils.getDefinedCards(hostCard, effectImprinted, sa)); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 806a9a174e9..bafa7a238f5 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1067,8 +1067,8 @@ public class CardFactoryUtil { pump.setSubAbility(remove); remove.setSubAbility(cleanup); trigger.setOverridingAbility(trigMake); - - inst.addTrigger(trigger); + + inst.addTrigger(trigger); } else if (keyword.startsWith("Echo")) { final String[] k = keyword.split(":"); final String cost = k[1]; @@ -1381,7 +1381,7 @@ public class CardFactoryUtil { String hideawayDig = "DB$ Dig | Defined$ You | DigNum$ " + n + " | DestinationZone$ Exile | ExileFaceDown$ True | RememberChanged$ True | RestRandomOrder$ True"; String hideawayEffect = "DB$ Effect | StaticAbilities$ STHideawayEffectLookAtCard | ForgetOnMoved$ Exile | RememberObjects$ Remembered | Duration$ Permanent"; String cleanupStr = "DB$ Cleanup | ClearRemembered$ True"; - + String lookAtCard = "Mode$ Continuous | Affected$ Card.IsRemembered | MayLookAt$ EffectSourceController | EffectZone$ Command | AffectedZone$ Exile | Description$ Any player who has controlled the permanent that exiled this card may look at this card in the exile zone."; SpellAbility digSA = AbilityFactory.getAbility(hideawayDig, card); @@ -1597,7 +1597,7 @@ public class CardFactoryUtil { trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); trigger.setSVar("Offspring", "Count$OptionalKeywordAmount"); - inst.addTrigger(trigger); + inst.addTrigger(trigger); } else if (keyword.startsWith("Partner:")) { // Partner With final String[] k = keyword.split(":"); @@ -2354,7 +2354,17 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | Defined$ ReplacedCard | CounterType$ TIME | CounterNum$ " + m + " | ETB$ True | SpellDescription$ " + desc; - final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, effect, false, true, intrinsic, "Card.Self+impended", ""); + SpellAbility repAb = AbilityFactory.getAbility(effect, card); + + String staticEffect = "DB$ Effect | StaticAbilities$ NoCreature | ExileOnCounter$ TIME | Duration$ UntilHostLeavesPlay"; + + String staticNoCreature = "Mode$ Continuous | Affected$ Card.EffectSource+counters_GE1_TIME | RemoveType$ Creature | Description$ EFFECTSOURCE isn't a creature."; + + AbilitySub effectAb = (AbilitySub)AbilityFactory.getAbility(staticEffect, card); + effectAb.setSVar("NoCreature", staticNoCreature); + repAb.setSubAbility(effectAb); + + final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, repAb, false, true, intrinsic, "Card.Self+impended", ""); inst.addReplacement(re); } else if (keyword.equals("Jump-start")) { @@ -2438,7 +2448,7 @@ public class CardFactoryUtil { re.setOverridingAbility(saCounter); - inst.addReplacement(re); + inst.addReplacement(re); } else if (keyword.equals("Rebound")) { String repeffstr = "Event$ Moved | ValidLKI$ Card.Self+wasCastFromHand+YouOwn+YouCtrl " + " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False " @@ -2729,7 +2739,7 @@ public class CardFactoryUtil { sbRem.append(i + 1 == bCost.getCostParts().size() ? "." : " and "); i++; } - remTxt = sbRem.toString(); + remTxt = sbRem.toString(); } sbDesc.append(onlyMana ? " " : "—").append(bCost.toSimpleString()).append(!onlyMana ? "." : ""); sbDesc.append(" (").append(remTxt).append(")"); @@ -3988,9 +3998,6 @@ public class CardFactoryUtil { String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutHorsemanship | Secondary$ True " + " | Description$ Horsemanship (" + inst.getReminderText() + ")"; inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic)); - } else if (keyword.startsWith("Impending")) { - String effect = "Mode$ Continuous | Affected$ Card.Self+counters_GE1_TIME | RemoveType$ Creature | Secondary$ True"; - inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic)); } else if (keyword.equals("Intimidate")) { String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+notSharesColorWith | Secondary$ True " + " | Description$ Intimidate (" + inst.getReminderText() + ")";