diff --git a/Mage.Sets/src/mage/cards/b/BodyOfKnowledge.java b/Mage.Sets/src/mage/cards/b/BodyOfKnowledge.java index 6cdacf39639..b28e836ac1d 100644 --- a/Mage.Sets/src/mage/cards/b/BodyOfKnowledge.java +++ b/Mage.Sets/src/mage/cards/b/BodyOfKnowledge.java @@ -44,7 +44,7 @@ public final class BodyOfKnowledge extends CardImpl { // Whenever Body of Knowledge is dealt damage, draw that many cards. this.addAbility(new DealtDamageToSourceTriggeredAbility( - new BodyOfKnowledgeEffect(), false, false, true + new BodyOfKnowledgeEffect(), false, false )); } diff --git a/Mage.Sets/src/mage/cards/b/BorosReckoner.java b/Mage.Sets/src/mage/cards/b/BorosReckoner.java index e6130b9c524..bc3a19a925c 100644 --- a/Mage.Sets/src/mage/cards/b/BorosReckoner.java +++ b/Mage.Sets/src/mage/cards/b/BorosReckoner.java @@ -5,15 +5,15 @@ import mage.abilities.Ability; import mage.abilities.common.DealtDamageToSourceTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.SavedDamageValue; +import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.target.common.TargetAnyTarget; import java.util.UUID; @@ -31,13 +31,15 @@ public final class BorosReckoner extends CardImpl { this.toughness = new MageInt(3); // Whenever Boros Reckoner is dealt damage, it deals that much damage to any target. - Ability ability = new DealtDamageToSourceTriggeredAbility(new BorosReckonerDealDamageEffect(), false, false, true); + Ability ability = new DealtDamageToSourceTriggeredAbility(new DamageTargetEffect(SavedDamageValue.instance) + .setText("it deals that much damage to any target"), false, false); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); // {R/W}: Boros Reckoner gains first strike until end of turn. - this.addAbility(new SimpleActivatedAbility( - Zone.BATTLEFIELD, new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{R/W}"))); + this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect( + FirstStrikeAbility.getInstance(), Duration.EndOfTurn + ), new ManaCostsImpl<>("{R/W}"))); } private BorosReckoner(final BorosReckoner card) { @@ -49,38 +51,3 @@ public final class BorosReckoner extends CardImpl { return new BorosReckoner(this); } } - -class BorosReckonerDealDamageEffect extends OneShotEffect { - - public BorosReckonerDealDamageEffect() { - super(Outcome.Damage); - this.staticText = "it deals that much damage to any target"; - } - - public BorosReckonerDealDamageEffect(final BorosReckonerDealDamageEffect effect) { - super(effect); - } - - @Override - public BorosReckonerDealDamageEffect copy() { - return new BorosReckonerDealDamageEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int amount = (Integer) getValue("damage"); - if (amount > 0) { - Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (player != null) { - player.damage(amount, source.getSourceId(), source, game); - return true; - } - Permanent creature = game.getPermanent(targetPointer.getFirst(game, source)); - if (creature != null) { - creature.damage(amount, source.getSourceId(), source, game, false, true); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/b/BrashTaunter.java b/Mage.Sets/src/mage/cards/b/BrashTaunter.java index 874130ea7a0..44bd96e3dcf 100644 --- a/Mage.Sets/src/mage/cards/b/BrashTaunter.java +++ b/Mage.Sets/src/mage/cards/b/BrashTaunter.java @@ -48,7 +48,7 @@ public final class BrashTaunter extends CardImpl { this.addAbility(IndestructibleAbility.getInstance()); // Whenever Brash Taunter is dealt damage, it deals that much damage to target opponent. - Ability ability = new DealtDamageToSourceTriggeredAbility(new BrashTaunterEffect(), false, false, true); + Ability ability = new DealtDamageToSourceTriggeredAbility(new BrashTaunterEffect(), false, false); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java b/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java index 331da929d55..81ce22ee1c6 100644 --- a/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java +++ b/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java @@ -31,7 +31,7 @@ public final class BroodhatchNantuko extends CardImpl { this.toughness = new MageInt(1); // Whenever Broodhatch Nantuko is dealt damage, you may create that many 1/1 green Insect creature tokens. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new BroodhatchNantukoDealDamageEffect(), true, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new BroodhatchNantukoDealDamageEffect(), true, false)); // Morph {2}{G} this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{G}"))); } diff --git a/Mage.Sets/src/mage/cards/c/CoalhaulerSwine.java b/Mage.Sets/src/mage/cards/c/CoalhaulerSwine.java index ec1a032b6c4..87acbeb4bf3 100644 --- a/Mage.Sets/src/mage/cards/c/CoalhaulerSwine.java +++ b/Mage.Sets/src/mage/cards/c/CoalhaulerSwine.java @@ -1,10 +1,8 @@ package mage.cards.c; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.DealtDamageToSourceTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.SavedDamageValue; import mage.abilities.effects.common.DamagePlayersEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -12,7 +10,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.TargetController; -import mage.game.Game; import java.util.UUID; @@ -31,8 +28,8 @@ public final class CoalhaulerSwine extends CardImpl { // Whenever Coalhauler Swine is dealt damage, it deals that much damage to each player. this.addAbility(new DealtDamageToSourceTriggeredAbility(new DamagePlayersEffect( - Outcome.Neutral, CoalhaulerSwineValue.instance, TargetController.ANY, "it" - ), false, false, true)); + Outcome.Neutral, SavedDamageValue.instance, TargetController.ANY, "it" + ), false, false)); } private CoalhaulerSwine(final CoalhaulerSwine card) { @@ -44,27 +41,3 @@ public final class CoalhaulerSwine extends CardImpl { return new CoalhaulerSwine(this); } } - -enum CoalhaulerSwineValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (Integer) effect.getValue("damage"); - } - - @Override - public CoalhaulerSwineValue copy() { - return this; - } - - @Override - public String getMessage() { - return ""; - } - - @Override - public String toString() { - return "that much"; - } -} diff --git a/Mage.Sets/src/mage/cards/f/FiredrinkerSatyr.java b/Mage.Sets/src/mage/cards/f/FiredrinkerSatyr.java index b687fcac995..f5877ae4dfa 100644 --- a/Mage.Sets/src/mage/cards/f/FiredrinkerSatyr.java +++ b/Mage.Sets/src/mage/cards/f/FiredrinkerSatyr.java @@ -31,7 +31,7 @@ public final class FiredrinkerSatyr extends CardImpl { this.toughness = new MageInt(1); // Whenever Firedrinker Satyr is dealt damage, it deals that much damage to you. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new FiredrinkerSatyrDealDamageEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new FiredrinkerSatyrDealDamageEffect(), false, false)); // {1}{R}: Firedrinker Satyr gets +1/+0 until end of turn and deals 1 damage to you. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}")); Effect effect = new DamageControllerEffect(1); diff --git a/Mage.Sets/src/mage/cards/g/Grollub.java b/Mage.Sets/src/mage/cards/g/Grollub.java index 38bab44caa0..5453f06f9dc 100644 --- a/Mage.Sets/src/mage/cards/g/Grollub.java +++ b/Mage.Sets/src/mage/cards/g/Grollub.java @@ -27,7 +27,7 @@ public final class Grollub extends CardImpl { // Whenever Grollub is dealt damage, each opponent gains that much life. this.addAbility(new DealtDamageToSourceTriggeredAbility( - new EachOpponentGainsLifeEffect(), false, false, true)); + new EachOpponentGainsLifeEffect(), false, false)); } diff --git a/Mage.Sets/src/mage/cards/h/HornetNest.java b/Mage.Sets/src/mage/cards/h/HornetNest.java index 58ca524bb4d..83b448036e2 100644 --- a/Mage.Sets/src/mage/cards/h/HornetNest.java +++ b/Mage.Sets/src/mage/cards/h/HornetNest.java @@ -33,7 +33,7 @@ public final class HornetNest extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever Hornet Nest is dealt damage, create that many 1/1 green Insect creature tokens with flying and deathtouch. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new HornetNestDealDamageEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new HornetNestDealDamageEffect(), false, false)); } private HornetNest(final HornetNest card) { diff --git a/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java b/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java new file mode 100644 index 00000000000..047490e4b73 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java @@ -0,0 +1,101 @@ +package mage.cards.h; + +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.SavedDamageValue; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.NightboundAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamagedPermanentBatchEvent; +import mage.game.events.GameEvent; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HowlpackAvenger extends CardImpl { + + public HowlpackAvenger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.subtype.add(SubType.WEREWOLF); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + this.color.setRed(true); + this.nightCard = true; + + // Whenever a permanent you control is dealt damage, Howlpack Avenger deals that much damage to any target. + this.addAbility(new HowlpackAvengerTriggeredAbility()); + + // {1}{R}: Howlpack Avenger gets +2/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect( + 2, 0, Duration.EndOfTurn + ), new ManaCostsImpl<>("{1}{R}"))); + + // Nightbound + this.addAbility(new NightboundAbility()); + } + + private HowlpackAvenger(final HowlpackAvenger card) { + super(card); + } + + @Override + public HowlpackAvenger copy() { + return new HowlpackAvenger(this); + } +} + +class HowlpackAvengerTriggeredAbility extends TriggeredAbilityImpl { + + HowlpackAvengerTriggeredAbility() { + super(Zone.BATTLEFIELD, new DamageTargetEffect(SavedDamageValue.instance)); + this.addTarget(new TargetAnyTarget()); + } + + private HowlpackAvengerTriggeredAbility(final HowlpackAvengerTriggeredAbility ability) { + super(ability); + } + + @Override + public HowlpackAvengerTriggeredAbility copy() { + return new HowlpackAvengerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT_BATCH; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedPermanentBatchEvent dEvent = (DamagedPermanentBatchEvent) event; + int damage = dEvent + .getEvents() + .stream() + .filter(damagedEvent -> isControlledBy(game.getControllerId(damagedEvent.getTargetId()))) + .mapToInt(GameEvent::getAmount) + .sum(); + if (damage < 1) { + return false; + } + this.getEffects().setValue("damage", damage); + return false; + } + + @Override + public String getRule() { + return "Whenever a permanent you control is dealt damage, {this} deals that much damage to any target."; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HungeringHydra.java b/Mage.Sets/src/mage/cards/h/HungeringHydra.java index 146289b1765..f4b702c6300 100644 --- a/Mage.Sets/src/mage/cards/h/HungeringHydra.java +++ b/Mage.Sets/src/mage/cards/h/HungeringHydra.java @@ -46,7 +46,7 @@ public final class HungeringHydra extends CardImpl { // Whenever damage is dealt to Hungering Hydra, put that many +1/+1 counters on it. this.addAbility(new DealtDamageToSourceTriggeredAbility( new HungeringHydraEffect(), - false, false, true + false, false )); } diff --git a/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java b/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java new file mode 100644 index 00000000000..0381d939033 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java @@ -0,0 +1,58 @@ +package mage.cards.i; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealtDamageToSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.SavedDamageValue; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.DayboundAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class IllTemperedLoner extends CardImpl { + + public IllTemperedLoner(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WEREWOLF); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + this.secondSideCardClazz = mage.cards.h.HowlpackAvenger.class; + + // Whenever Ill-Tempered Loner is dealt damage, it deals that much damage to any target. + Ability ability = new DealtDamageToSourceTriggeredAbility(new DamageTargetEffect(SavedDamageValue.instance) + .setText("it deals that much damage to any target"), false, false); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + + // {1}{R}: Ill-Tempered Loner gets +2/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect( + 2, 0, Duration.EndOfTurn + ), new ManaCostsImpl<>("{1}{R}"))); + + // Daybound + this.addAbility(new DayboundAbility()); + } + + private IllTemperedLoner(final IllTemperedLoner card) { + super(card); + } + + @Override + public IllTemperedLoner copy() { + return new IllTemperedLoner(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/IllusoryAmbusher.java b/Mage.Sets/src/mage/cards/i/IllusoryAmbusher.java index 51532e9d9b4..b6142aaab42 100644 --- a/Mage.Sets/src/mage/cards/i/IllusoryAmbusher.java +++ b/Mage.Sets/src/mage/cards/i/IllusoryAmbusher.java @@ -32,7 +32,7 @@ public final class IllusoryAmbusher extends CardImpl { this.addAbility(FlashAbility.getInstance()); // Whenever Illusory Ambusher is dealt damage, draw that many cards. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new IllusoryAmbusherDealtDamageEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new IllusoryAmbusherDealtDamageEffect(), false, false)); } private IllusoryAmbusher(final IllusoryAmbusher card) { diff --git a/Mage.Sets/src/mage/cards/j/JackalPup.java b/Mage.Sets/src/mage/cards/j/JackalPup.java index 051a3b1bdd4..24c7fa97eec 100644 --- a/Mage.Sets/src/mage/cards/j/JackalPup.java +++ b/Mage.Sets/src/mage/cards/j/JackalPup.java @@ -27,7 +27,7 @@ public final class JackalPup extends CardImpl { this.toughness = new MageInt(1); // Whenever Jackal Pup is dealt damage, it deals that much damage to you. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new JackalPupEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new JackalPupEffect(), false, false)); } diff --git a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java index 00cf3a3a594..1e98da1ec05 100644 --- a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java +++ b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java @@ -33,7 +33,7 @@ public final class JaggedPoppet extends CardImpl { this.toughness = new MageInt(4); // Whenever Jagged Poppet is dealt damage, discard that many cards. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new JaggedPoppetDealtDamageEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new JaggedPoppetDealtDamageEffect(), false, false)); // Hellbent - Whenever Jagged Poppet deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage. Ability hellbentAbility = new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/l/LathrilBladeOfTheElves.java b/Mage.Sets/src/mage/cards/l/LathrilBladeOfTheElves.java index b959655d1a8..35ac1f04793 100644 --- a/Mage.Sets/src/mage/cards/l/LathrilBladeOfTheElves.java +++ b/Mage.Sets/src/mage/cards/l/LathrilBladeOfTheElves.java @@ -6,8 +6,7 @@ import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.SavedDamageValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; @@ -19,7 +18,6 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.permanent.TappedPredicate; -import mage.game.Game; import mage.game.permanent.token.ElfWarriorToken; import mage.target.common.TargetControlledPermanent; @@ -51,7 +49,7 @@ public final class LathrilBladeOfTheElves extends CardImpl { // Whenever Lathril, Blade of the Elves deals combat damage to a player, create that many 1/1 green Elf Warrior creature tokens. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new CreateTokenEffect( - new ElfWarriorToken(), LathrilBladeOfTheElvesValue.instance + new ElfWarriorToken(), SavedDamageValue.instance ).setText("create that many 1/1 green Elf Warrior creature tokens"), false, true)); // {T}, Tap ten untapped Elves you control: Each opponent loses 10 life and you gain 10 life. @@ -70,22 +68,3 @@ public final class LathrilBladeOfTheElves extends CardImpl { return new LathrilBladeOfTheElves(this); } } - -enum LathrilBladeOfTheElvesValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (Integer) effect.getValue("damage"); - } - - @Override - public LathrilBladeOfTheElvesValue copy() { - return instance; - } - - @Override - public String getMessage() { - return ""; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/m/MoggManiac.java b/Mage.Sets/src/mage/cards/m/MoggManiac.java index 2e8bb092569..a94a09fa628 100644 --- a/Mage.Sets/src/mage/cards/m/MoggManiac.java +++ b/Mage.Sets/src/mage/cards/m/MoggManiac.java @@ -27,7 +27,7 @@ public final class MoggManiac extends CardImpl { this.toughness = new MageInt(1); // Whenever Mogg Maniac is dealt damage, it deals that much damage to target opponent. - Ability ability = new DealtDamageToSourceTriggeredAbility(new MoggManiacDealDamageEffect(), false, false, true); + Ability ability = new DealtDamageToSourceTriggeredAbility(new MoggManiacDealDamageEffect(), false, false); ability.addTarget(new TargetOpponentOrPlaneswalker()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SaberAnts.java b/Mage.Sets/src/mage/cards/s/SaberAnts.java index 091836e8ecf..aa3cfcca21c 100644 --- a/Mage.Sets/src/mage/cards/s/SaberAnts.java +++ b/Mage.Sets/src/mage/cards/s/SaberAnts.java @@ -30,7 +30,7 @@ public final class SaberAnts extends CardImpl { this.toughness = new MageInt(3); // Whenever Saber Ants is dealt damage, you may create that many 1/1 green Insect creature tokens. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new SaberAntsEffect(), true, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new SaberAntsEffect(), true, false)); } private SaberAnts(final SaberAnts card) { diff --git a/Mage.Sets/src/mage/cards/s/ShinkaGatekeeper.java b/Mage.Sets/src/mage/cards/s/ShinkaGatekeeper.java index 22775f3e7fd..20f608fa9f3 100644 --- a/Mage.Sets/src/mage/cards/s/ShinkaGatekeeper.java +++ b/Mage.Sets/src/mage/cards/s/ShinkaGatekeeper.java @@ -28,7 +28,7 @@ public final class ShinkaGatekeeper extends CardImpl { this.toughness = new MageInt(2); // Whenever Shinka Gatekeeper is dealt damage, it deals that much damage to you. - this.addAbility(new DealtDamageToSourceTriggeredAbility(new ShinkaGatekeeperDealDamageEffect(), false, false, true)); + this.addAbility(new DealtDamageToSourceTriggeredAbility(new ShinkaGatekeeperDealDamageEffect(), false, false)); } private ShinkaGatekeeper(final ShinkaGatekeeper card) { diff --git a/Mage.Sets/src/mage/cards/s/SpitefulSliver.java b/Mage.Sets/src/mage/cards/s/SpitefulSliver.java index 099381472d2..9ea011fbb4e 100644 --- a/Mage.Sets/src/mage/cards/s/SpitefulSliver.java +++ b/Mage.Sets/src/mage/cards/s/SpitefulSliver.java @@ -31,7 +31,7 @@ public final class SpitefulSliver extends CardImpl { // Sliver creatures you control have "Whenever this creature is dealt damage, it deals that much damage to target player or planeswalker." Ability ability = new DealtDamageToSourceTriggeredAbility( new SpitefulSliverEffect(), - false, false, true + false, false ); ability.addTarget(new TargetPlayer()); this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java b/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java index 7e1becc18ee..3f614b1a97e 100644 --- a/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java +++ b/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java @@ -30,7 +30,7 @@ public final class ThrashingMudspawn extends CardImpl { // Whenever Thrashing Mudspawn is dealt damage, you lose that much life. Ability ability = new DealtDamageToSourceTriggeredAbility( - new ThrashingMudspawnEffect(), false, false, true + new ThrashingMudspawnEffect(), false, false ); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TruefireCaptain.java b/Mage.Sets/src/mage/cards/t/TruefireCaptain.java index d27f1b5df26..bc426562b06 100644 --- a/Mage.Sets/src/mage/cards/t/TruefireCaptain.java +++ b/Mage.Sets/src/mage/cards/t/TruefireCaptain.java @@ -35,7 +35,7 @@ public final class TruefireCaptain extends CardImpl { // Whenever Truefire Captain is dealt damage, it deals that much damage to target player. Ability ability = new DealtDamageToSourceTriggeredAbility( new TruefireCaptainEffect(), - false, false, true + false, false ); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index 107aeca8506..17067aeb825 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -185,9 +185,11 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Hookhand Mariner", 203, Rarity.COMMON, mage.cards.h.HookhandMariner.class)); cards.add(new SetCardInfo("Hopeful Initiate", 20, Rarity.RARE, mage.cards.h.HopefulInitiate.class)); cards.add(new SetCardInfo("Howling Moon", 204, Rarity.RARE, mage.cards.h.HowlingMoon.class)); + cards.add(new SetCardInfo("Howlpack Avenger", 162, Rarity.RARE, mage.cards.h.HowlpackAvenger.class)); cards.add(new SetCardInfo("Howlpack Piper", 205, Rarity.RARE, mage.cards.h.HowlpackPiper.class)); cards.add(new SetCardInfo("Hullbreaker Horror", 63, Rarity.RARE, mage.cards.h.HullbreakerHorror.class)); cards.add(new SetCardInfo("Hungry Ridgewolf", 161, Rarity.COMMON, mage.cards.h.HungryRidgewolf.class)); + cards.add(new SetCardInfo("Ill-Tempered Loner", 162, Rarity.RARE, mage.cards.i.IllTemperedLoner.class)); cards.add(new SetCardInfo("Infestation Expert", 206, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class)); cards.add(new SetCardInfo("Infested Werewolf", 206, Rarity.UNCOMMON, mage.cards.i.InfestedWerewolf.class)); cards.add(new SetCardInfo("Innocent Traveler", 121, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class)); diff --git a/Mage/src/main/java/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java index 97fb969e584..dea7681fae7 100644 --- a/Mage/src/main/java/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java @@ -1,14 +1,10 @@ - package mage.abilities.common; -import java.util.UUID; - import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.AbilityWord; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.DamagedEvent; import mage.game.events.DamagedPermanentBatchEvent; import mage.game.events.GameEvent; @@ -17,19 +13,12 @@ import mage.game.events.GameEvent; */ public class DealtDamageToSourceTriggeredAbility extends TriggeredAbilityImpl { - private final boolean useValue; - public DealtDamageToSourceTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, false); } public DealtDamageToSourceTriggeredAbility(Effect effect, boolean optional, boolean enrage) { - this(effect, optional, enrage, false); - } - - public DealtDamageToSourceTriggeredAbility(Effect effect, boolean optional, boolean enrage, boolean useValue) { super(Zone.BATTLEFIELD, effect, optional); - this.useValue = useValue; if (enrage) { this.setAbilityWord(AbilityWord.ENRAGE); } @@ -37,7 +26,6 @@ public class DealtDamageToSourceTriggeredAbility extends TriggeredAbilityImpl { public DealtDamageToSourceTriggeredAbility(final DealtDamageToSourceTriggeredAbility ability) { super(ability); - this.useValue = ability.useValue; } @Override @@ -52,31 +40,18 @@ public class DealtDamageToSourceTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - - if (event == null || game == null || this.getSourceId() == null) { + DamagedPermanentBatchEvent dEvent = (DamagedPermanentBatchEvent) event; + int damage = dEvent + .getEvents() + .stream() + .filter(damagedEvent -> getSourceId().equals(damagedEvent.getTargetId())) + .mapToInt(GameEvent::getAmount) + .sum(); + if (damage < 1) { return false; } - - int damage = 0; - DamagedPermanentBatchEvent dEvent = (DamagedPermanentBatchEvent) event; - for (DamagedEvent damagedEvent : dEvent.getEvents()) { - UUID targetID = damagedEvent.getTargetId(); - if (targetID == null) { - continue; - } - - if (targetID == this.getSourceId()) { - damage += damagedEvent.getAmount(); - } - } - - if (damage > 0) { - if (this.useValue) { - this.getEffects().setValue("damage", damage); - } - return true; - } - return false; + this.getEffects().setValue("damage", damage); + return true; } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/SavedDamageValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SavedDamageValue.java new file mode 100644 index 00000000000..8c8428fb2ce --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SavedDamageValue.java @@ -0,0 +1,28 @@ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; + +/** + * @author TheElk801 + */ +public enum SavedDamageValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return (Integer) effect.getValue("damage"); + } + + @Override + public SavedDamageValue copy() { + return this; + } + + @Override + public String getMessage() { + return "that much"; + } +}