[FIC] fix Squall, Gunblade Duelist (fixes #14245)

This commit is contained in:
theelk801 2026-01-19 15:15:47 -05:00
parent 3c51b01499
commit 8123987e5b
2 changed files with 41 additions and 30 deletions

View file

@ -4,20 +4,21 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.AttacksPlayerWithCreaturesTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
/**
@ -25,12 +26,6 @@ import java.util.UUID;
*/
public final class SquallGunbladeDuelist extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent();
static {
filter.add(SquallGunbladeDuelistPredicate.instance);
}
public SquallGunbladeDuelist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{W}{B}");
@ -49,9 +44,9 @@ public final class SquallGunbladeDuelist extends CardImpl {
// Whenever one or more creatures attack one of your opponents, if any of those creatures have power or toughness equal to the chosen number, Squall deals damage equal to its power to defending player.
this.addAbility(new AttacksPlayerWithCreaturesTriggeredAbility(
new SquallGunbladeDuelistDamageEffect(), 1,
filter, SetTargetPointer.PLAYER, true
).setTriggerPhrase("Whenever one or more creatures attack one of your opponents, " +
"if any of those creatures have power or toughness equal to the chosen number, "));
StaticFilters.FILTER_PERMANENT_CREATURE, SetTargetPointer.PLAYER, true
).withInterveningIf(SquallGunbladeDuelistCondition.instance)
.setTriggerPhrase("Whenever one or more creatures attack one of your opponents, "));
}
private SquallGunbladeDuelist(final SquallGunbladeDuelist card) {
@ -64,20 +59,34 @@ public final class SquallGunbladeDuelist extends CardImpl {
}
}
enum SquallGunbladeDuelistPredicate implements ObjectSourcePlayerPredicate<Permanent> {
enum SquallGunbladeDuelistCondition implements Condition {
instance;
@Override
public boolean apply(ObjectSourcePlayer<Permanent> input, Game game) {
public boolean apply(Game game, Ability source) {
Integer number = (Integer) game
.getState()
.getValue(CardUtil.getObjectZoneString(
"chosenNumber", input.getSource().getId(), game,
input.getSource().getStackMomentSourceZCC(), true
"chosenNumber", source.getSourceId(), game,
game.getState().getZoneChangeCounter(source.getSourceId()), true
));
return number != null
&& (input.getObject().getPower().getValue() == number
|| input.getObject().getToughness().getValue() == number);
return source
.getAllEffects()
.stream()
.map(effect -> (Set<Permanent>) effect.getValue("attackingCreatures"))
.filter(Objects::nonNull)
.findFirst()
.map(Collection::stream)
.filter(stream -> stream.anyMatch(
permanent -> permanent.getPower().getValue() == number
|| permanent.getToughness().getValue() == number
))
.isPresent();
}
@Override
public String toString() {
return "any of those creatures have power or toughness equal to the chosen number";
}
}
@ -105,8 +114,8 @@ class SquallGunbladeDuelistChooseEffect extends OneShotEffect {
}
int number = player.getAmount(0, Integer.MAX_VALUE, "Choose a number", source, game);
game.getState().setValue(CardUtil.getObjectZoneString(
"chosenNumber", source.getId(), game,
source.getStackMomentSourceZCC(), false
"chosenNumber", source.getSourceId(), game,
game.getState().getZoneChangeCounter(source.getSourceId()), false
), number);
Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (permanent != null) {

View file

@ -15,13 +15,13 @@ import mage.target.targetpointer.FixedTarget;
import mage.target.targetpointer.FixedTargets;
import mage.util.CardUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* based heavily on AttacksWithCreaturesTriggeredAbility
*
* @author notgreat
*/
public class AttacksPlayerWithCreaturesTriggeredAbility extends TriggeredAbilityImpl {
@ -82,26 +82,28 @@ public class AttacksPlayerWithCreaturesTriggeredAbility extends TriggeredAbility
return false;
}
DefenderAttackedEvent attackedEvent = (DefenderAttackedEvent) event;
List<Permanent> attackers = attackedEvent.getAttackers(game).stream()
Set<Permanent> attackers = attackedEvent
.getAttackers(game)
.stream()
.filter(permanent -> filter.match(permanent, controllerId, this, game))
.collect(Collectors.toList());
.collect(Collectors.toSet());
if (attackers.size() < minAttackers || (onlyOpponents && !game.isOpponent(player, attackedId))) {
return false;
}
switch (setTargetPointer){
switch (setTargetPointer) {
case NONE:
break;
case PLAYER:
getEffects().setTargetPointer(new FixedTarget(attackedId));
break;
case PERMANENT:
getEffects().setTargetPointer(new FixedTargets(new ArrayList<>(attackers), game));
getEffects().setTargetPointer(new FixedTargets(attackers, game));
break;
default:
throw new UnsupportedOperationException("Unexpected setTargetPointer in AttacksPlayerWithCreaturesTriggeredAbility: " + setTargetPointer);
}
this.getEffects().setValue("playerAttacked",attackedId);
this.getAllEffects().setValue("attackingCreatures", attackers);
this.getAllEffects().setValue("playerAttacked", attackedId);
return true;
}
}