mirror of
https://github.com/magefree/mage.git
synced 2026-01-26 21:29:17 -08:00
[FIC] fix Squall, Gunblade Duelist (fixes #14245)
This commit is contained in:
parent
3c51b01499
commit
8123987e5b
2 changed files with 41 additions and 30 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue