diff --git a/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java b/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java new file mode 100644 index 00000000000..5d33e4e2289 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java @@ -0,0 +1,82 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.AdventureCard; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BonecrusherGiant extends AdventureCard { + + public BonecrusherGiant(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.INSTANT}, "{2}{R}", "Stomp", "{1}{R}"); + + this.subtype.add(SubType.GIANT); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Whenever Bonecrusher Giant becomes the target of a spell, Bonecrusher Giant deals 2 damage to that spell's controller. + this.addAbility(new BecomesTargetTriggeredAbility(new DamageTargetEffect( + 2, true, "that's spell's controller", "{this}" + ), StaticFilters.FILTER_SPELL_A, SetTargetPointer.PLAYER)); + + // Stomp + // Damage can’t be prevented this turn. Stomp deals 2 damage to any target. + this.getAdventureSpellAbility().addEffect(new StompEffect()); + this.getAdventureSpellAbility().addEffect(new DamageTargetEffect(2)); + this.getAdventureSpellAbility().addTarget(new TargetAnyTarget()); + } + + private BonecrusherGiant(final BonecrusherGiant card) { + super(card); + } + + @Override + public BonecrusherGiant copy() { + return new BonecrusherGiant(this); + } +} + +class StompEffect extends ReplacementEffectImpl { + + StompEffect() { + super(Duration.EndOfTurn, Outcome.Benefit); + staticText = "Damage can't be prevented this turn."; + } + + private StompEffect(final StompEffect effect) { + super(effect); + } + + @Override + public StompEffect copy() { + return new StompEffect(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.PREVENT_DAMAGE; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java index ed28ee4a11a..2053f49f9c9 100644 --- a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java +++ b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java @@ -42,6 +42,7 @@ public final class ThroneOfEldraine extends ExpansionSet { cards.add(new SetCardInfo("Beloved Princess", 7, Rarity.COMMON, mage.cards.b.BelovedPrincess.class)); cards.add(new SetCardInfo("Blow Your House Down", 114, Rarity.COMMON, mage.cards.b.BlowYourHouseDown.class)); cards.add(new SetCardInfo("Bog Naughty", 80, Rarity.UNCOMMON, mage.cards.b.BogNaughty.class)); + cards.add(new SetCardInfo("Bonecrusher Giant", 115, Rarity.RARE, mage.cards.b.BonecrusherGiant.class)); cards.add(new SetCardInfo("Bramblefort Fink", 311, Rarity.UNCOMMON, mage.cards.b.BramblefortFink.class)); cards.add(new SetCardInfo("Brimstone Trebuchet", 116, Rarity.COMMON, mage.cards.b.BrimstoneTrebuchet.class)); cards.add(new SetCardInfo("Burning-Yard Trainer", 117, Rarity.UNCOMMON, mage.cards.b.BurningYardTrainer.class)); diff --git a/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java index 54263a11bc1..1833985830d 100644 --- a/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java @@ -1,35 +1,42 @@ - package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; +import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.FilterStackObject; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.StackObject; +import mage.target.targetpointer.FixedTarget; /** - * * @author North */ public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl { private final FilterStackObject filter; + private final SetTargetPointer setTargetPointer; public BecomesTargetTriggeredAbility(Effect effect) { this(effect, StaticFilters.FILTER_SPELL_OR_ABILITY); } public BecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter) { + this(effect, filter, SetTargetPointer.NONE); + } + + public BecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter, SetTargetPointer setTargetPointer) { super(Zone.BATTLEFIELD, effect); this.filter = filter.copy(); + this.setTargetPointer = setTargetPointer; } public BecomesTargetTriggeredAbility(final BecomesTargetTriggeredAbility ability) { super(ability); this.filter = ability.filter.copy(); + this.setTargetPointer = ability.setTargetPointer; } @Override @@ -45,7 +52,25 @@ public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - return event.getTargetId().equals(getSourceId()) && filter.match(sourceObject, getSourceId(), getControllerId(), game); + if (!event.getTargetId().equals(getSourceId()) + || !filter.match(sourceObject, getSourceId(), getControllerId(), game)) { + return false; + } + switch (setTargetPointer) { + case PLAYER: + this.getEffects().stream() + .forEach(effect -> effect.setTargetPointer( + new FixedTarget(sourceObject.getControllerId(), game) + )); + break; + case SPELL: + this.getEffects().stream() + .forEach(effect -> effect.setTargetPointer( + new FixedTarget(sourceObject.getId(), game) + )); + break; + } + return true; } @Override