From 9acff5aa9cfad37110a3405f98b895b5eec06a70 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 21 Jul 2015 21:51:27 +0300 Subject: [PATCH] Add DamageDealtToAttachedTriggeredAbility an use it for existing cards. Implement cards: Binding Agony and Soul Link --- .../src/mage/sets/apocalypse/SoulLink.java | 78 +++++++++++++++ .../sets/championsofkamigawa/RaggedVeins.java | 94 ++---------------- .../sets/darkascension/SpitefulShadows.java | 48 +-------- .../src/mage/sets/mirage/BindingAgony.java | 78 +++++++++++++++ .../src/mage/sets/odyssey/DruidsCall.java | 93 ++---------------- ...DamageDealtToAttachedTriggeredAbility.java | 98 +++++++++++++++++++ 6 files changed, 276 insertions(+), 213 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/SoulLink.java create mode 100644 Mage.Sets/src/mage/sets/mirage/BindingAgony.java create mode 100644 Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/SoulLink.java b/Mage.Sets/src/mage/sets/apocalypse/SoulLink.java new file mode 100644 index 0000000000..dbfb8ef751 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/SoulLink.java @@ -0,0 +1,78 @@ +/* + * 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.sets.apocalypse; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageAttachedTriggeredAbility; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class SoulLink extends CardImpl { + + public SoulLink(UUID ownerId) { + super(ownerId, 120, "Soul Link", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature deals damage, you gain that much life. + this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, + new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); + // Whenever enchanted creature is dealt damage, you gain that much life. + this.addAbility(new DamageDealtToAttachedTriggeredAbility(new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); + } + + public SoulLink(final SoulLink card) { + super(card); + } + + @Override + public SoulLink copy() { + return new SoulLink(this); + } +} diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java b/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java index 551f3c750d..2f75078d46 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java @@ -30,24 +30,21 @@ package mage.sets.championsofkamigawa; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; -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.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -67,11 +64,13 @@ public class RaggedVeins extends CardImpl { // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); // Whenever enchanted creature is dealt damage, its controller loses that much life. - this.addAbility(new RaggedVeinsTriggeredAbility()); + Effect effect = new LoseLifeTargetEffect(new NumericSetToEffectValues("that much", "damage")); + effect.setText("its controller loses that much life"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); } public RaggedVeins(final RaggedVeins card) { @@ -83,78 +82,3 @@ public class RaggedVeins extends CardImpl { return new RaggedVeins(this); } } - -class RaggedVeinsTriggeredAbility extends TriggeredAbilityImpl { - - public RaggedVeinsTriggeredAbility() { - super(Zone.BATTLEFIELD, new RaggedVeinsEffect()); - } - - public RaggedVeinsTriggeredAbility(final RaggedVeinsTriggeredAbility ability) { - super(ability); - } - - @Override - public RaggedVeinsTriggeredAbility copy() { - return new RaggedVeinsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, its controller loses that much life."; - } -} - -class RaggedVeinsEffect extends OneShotEffect { - - public RaggedVeinsEffect() { - super(Outcome.Damage); - this.staticText = "its controller loses that much life"; - } - - public RaggedVeinsEffect(final RaggedVeinsEffect effect) { - super(effect); - } - - @Override - public RaggedVeinsEffect copy() { - return new RaggedVeinsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); - UUID targetId = this.targetPointer.getFirst(game, source); - if (damageAmount != null && targetId != null) { - Permanent permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - player.loseLife(damageAmount, game); - return true; - } - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java b/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java index a874f84736..942dc372f5 100644 --- a/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java +++ b/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java @@ -29,7 +29,7 @@ package mage.sets.darkascension; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; @@ -37,10 +37,9 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; 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.TargetPermanent; @@ -65,7 +64,8 @@ public class SpitefulShadows extends CardImpl { this.addAbility(new EnchantAbility(auraTarget.getTargetName())); // Whenever enchanted creature is dealt damage, it deals that much damage to its controller. - this.addAbility(new SpitefulShadowsTriggeredAbility()); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, new SpitefulShadowsEffect(), + false, SetTargetPointer.PERMANENT)); } public SpitefulShadows(final SpitefulShadows card) { @@ -78,44 +78,6 @@ public class SpitefulShadows extends CardImpl { } } -class SpitefulShadowsTriggeredAbility extends TriggeredAbilityImpl { - - public SpitefulShadowsTriggeredAbility() { - super(Zone.BATTLEFIELD, new SpitefulShadowsEffect()); - } - - public SpitefulShadowsTriggeredAbility(final SpitefulShadowsTriggeredAbility ability) { - super(ability); - } - - @Override - public SpitefulShadowsTriggeredAbility copy() { - return new SpitefulShadowsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, it deals that much damage to its controller."; - } -} - class SpitefulShadowsEffect extends OneShotEffect { public SpitefulShadowsEffect() { @@ -134,7 +96,7 @@ class SpitefulShadowsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); + Integer damageAmount = (Integer) this.getValue("damage"); if (damageAmount != null) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent == null) { diff --git a/Mage.Sets/src/mage/sets/mirage/BindingAgony.java b/Mage.Sets/src/mage/sets/mirage/BindingAgony.java new file mode 100644 index 0000000000..5be6d6400a --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/BindingAgony.java @@ -0,0 +1,78 @@ +/* + * 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.sets.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class BindingAgony extends CardImpl { + + public BindingAgony(UUID ownerId) { + super(ownerId, 4, "Binding Agony", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature is dealt damage, Binding Agony deals that much damage to that creature's controller. + Effect effect = new DamageTargetEffect(new NumericSetToEffectValues("that much", "damage")); + effect.setText("{this} deals that much damage to that creature's controller"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); + } + + public BindingAgony(final BindingAgony card) { + super(card); + } + + @Override + public BindingAgony copy() { + return new BindingAgony(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java b/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java index 7746b54f02..3f7f6c922d 100644 --- a/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java +++ b/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java @@ -29,25 +29,22 @@ package mage.sets.odyssey; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.game.permanent.token.SquirrelToken; -import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -69,7 +66,9 @@ public class DruidsCall extends CardImpl { this.addAbility(ability); // Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield. - this.addAbility(new DruidsCallTriggeredAbility()); + Effect effect = new CreateTokenTargetEffect(new SquirrelToken(), new NumericSetToEffectValues("that much", "damage")); + effect.setText("its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); } public DruidsCall(final DruidsCall card) { @@ -81,79 +80,3 @@ public class DruidsCall extends CardImpl { return new DruidsCall(this); } } - -class DruidsCallTriggeredAbility extends TriggeredAbilityImpl { - - public DruidsCallTriggeredAbility() { - super(Zone.BATTLEFIELD, new DruidsCallEffect()); - } - - public DruidsCallTriggeredAbility(final DruidsCallTriggeredAbility ability) { - super(ability); - } - - @Override - public DruidsCallTriggeredAbility copy() { - return new DruidsCallTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield."; - } -} - -class DruidsCallEffect extends OneShotEffect { - - public DruidsCallEffect() { - super(Outcome.Damage); - this.staticText = "its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield"; - } - - public DruidsCallEffect(final DruidsCallEffect effect) { - super(effect); - } - - @Override - public DruidsCallEffect copy() { - return new DruidsCallEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); - UUID targetId = this.targetPointer.getFirst(game, source); - if (damageAmount != null && targetId != null) { - Permanent permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - Token token = new SquirrelToken(); - token.putOntoBattlefield(damageAmount, game, source.getSourceId(), player.getId()); - return true; - } - } - } - return false; - } -} diff --git a/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java new file mode 100644 index 0000000000..90e4b5fb26 --- /dev/null +++ b/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java @@ -0,0 +1,98 @@ +/* + * 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.common; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + */ +public class DamageDealtToAttachedTriggeredAbility extends TriggeredAbilityImpl { + + protected SetTargetPointer setTargetPointer; + + public DamageDealtToAttachedTriggeredAbility(Effect effect, boolean optional) { + this(Zone.BATTLEFIELD, effect, optional, SetTargetPointer.NONE); + } + + public DamageDealtToAttachedTriggeredAbility(Zone zone, Effect effect, boolean optional, SetTargetPointer setTargetPointer) { + super(zone, effect, optional); + this.setTargetPointer = setTargetPointer; + } + + public DamageDealtToAttachedTriggeredAbility(final DamageDealtToAttachedTriggeredAbility ability) { + super(ability); + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public DamageDealtToAttachedTriggeredAbility copy() { + return new DamageDealtToAttachedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_CREATURE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(sourceId); + UUID targetId = event.getTargetId(); + if(enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { + for(Effect effect : this.getEffects()) { + effect.setValue("damage", event.getAmount()); + switch(setTargetPointer) { + case PERMANENT: + effect.setTargetPointer(new FixedTarget(targetId)); + break; + case PLAYER: + effect.setTargetPointer(new FixedTarget(game.getPermanentOrLKIBattlefield(targetId).getControllerId())); + break; + } + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever enchanted creature is dealt damage, " + super.getRule(); + } +}