From edf1cff8a8dbb0ff8894772400879bd965db99fd Mon Sep 17 00:00:00 2001 From: theelk801 <theelk801@gmail.com> Date: Thu, 13 Apr 2023 09:15:32 -0400 Subject: [PATCH] [MOM] Implement Rampaging Raptor --- .../src/mage/cards/r/RampagingRaptor.java | 120 ++++++++++++++++++ .../src/mage/sets/MarchOfTheMachine.java | 1 + .../permanent/ProtectorIdPredicate.java | 25 ++++ 3 files changed, 146 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RampagingRaptor.java create mode 100644 Mage/src/main/java/mage/filter/predicate/permanent/ProtectorIdPredicate.java diff --git a/Mage.Sets/src/mage/cards/r/RampagingRaptor.java b/Mage.Sets/src/mage/cards/r/RampagingRaptor.java new file mode 100644 index 0000000000..82a445a0ff --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RampagingRaptor.java @@ -0,0 +1,120 @@ +package mage.cards.r; + +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.HasteAbility; +import mage.abilities.keyword.TrampleAbility; +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.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.ProtectorIdPredicate; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RampagingRaptor extends CardImpl { + + public RampagingRaptor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + + this.subtype.add(SubType.DINOSAUR); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // {2}{R}: Rampaging Raptor gets +2/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility( + new BoostSourceEffect(2, 0, Duration.EndOfTurn), new ManaCostsImpl("{2}{R}") + )); + + // Whenever Rampaging Raptor deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls or battle that player protects. + this.addAbility(new RampagingRaptorTriggeredAbility()); + } + + private RampagingRaptor(final RampagingRaptor card) { + super(card); + } + + @Override + public RampagingRaptor copy() { + return new RampagingRaptor(this); + } +} + +class RampagingRaptorTriggeredAbility extends TriggeredAbilityImpl { + + RampagingRaptorTriggeredAbility() { + super(Zone.BATTLEFIELD, new DamageTargetEffect(SavedDamageValue.MUCH), false); + } + + private RampagingRaptorTriggeredAbility(final RampagingRaptorTriggeredAbility ability) { + super(ability); + } + + @Override + public RampagingRaptorTriggeredAbility copy() { + return new RampagingRaptorTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Player opponent = game.getPlayer(event.getPlayerId()); + if (opponent == null + || !event.getSourceId().equals(this.getSourceId()) + || !((DamagedEvent) event).isCombatDamage()) { + return false; + } + FilterPermanent filter = new FilterPermanent( + "planeswalker " + opponent.getLogName() + " controls " + + "or battle " + opponent.getLogName() + " protects" + ); + filter.add(Predicates.or( + Predicates.and( + CardType.PLANESWALKER.getPredicate(), + new ControllerIdPredicate(opponent.getId()) + ), + Predicates.and( + CardType.BATTLE.getPredicate(), + new ProtectorIdPredicate(opponent.getId()) + ) + )); + this.getEffects().setValue("damage", event.getAmount()); + this.getTargets().clear(); + this.addTarget(new TargetPermanent(filter)); + return true; + } + + @Override + public String getRule() { + return "Whenever {this} deals combat damage to an opponent, it deals that much damage " + + "to target planeswalker that player controls or battle that player protects."; + } +} diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java index 5fc82c8d3e..7913353a3d 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java @@ -190,6 +190,7 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Ral's Reinforcements", 158, Rarity.COMMON, mage.cards.r.RalsReinforcements.class)); cards.add(new SetCardInfo("Ramosian Greatsword", 159, Rarity.UNCOMMON, mage.cards.r.RamosianGreatsword.class)); cards.add(new SetCardInfo("Rampaging Geoderm", 251, Rarity.UNCOMMON, mage.cards.r.RampagingGeoderm.class)); + cards.add(new SetCardInfo("Rampaging Raptor", 160, Rarity.RARE, mage.cards.r.RampagingRaptor.class)); cards.add(new SetCardInfo("Rankle and Torbran", 252, Rarity.RARE, mage.cards.r.RankleAndTorbran.class)); cards.add(new SetCardInfo("Ravenous Sailback", 202, Rarity.UNCOMMON, mage.cards.r.RavenousSailback.class)); cards.add(new SetCardInfo("Realmbreaker's Grasp", 33, Rarity.COMMON, mage.cards.r.RealmbreakersGrasp.class)); diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/ProtectorIdPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/ProtectorIdPredicate.java new file mode 100644 index 0000000000..3a4248bc39 --- /dev/null +++ b/Mage/src/main/java/mage/filter/predicate/permanent/ProtectorIdPredicate.java @@ -0,0 +1,25 @@ +package mage.filter.predicate.permanent; + +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public class ProtectorIdPredicate implements Predicate<Permanent> { + + private final UUID protectorId; + + public ProtectorIdPredicate(UUID protectorId) { + this.protectorId = protectorId; + } + + @Override + public boolean apply(Permanent input, Game game) { + // TODO: implement this on battles branch + return false; + } +}