From c4e0d64428211b2dacbedb7fd76018a8bd37c975 Mon Sep 17 00:00:00 2001 From: Cameron Merkel <44722506+Cguy7777@users.noreply.github.com> Date: Mon, 5 Feb 2024 21:10:30 -0600 Subject: [PATCH] Rework how Training events are handled (#11748) * Replace training GameEvent with custom TriggeredAbility --- .../src/mage/cards/s/SaviorOfOllenbock.java | 21 ++++++++++- .../abilities/keyword/TrainingAbility.java | 36 ++----------------- .../main/java/mage/game/events/GameEvent.java | 1 - 3 files changed, 22 insertions(+), 36 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SaviorOfOllenbock.java b/Mage.Sets/src/mage/cards/s/SaviorOfOllenbock.java index 9f8579e89d1..8b57dfea709 100644 --- a/Mage.Sets/src/mage/cards/s/SaviorOfOllenbock.java +++ b/Mage.Sets/src/mage/cards/s/SaviorOfOllenbock.java @@ -13,12 +13,15 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; +import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.ExileZone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.stack.StackAbility; +import mage.game.stack.StackObject; import mage.players.Player; import mage.target.common.TargetCardInGraveyardBattlefieldOrStack; import mage.util.CardUtil; @@ -86,11 +89,27 @@ class SaviorOfOllenbockTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TRAINED_CREATURE; + return event.getType() == GameEvent.EventType.COUNTER_ADDED; } @Override public boolean checkTrigger(GameEvent event, Game game) { + // 20240202 - 702.149c + // Some creatures with training have abilities that trigger when they train. + // "When this creature trains" means "When a resolving training ability puts a +1/+1 counter on this creature." + if (!event.getData().equals(CounterType.P1P1.getName())) { + return false; + } + + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + if (!(stackObject instanceof StackAbility)) { + return false; + } + Ability ability = stackObject.getStackAbility(); + if (!(ability instanceof TrainingAbility)) { + return false; + } + return event.getTargetId().equals(getSourceId()); } diff --git a/Mage/src/main/java/mage/abilities/keyword/TrainingAbility.java b/Mage/src/main/java/mage/abilities/keyword/TrainingAbility.java index 0b1a9d4bed0..46e6f0fadeb 100644 --- a/Mage/src/main/java/mage/abilities/keyword/TrainingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/TrainingAbility.java @@ -2,10 +2,8 @@ package mage.abilities.keyword; import mage.MageInt; import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; -import mage.constants.Outcome; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; @@ -20,7 +18,7 @@ import java.util.Objects; public class TrainingAbility extends TriggeredAbilityImpl { public TrainingAbility() { - super(Zone.BATTLEFIELD, new TrainingAbilityEffect()); + super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance())); } private TrainingAbility(final TrainingAbility ability) { @@ -60,33 +58,3 @@ public class TrainingAbility extends TriggeredAbilityImpl { "with greater power, put a +1/+1 counter on this creature.)"; } } - -class TrainingAbilityEffect extends OneShotEffect { - - TrainingAbilityEffect() { - super(Outcome.Neutral); - } - - private TrainingAbilityEffect(final TrainingAbilityEffect effect) { - super(effect); - } - - @Override - public TrainingAbilityEffect copy() { - return new TrainingAbilityEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent == null) { - return false; - } - permanent.addCounters(CounterType.P1P1.createInstance(), source, game); - game.fireEvent(GameEvent.getEvent( - GameEvent.EventType.TRAINED_CREATURE, - source.getSourceId(), source, source.getControllerId() - )); - return true; - } -} diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index 4041044f925..48216fbb5a8 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -470,7 +470,6 @@ public class GameEvent implements Serializable { EVOLVED_CREATURE, EMBALMED_CREATURE, ETERNALIZED_CREATURE, - TRAINED_CREATURE, ATTACH, ATTACHED, UNATTACH, UNATTACHED, /* ATTACH, ATTACHED,