From 8739d7a101011f3fb766e806bad84fd92df790af Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Apr 2017 09:53:13 +0200 Subject: [PATCH] [AKH] Fixed Heart-Piercer Manticore. --- .../mage/cards/h/HeartPiercerManticore.java | 113 +++++++++++++++--- .../common/SendOptionUsedEventEffect.java | 68 +++++++++++ .../main/java/mage/game/events/GameEvent.java | 8 ++ 3 files changed, 175 insertions(+), 14 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/SendOptionUsedEventEffect.java diff --git a/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java b/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java index 4b36a404907..393e4d6e5aa 100644 --- a/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java +++ b/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java @@ -30,18 +30,27 @@ package mage.cards.h; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; -import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.SendOptionUsedEventEffect; import mage.abilities.keyword.EmbalmAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreatureOrPlayer; @@ -51,12 +60,6 @@ import mage.target.common.TargetCreatureOrPlayer; */ public class HeartPiercerManticore extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public HeartPiercerManticore(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); @@ -65,12 +68,12 @@ public class HeartPiercerManticore extends CardImpl { this.toughness = new MageInt(3); // When Heart-Piercer Manticore enters the battlefield, you may sacrifice another creature. + Ability firstAbility = new EntersBattlefieldTriggeredAbility(new HeartPiercerManticoreSacrificeEffect(), true); + this.addAbility(firstAbility); // When you do, Heart-Piercer Manticore deals damage equal to that creature's power to target creature or player. - Ability ability = new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(new DamageTargetEffect(new SacrificeCostCreaturesPower()), - new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))), true); - ability.addTarget(new TargetCreatureOrPlayer()); - this.addAbility(ability); - + Ability secondAbility = new HeartPiercerManticoreSacrificeTriggeredAbility(firstAbility.getOriginalId()); + secondAbility.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(secondAbility); // Embalm {5}{R} this.addAbility(new EmbalmAbility(new ManaCostsImpl("{5}{R}"), this)); @@ -85,3 +88,85 @@ public class HeartPiercerManticore extends CardImpl { return new HeartPiercerManticore(this); } } + +class HeartPiercerManticoreSacrificeEffect extends OneShotEffect { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public HeartPiercerManticoreSacrificeEffect() { + super(Outcome.Damage); + this.staticText = "you may sacrifice another creature"; + } + + public HeartPiercerManticoreSacrificeEffect(final HeartPiercerManticoreSacrificeEffect effect) { + super(effect); + } + + @Override + public HeartPiercerManticoreSacrificeEffect copy() { + return new HeartPiercerManticoreSacrificeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Target target = new TargetControlledCreaturePermanent(1, 1, filter, true); + if (controller.choose(outcome, target, source.getSourceId(), game)) { + Permanent toSacrifice = game.getPermanent(target.getFirstTarget()); + if (toSacrifice != null) { + toSacrifice.sacrifice(source.getSourceId(), game); + return new SendOptionUsedEventEffect(toSacrifice.getPower().getValue()).apply(game, source); + } + } + return true; + } + return false; + } +} + +class HeartPiercerManticoreSacrificeTriggeredAbility extends TriggeredAbilityImpl { + + private final UUID relatedTriggerdAbilityOriginalId; + + public HeartPiercerManticoreSacrificeTriggeredAbility(UUID relatedTriggerdAbilityOriginalId) { + super(Zone.BATTLEFIELD, new InfoEffect("{this} deals damage equal to that creature's power to target creature or player")); + this.relatedTriggerdAbilityOriginalId = relatedTriggerdAbilityOriginalId; + } + + public HeartPiercerManticoreSacrificeTriggeredAbility(final HeartPiercerManticoreSacrificeTriggeredAbility ability) { + super(ability); + this.relatedTriggerdAbilityOriginalId = ability.relatedTriggerdAbilityOriginalId; + } + + @Override + public HeartPiercerManticoreSacrificeTriggeredAbility copy() { + return new HeartPiercerManticoreSacrificeTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.OPTION_USED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(this.getControllerId()) + && event.getTargetId().equals(relatedTriggerdAbilityOriginalId) + && event.getSourceId().equals(getSourceId())) { + getEffects().clear(); + getEffects().add(new DamageTargetEffect(event.getAmount())); + return true; + } + return false; + } + + @Override + public String getRule() { + return "When you do, {this} deals damage equal to that creature's power to target creature or player."; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/SendOptionUsedEventEffect.java b/Mage/src/main/java/mage/abilities/effects/common/SendOptionUsedEventEffect.java new file mode 100644 index 00000000000..3f0be2eddce --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/SendOptionUsedEventEffect.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author LevelX2 + */ +public class SendOptionUsedEventEffect extends OneShotEffect { + + private final int value; + + public SendOptionUsedEventEffect() { + this(0); + } + + public SendOptionUsedEventEffect(int value) { + super(Outcome.Detriment); + this.value = value; + } + + public SendOptionUsedEventEffect(final SendOptionUsedEventEffect effect) { + super(effect); + this.value = effect.value; + } + + @Override + public SendOptionUsedEventEffect copy() { + return new SendOptionUsedEventEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.OPTION_USED, source.getOriginalId(), source.getSourceId(), source.getControllerId(), value)); + return true; + } +} diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index 21f99aece3c..e1cfe5dc0fe 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -262,6 +262,14 @@ public class GameEvent implements Serializable { PHASE_IN, PHASED_IN, TURNFACEUP, TURNEDFACEUP, TURNFACEDOWN, TURNEDFACEDOWN, + /* OPTION_USED + targetId originalId of the ability that triggered the event + sourceId sourceId of the ability that triggered the event + playerId controller of the ability + amount not used for this event + flag not used for this event + */ + OPTION_USED, DAMAGE_CREATURE, DAMAGED_CREATURE, DAMAGE_PLANESWALKER, DAMAGED_PLANESWALKER, DESTROY_PERMANENT,