From 45a790790e11058d0aa93085975e40d8f370a683 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 6 Jun 2022 08:56:21 -0400 Subject: [PATCH] [CLB] Implemented Mighty Servant of Leuk-O --- .../mage/cards/m/MightyServantOfLeukO.java | 152 ++++++++++++++++++ .../CommanderLegendsBattleForBaldursGate.java | 1 + 2 files changed, 153 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MightyServantOfLeukO.java diff --git a/Mage.Sets/src/mage/cards/m/MightyServantOfLeukO.java b/Mage.Sets/src/mage/cards/m/MightyServantOfLeukO.java new file mode 100644 index 00000000000..c94e0723a97 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MightyServantOfLeukO.java @@ -0,0 +1,152 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; +import mage.watchers.Watcher; + +import java.util.*; + +/** + * @author TheElk801 + */ +public final class MightyServantOfLeukO extends CardImpl { + + public MightyServantOfLeukO(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + this.subtype.add(SubType.VEHICLE); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Ward—Discard a card. + this.addAbility(new WardAbility(new DiscardCardCost(), false)); + + // Whenever Mighty Servant of Leuk-o becomes crewed for the first time each turn, if it was crewed by exactly two creatures, it gains "Whenever this creature deals combat damage to a player, draw two cards" until end of turn. + this.addAbility(new MightyServantOfLeukOTriggeredAbility()); + + // Crew 4 + this.addAbility(new CrewAbility(4)); + } + + private MightyServantOfLeukO(final MightyServantOfLeukO card) { + super(card); + } + + @Override + public MightyServantOfLeukO copy() { + return new MightyServantOfLeukO(this); + } +} + +class MightyServantOfLeukOTriggeredAbility extends TriggeredAbilityImpl { + + MightyServantOfLeukOTriggeredAbility() { + super(Zone.BATTLEFIELD, new GainAbilitySourceEffect(new DealsCombatDamageToAPlayerTriggeredAbility( + new DrawCardSourceControllerEffect(2), false + ).setTriggerPhrase("Whenever this creature deals combat damage to a player, "), Duration.EndOfTurn)); + this.addWatcher(new MightyServantOfLeukOWatcher()); + } + + private MightyServantOfLeukOTriggeredAbility(final MightyServantOfLeukOTriggeredAbility ability) { + super(ability); + } + + @Override + public MightyServantOfLeukOTriggeredAbility copy() { + return new MightyServantOfLeukOTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.VEHICLE_CREWED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getSourceId().equals(getSourceId()) + && MightyServantOfLeukOWatcher.checkVehicle(this, game); + } + + @Override + public String getRule() { + return "Whenever {this} becomes crewed for the first time each turn, if it was crewed by exactly two creatures, it gains \"Whenever this creature deals combat damage to a player, draw two cards\" until end of turn."; + } +} + +class MightyServantOfLeukOWatcher extends Watcher { + + private final Map crewCount = new HashMap<>(); + private final Map> crewMap = new HashMap<>(); + + MightyServantOfLeukOWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + Permanent vehicle; + Permanent crewer; + switch (event.getType()) { + case VEHICLE_CREWED: + vehicle = game.getPermanent(event.getTargetId()); + crewer = null; + break; + case CREWED_VEHICLE: + vehicle = game.getPermanent(event.getSourceId()); + crewer = game.getPermanent(event.getTargetId()); + break; + default: + return; + } + if (vehicle == null) { + return; + } + if (crewer == null) { + crewCount.compute(new MageObjectReference(vehicle, game), CardUtil::setOrIncrementValue); + return; + } + crewMap.computeIfAbsent( + new MageObjectReference(vehicle, game), x -> new HashSet<>() + ).add(new MageObjectReference(crewer, game)); + } + + @Override + public void reset() { + super.reset(); + crewCount.clear(); + crewMap.clear(); + } + + public static boolean checkVehicle(Ability source, Game game) { + MightyServantOfLeukOWatcher watcher = game + .getState() + .getWatcher(MightyServantOfLeukOWatcher.class); + MageObjectReference mor = new MageObjectReference(source); + return watcher + .crewCount + .getOrDefault(mor, 0) < 2 + && watcher + .crewMap + .getOrDefault(mor, Collections.emptySet()) + .size() == 2; + } +} diff --git a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java index 329961bc8ec..92644a4148d 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java +++ b/Mage.Sets/src/mage/sets/CommanderLegendsBattleForBaldursGate.java @@ -363,6 +363,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet { cards.add(new SetCardInfo("Memory Plunder", 849, Rarity.RARE, mage.cards.m.MemoryPlunder.class)); cards.add(new SetCardInfo("Meteor Golem", 323, Rarity.UNCOMMON, mage.cards.m.MeteorGolem.class)); cards.add(new SetCardInfo("Midnight Clock", 727, Rarity.RARE, mage.cards.m.MidnightClock.class)); + cards.add(new SetCardInfo("Mighty Servant of Leuk-o", 324, Rarity.RARE, mage.cards.m.MightyServantOfLeukO.class)); cards.add(new SetCardInfo("Miirym, Sentinel Wyrm", 284, Rarity.RARE, mage.cards.m.MiirymSentinelWyrm.class)); cards.add(new SetCardInfo("Mikaeus, the Lunarch", 700, Rarity.MYTHIC, mage.cards.m.MikaeusTheLunarch.class)); cards.add(new SetCardInfo("Mind Flayer", 728, Rarity.RARE, mage.cards.m.MindFlayer.class));