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;
+    }
+}