From d8ec8cdb2be9c0fd32fc58dfd5819f15eb165510 Mon Sep 17 00:00:00 2001 From: xenohedron <12538125+xenohedron@users.noreply.github.com> Date: Thu, 29 May 2025 00:40:08 -0400 Subject: [PATCH] fix some more cards --- Mage.Sets/src/mage/cards/b/BondOfRevival.java | 13 ++++--- .../src/mage/cards/b/BreakingEntering.java | 30 +++++++------- Mage.Sets/src/mage/cards/d/DreadSlaver.java | 15 ++++--- .../src/mage/cards/g/GrimoireOfTheDead.java | 14 ++++--- .../mage/cards/n/NecromanticSelection.java | 12 ++++-- Mage.Sets/src/mage/cards/n/NextOfKin.java | 10 +++-- .../src/mage/cards/s/ScytheOfTheWretched.java | 19 +++++---- Mage.Sets/src/mage/cards/s/Seraph.java | 39 +++++++------------ Mage.Sets/src/mage/cards/s/SwiftWarkite.java | 15 ++++--- 9 files changed, 94 insertions(+), 73 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BondOfRevival.java b/Mage.Sets/src/mage/cards/b/BondOfRevival.java index e10a10f214c..03e73b20864 100644 --- a/Mage.Sets/src/mage/cards/b/BondOfRevival.java +++ b/Mage.Sets/src/mage/cards/b/BondOfRevival.java @@ -14,9 +14,11 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -69,13 +71,14 @@ class BondOfRevivalEffect extends OneShotEffect { if (player == null || card == null) { return false; } - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.UntilYourNextTurn); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1)); if (player.moveCards(card, Zone.BATTLEFIELD, source, game)) { - game.addEffect(effect, source); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.UntilYourNextTurn); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); + game.addEffect(effect, source); + } } return true; } } - - diff --git a/Mage.Sets/src/mage/cards/b/BreakingEntering.java b/Mage.Sets/src/mage/cards/b/BreakingEntering.java index b3ff9d74011..cb6f44a56db 100644 --- a/Mage.Sets/src/mage/cards/b/BreakingEntering.java +++ b/Mage.Sets/src/mage/cards/b/BreakingEntering.java @@ -17,11 +17,13 @@ import mage.constants.SpellAbilityType; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.TargetPlayer; import mage.target.common.TargetCardInGraveyard; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; public final class BreakingEntering extends SplitCard { @@ -68,22 +70,22 @@ class EnteringReturnFromGraveyardToBattlefieldEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE); - target.withNotTarget(true); - if (target.canChoose(source.getControllerId(), source, game) - && controller.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(card.getId(), game)); - game.addEffect(effect, source); - } + if (controller == null) { + return false; + } + Target target = new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE).withNotTarget(true); + if (target.canChoose(source.getControllerId(), source, game) + && controller.chooseTarget(outcome, target, source, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null && controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); + game.addEffect(effect, source); } } - return true; } - return false; + return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DreadSlaver.java b/Mage.Sets/src/mage/cards/d/DreadSlaver.java index 8b3cf98e16e..6de44d51cba 100644 --- a/Mage.Sets/src/mage/cards/d/DreadSlaver.java +++ b/Mage.Sets/src/mage/cards/d/DreadSlaver.java @@ -12,8 +12,10 @@ 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.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @author noxx @@ -61,17 +63,18 @@ class DreadSlaverEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (controller == null || card == null) { return false; } - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { - if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { ContinuousEffect effect = new AddCreatureTypeAdditionEffect(SubType.ZOMBIE, true); - effect.setTargetPointer(new FixedTarget(card.getId(), game)); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); game.addEffect(effect, source); - return true; } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/g/GrimoireOfTheDead.java b/Mage.Sets/src/mage/cards/g/GrimoireOfTheDead.java index 8749db312cf..8e2a7644924 100644 --- a/Mage.Sets/src/mage/cards/g/GrimoireOfTheDead.java +++ b/Mage.Sets/src/mage/cards/g/GrimoireOfTheDead.java @@ -22,10 +22,10 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; /** * @author BetaSteward @@ -90,7 +90,11 @@ class GrimoireOfTheDeadEffect extends OneShotEffect { creatureCards.addAll(player.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game)); } controller.moveCards(creatureCards, Zone.BATTLEFIELD, source, game); - game.addEffect(new GrimoireOfTheDeadEffect2().setTargetPointer(new FixedTargets(creatureCards, game)), source); + List permanents = creatureCards.stream() + .map(c -> CardUtil.getPermanentFromCardPutToBattlefield(c, game)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + game.addEffect(new GrimoireOfTheDeadEffect2().setTargetPointer(new FixedTargets(permanents, game)), source); return true; } @@ -103,7 +107,7 @@ class GrimoireOfTheDeadEffect extends OneShotEffect { class GrimoireOfTheDeadEffect2 extends ContinuousEffectImpl { - public GrimoireOfTheDeadEffect2() { + GrimoireOfTheDeadEffect2() { super(Duration.Custom, Outcome.Neutral); } diff --git a/Mage.Sets/src/mage/cards/n/NecromanticSelection.java b/Mage.Sets/src/mage/cards/n/NecromanticSelection.java index bcbe5455933..5ae14f15495 100644 --- a/Mage.Sets/src/mage/cards/n/NecromanticSelection.java +++ b/Mage.Sets/src/mage/cards/n/NecromanticSelection.java @@ -23,6 +23,7 @@ import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInGraveyard; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; @@ -95,10 +96,13 @@ class NecromanticSelectionEffect extends OneShotEffect { Card card = game.getCard(target.getFirstTarget()); if (card != null) { controller.moveCards(card, Zone.BATTLEFIELD, source, game); - ContinuousEffect effect = new AddCreatureTypeAdditionEffect(SubType.ZOMBIE, true); - effect.setText("It's a black Zombie in addition to its other colors and types"); - effect.setTargetPointer(new FixedTarget(card.getId(), game)); - game.addEffect(effect, source); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { + ContinuousEffect effect = new AddCreatureTypeAdditionEffect(SubType.ZOMBIE, true); + effect.setText("It's a black Zombie in addition to its other colors and types"); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); + game.addEffect(effect, source); + } } } return true; diff --git a/Mage.Sets/src/mage/cards/n/NextOfKin.java b/Mage.Sets/src/mage/cards/n/NextOfKin.java index 3e2fce5d95a..a8847d11381 100644 --- a/Mage.Sets/src/mage/cards/n/NextOfKin.java +++ b/Mage.Sets/src/mage/cards/n/NextOfKin.java @@ -19,6 +19,7 @@ import mage.target.TargetCard; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -92,9 +93,12 @@ class NextOfKinDiesEffect extends OneShotEffect { Card card = game.getCard(target.getFirstTarget()); if (card != null) { controller.moveCards(card, Zone.BATTLEFIELD, source, game); - Effect returnToBattlefieldAttachedEffect = new ReturnToBattlefieldAttachedEffect(); - returnToBattlefieldAttachedEffect.setTargetPointer(new FixedTarget(card, game)); - game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToBattlefieldAttachedEffect), source); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { + Effect returnToBattlefieldAttachedEffect = new ReturnToBattlefieldAttachedEffect(); + returnToBattlefieldAttachedEffect.setTargetPointer(new FixedTarget(permanent, game)); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToBattlefieldAttachedEffect), source); + } } return true; } diff --git a/Mage.Sets/src/mage/cards/s/ScytheOfTheWretched.java b/Mage.Sets/src/mage/cards/s/ScytheOfTheWretched.java index 8292093b41f..0eb34facb97 100644 --- a/Mage.Sets/src/mage/cards/s/ScytheOfTheWretched.java +++ b/Mage.Sets/src/mage/cards/s/ScytheOfTheWretched.java @@ -15,8 +15,10 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -67,14 +69,17 @@ class ScytheOfTheWretchedReanimateEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Card card = game.getCard(getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); - if (card != null && controller != null) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - Effect effect = new AttachEffect(Outcome.AddAbility); - effect.setTargetPointer(new FixedTarget(card.getId())); - effect.apply(game, source); - return true; + if (card == null || controller == null) { + return false; } - return false; + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { + Effect effect = new AttachEffect(Outcome.AddAbility); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); + effect.apply(game, source); + } + return true; } @Override diff --git a/Mage.Sets/src/mage/cards/s/Seraph.java b/Mage.Sets/src/mage/cards/s/Seraph.java index 8b552d90b92..4b7483063f2 100644 --- a/Mage.Sets/src/mage/cards/s/Seraph.java +++ b/Mage.Sets/src/mage/cards/s/Seraph.java @@ -1,6 +1,5 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; @@ -10,20 +9,19 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.SacrificeTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -75,18 +73,19 @@ class SeraphEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Card creatureCard = game.getCard(getTargetPointer().getFirst(game, source)); - if (controller != null - && creatureCard != null - && game.getState().getZone(creatureCard.getId()) == Zone.GRAVEYARD) { // must be still in the graveyard - controller.moveCards(creatureCard, Zone.BATTLEFIELD, source, game, false, false, false, null); - OneShotEffect effect = new SacrificeTargetEffect(); + if (controller == null || creatureCard == null) { + return false; + } + controller.moveCards(creatureCard, Zone.BATTLEFIELD, source, game, false, false, false, null); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(creatureCard, game); + if (permanent != null) { + SacrificeTargetEffect effect = new SacrificeTargetEffect(); effect.setText("Sacrifice this if Seraph leaves the battlefield or its current controller loses control of it."); - effect.setTargetPointer(new FixedTarget(creatureCard.getId())); + effect.setTargetPointer(new FixedTarget(permanent, game)); SeraphDelayedTriggeredAbility dTA = new SeraphDelayedTriggeredAbility(effect, source.getSourceId()); game.addDelayedTriggeredAbility(dTA, source); - return true; } - return false; + return true; } @Override @@ -117,15 +116,7 @@ class SeraphDelayedTriggeredAbility extends DelayedTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.LOST_CONTROL - && event.getTargetId().equals(seraph)) { - return true; - } - if (event.getType() == GameEvent.EventType.ZONE_CHANGE - && event.getTargetId().equals(seraph)) { - return true; - } - return false; + return event.getTargetId().equals(seraph); } @Override diff --git a/Mage.Sets/src/mage/cards/s/SwiftWarkite.java b/Mage.Sets/src/mage/cards/s/SwiftWarkite.java index 0f7192f7cb3..84aace1205c 100644 --- a/Mage.Sets/src/mage/cards/s/SwiftWarkite.java +++ b/Mage.Sets/src/mage/cards/s/SwiftWarkite.java @@ -17,9 +17,11 @@ import mage.constants.*; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -99,15 +101,18 @@ class SwiftWarkiteEffect extends OneShotEffect { target.withNotTarget(true); controller.choose(outcome, cards, target, source, game); Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - + if (card == null) { + return true; + } + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); + if (permanent != null) { ContinuousEffect gainHasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - gainHasteEffect.setTargetPointer(new FixedTarget(card, game)); + gainHasteEffect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(gainHasteEffect, source); Effect returnToHandEffect = new ReturnToHandTargetEffect(); - returnToHandEffect.setTargetPointer(new FixedTarget(card, game)); + returnToHandEffect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandEffect); game.addDelayedTriggeredAbility(delayedAbility, source); }