From 6fe299d7c8d37f8e6f7f1c7f8401a6fd7df0c6f4 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 9 Apr 2021 18:56:52 +0200 Subject: [PATCH] StaticAbilityPanharmonicon: use LKI only for ChangeZone Trigger --- .../main/java/forge/game/CardTraitBase.java | 5 +++++ .../game/staticability/StaticAbility.java | 15 ------------- .../StaticAbilityPanharmonicon.java | 22 +++++++++++++++++++ .../forge/game/trigger/TriggerHandler.java | 21 ++---------------- 4 files changed, 29 insertions(+), 34 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index f8f9e08a61e..3b93568fde8 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -171,6 +172,10 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, return true; } } + } else if (o instanceof String) { + if (ArrayUtils.contains(valids, o)) { + return true; + } } return false; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 00bb23de497..797234ba22a 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -34,7 +34,6 @@ import forge.game.GameEntity; import forge.game.GameStage; import forge.game.IIdentifiable; import forge.game.ability.AbilityUtils; -import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; @@ -46,7 +45,6 @@ import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.trigger.Trigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.CardTranslation; @@ -460,19 +458,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone return false; } - public final boolean applyAbility(final String mode, final Trigger trigger, final Map runParams) { - // don't apply the ability if it hasn't got the right mode - if (!getParam("Mode").equals(mode)) { - return false; - } - - if (mode.equals("Panharmonicon")) { - return StaticAbilityPanharmonicon.applyPanharmoniconAbility(this, trigger, runParams); - } - - return false; - } - public final Cost getAttackCost(final Card attacker, final GameEntity target) { if (this.isSuppressed() || !getParam("Mode").equals("CantAttackUnless") || !this.checkConditions()) { return null; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPanharmonicon.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPanharmonicon.java index 2e1d6ce6429..3db32174d63 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPanharmonicon.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPanharmonicon.java @@ -1,6 +1,8 @@ package forge.game.staticability; import com.google.common.collect.ImmutableList; + +import forge.game.Game; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CardZoneTable; @@ -15,6 +17,26 @@ import java.util.Map; import org.apache.commons.lang3.ArrayUtils; public class StaticAbilityPanharmonicon { + static String MODE = "Panharmonicon"; + + public static int handlePanharmonicon(final Game game, final Trigger t, final Map runParams) { + int n = 0; + + // Checks only the battlefield, as those effects only work from there + for (final Card ca : t.getMode() == TriggerType.ChangesZone ? game.getLastStateBattlefield() : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { + for (final StaticAbility stAb : ca.getStaticAbilities()) { + if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) { + continue; + } + if (applyPanharmoniconAbility(stAb, t, runParams)) { + n++; + } + } + } + + return n; + } + public static boolean applyPanharmoniconAbility(final StaticAbility stAb, final Trigger trigger, final Map runParams) { final Card card = stAb.getHostCard(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 5068405c18f..1331c657ea6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -20,7 +20,6 @@ package forge.game.trigger; import java.util.*; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimaps; @@ -35,11 +34,10 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; import forge.game.card.*; -import forge.game.keyword.KeywordInterface; import forge.game.player.Player; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; -import forge.game.staticability.StaticAbility; +import forge.game.staticability.StaticAbilityPanharmonicon; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.FileSection; @@ -358,7 +356,7 @@ public class TriggerHandler { for (final Trigger t : triggers) { if (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, runParams)) { - int x = 1 + handlePanharmonicon(t, runParams); + int x = 1 + StaticAbilityPanharmonicon.handlePanharmonicon(game, t, runParams); for (int i = 0; i < x; ++i) { runSingleTrigger(t, runParams); @@ -622,21 +620,6 @@ public class TriggerHandler { } } - private int handlePanharmonicon(final Trigger t, final Map runParams) { - int n = 0; - - // Checks only the battlefield, as those effects only work from there - for (final Card ca : game.getLastStateBattlefield()) { - for (final StaticAbility stAb : ca.getStaticAbilities()) { - if (stAb.applyAbility("Panharmonicon", t, runParams) && stAb.checkConditions()) { - n++; - } - } - } - - return n; - } - public List getActiveTrigger(final TriggerType mode, final Map runParams) { List trigger = Lists.newArrayList(); for (final Trigger t : activeTriggers) {