StaticAbilityPanharmonicon: use LKI only for ChangeZone Trigger

This commit is contained in:
Hans Mackowiak
2021-04-09 18:56:52 +02:00
parent 04940fc4db
commit 6fe299d7c8
4 changed files with 29 additions and 34 deletions

View File

@@ -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;

View File

@@ -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<AbilityKey, Object> 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;

View File

@@ -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<AbilityKey, Object> 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<AbilityKey, Object> runParams) {
final Card card = stAb.getHostCard();

View File

@@ -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<AbilityKey, Object> 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<Trigger> getActiveTrigger(final TriggerType mode, final Map<AbilityKey, Object> runParams) {
List<Trigger> trigger = Lists.newArrayList();
for (final Trigger t : activeTriggers) {