diff --git a/Mage.Sets/src/mage/cards/f/FranciscoFowlMarauder.java b/Mage.Sets/src/mage/cards/f/FranciscoFowlMarauder.java index bd38e165597..bbe283cceef 100644 --- a/Mage.Sets/src/mage/cards/f/FranciscoFowlMarauder.java +++ b/Mage.Sets/src/mage/cards/f/FranciscoFowlMarauder.java @@ -2,7 +2,7 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.common.CantBlockAbility; -import mage.abilities.common.DealCombatDamageControlledTriggeredAbility; +import mage.abilities.common.OneOrMoreDealDamageTriggeredAbility; import mage.abilities.effects.keyword.ExploreSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.PartnerAbility; @@ -11,7 +11,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.FilterPermanent; import java.util.UUID; @@ -20,7 +20,7 @@ import java.util.UUID; */ public final class FranciscoFowlMarauder extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.PIRATE, "Pirates"); + private static final FilterPermanent filter = new FilterPermanent(SubType.PIRATE, "Pirates"); public FranciscoFowlMarauder(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); @@ -38,8 +38,9 @@ public final class FranciscoFowlMarauder extends CardImpl { this.addAbility(new CantBlockAbility()); // Whenever one or more Pirates you control deal damage to a player, Francisco explores. - this.addAbility(new DealCombatDamageControlledTriggeredAbility( - new ExploreSourceEffect(false, "{this}"), filter + this.addAbility(new OneOrMoreDealDamageTriggeredAbility( + new ExploreSourceEffect(false, "{this}"), + filter, false, true )); // Partner diff --git a/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java index e84eec3d200..8f9dbe97797 100644 --- a/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealCombatDamageControlledTriggeredAbility.java @@ -1,27 +1,15 @@ package mage.abilities.common; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.events.DamagedBatchEvent; -import mage.game.events.DamagedEvent; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; -import java.util.List; -import java.util.stream.Collectors; /** - * @author LevelX2 + * @author Xanderhall, xenohedron */ -public class DealCombatDamageControlledTriggeredAbility extends TriggeredAbilityImpl { - - private final SetTargetPointer setTargetPointer; - private final FilterCreaturePermanent filter; +public class DealCombatDamageControlledTriggeredAbility extends OneOrMoreDealDamageTriggeredAbility { public DealCombatDamageControlledTriggeredAbility(Effect effect) { this(effect, SetTargetPointer.NONE); @@ -35,57 +23,17 @@ public class DealCombatDamageControlledTriggeredAbility extends TriggeredAbility this(Zone.BATTLEFIELD, effect, StaticFilters.FILTER_PERMANENT_CREATURES, setTargetPointer, false); } - public DealCombatDamageControlledTriggeredAbility(Zone zone, Effect effect, FilterCreaturePermanent filter, SetTargetPointer setTargetPointer, boolean optional) { - super(zone, effect, optional); - this.setTargetPointer = setTargetPointer; - this.filter = filter; - String filterMessage = (filter.getMessage().contains("you control") ? filter.getMessage() : filter.getMessage() + " you control"); - setTriggerPhrase("Whenever one or more " + filterMessage + " deal combat damage to a player, "); + public DealCombatDamageControlledTriggeredAbility(Zone zone, Effect effect, FilterCreaturePermanent filter, + SetTargetPointer setTargetPointer, boolean optional) { + super(zone, effect, filter, true, true, setTargetPointer, optional); } protected DealCombatDamageControlledTriggeredAbility(final DealCombatDamageControlledTriggeredAbility ability) { super(ability); - this.setTargetPointer = ability.setTargetPointer; - this.filter = ability.filter; } @Override public DealCombatDamageControlledTriggeredAbility copy() { return new DealCombatDamageControlledTriggeredAbility(this); } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - List events = ((DamagedBatchEvent) event).getEvents().stream() - .filter(DamagedEvent::isCombatDamage) - .filter(e -> { - Permanent permanent = game.getPermanentOrLKIBattlefield(e.getSourceId()); - return permanent != null - && permanent.isControlledBy(this.getControllerId()) - && filter.match(permanent, game); - }) - .collect(Collectors.toList()); - - if (events.isEmpty()) { - return false; - } - - this.getEffects().setValue("damage", events.stream().mapToInt(DamagedEvent::getAmount).sum()); - switch (setTargetPointer) { - case PLAYER: - this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); - break; - case NONE: - break; - default: - throw new IllegalArgumentException("Invalid SetTargetPointer option"); - } - - return true; - } } diff --git a/Mage/src/main/java/mage/abilities/common/OneOrMoreDealDamageTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/OneOrMoreDealDamageTriggeredAbility.java new file mode 100644 index 00000000000..ecfb902c84f --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/OneOrMoreDealDamageTriggeredAbility.java @@ -0,0 +1,108 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.events.DamagedBatchEvent; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Xanderhall, xenohedron + */ +public class OneOrMoreDealDamageTriggeredAbility extends TriggeredAbilityImpl { + + private final SetTargetPointer setTargetPointer; + private final FilterPermanent filter; + private final boolean onlyCombat; + private final boolean onlyControlled; + + public OneOrMoreDealDamageTriggeredAbility(Effect effect, FilterPermanent filter, boolean onlyCombat, boolean onlyControlled) { + this(Zone.BATTLEFIELD, effect, filter, onlyCombat, onlyControlled, SetTargetPointer.NONE, false); + } + + public OneOrMoreDealDamageTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, + boolean onlyCombat, boolean onlyControlled, + SetTargetPointer setTargetPointer, boolean optional) { + super(zone, effect, optional); + this.setTargetPointer = setTargetPointer; + this.filter = filter; + this.onlyCombat = onlyCombat; + this.onlyControlled = onlyControlled; + makeTriggerPhrase(); + } + + protected OneOrMoreDealDamageTriggeredAbility(final OneOrMoreDealDamageTriggeredAbility ability) { + super(ability); + this.setTargetPointer = ability.setTargetPointer; + this.filter = ability.filter; + this.onlyCombat = ability.onlyCombat; + this.onlyControlled = ability.onlyControlled; + } + + @Override + public OneOrMoreDealDamageTriggeredAbility copy() { + return new OneOrMoreDealDamageTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedBatchEvent dEvent = (DamagedBatchEvent) event; + if (onlyCombat && !dEvent.isCombatDamage()) { + return false; + } + List events = dEvent + .getEvents() + .stream() + .filter(e -> { + Permanent permanent = game.getPermanentOrLKIBattlefield(e.getSourceId()); + if (permanent == null) { + return false; + } + if (onlyControlled && !permanent.isControlledBy(this.getControllerId())) { + return false; + } + return filter.match(permanent, this.getControllerId(), this, game); + }) + .collect(Collectors.toList()); + + if (events.isEmpty()) { + return false; + } + + this.getAllEffects().setValue("damage", events.stream().mapToInt(DamagedEvent::getAmount).sum()); + switch (setTargetPointer) { + case PLAYER: + this.getAllEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); + break; + case NONE: + break; + default: + throw new IllegalArgumentException("Invalid SetTargetPointer option"); + } + + return true; + } + + private void makeTriggerPhrase() { + String filterMessage = filter.getMessage(); + if (onlyControlled && !filterMessage.contains("you control")) { + filterMessage += " you control"; + } + setTriggerPhrase("Whenever one or more " + filterMessage + " deal " + (onlyCombat ? "combat " : "") + "damage to a player, "); + } + +}