From bf699b5559f7367a21e914c9cc718231f17dfe11 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 24 Feb 2022 21:12:33 -0500 Subject: [PATCH] fixed test failures --- .../src/mage/cards/s/ShiftingShadow.java | 9 ++++--- .../mage/abilities/keyword/DashAbility.java | 26 +++++++++---------- Mage/src/main/java/mage/game/GameImpl.java | 9 +++++-- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/ShiftingShadow.java b/Mage.Sets/src/mage/cards/s/ShiftingShadow.java index 6f19ba9a2da..348066d4230 100644 --- a/Mage.Sets/src/mage/cards/s/ShiftingShadow.java +++ b/Mage.Sets/src/mage/cards/s/ShiftingShadow.java @@ -81,8 +81,8 @@ class ShiftingShadowGainEffect extends ContinuousEffectImpl { } permanent.addAbility(HasteAbility.getInstance(), source.getSourceId(), game); permanent.addAbility(new BeginningOfUpkeepTriggeredAbility( - new ShiftingShadowEffect(permanent, game), TargetController.YOU, false - )); + new ShiftingShadowEffect(aura, game), TargetController.YOU, false + ), source.getSourceId(), game); return true; } } @@ -100,7 +100,7 @@ class ShiftingShadowEffect extends OneShotEffect { private ShiftingShadowEffect(final ShiftingShadowEffect effect) { super(effect); - mor = effect.mor; + this.mor = effect.mor; this.name = effect.name; } @@ -124,6 +124,7 @@ class ShiftingShadowEffect extends OneShotEffect { Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { permanent.destroy(source, game); + game.getState().processAction(game); } Player player = game.getPlayer(source.getControllerId()); if (player == null) { @@ -143,7 +144,7 @@ class ShiftingShadowEffect extends OneShotEffect { creature.addAttachment(mor.getSourceId(), source, game); } cards.retainZone(Zone.LIBRARY, game); - player.putCardsOnBottomOfLibrary(card, game, source, false); + player.putCardsOnBottomOfLibrary(cards, game, source, false); return true; } diff --git a/Mage/src/main/java/mage/abilities/keyword/DashAbility.java b/Mage/src/main/java/mage/abilities/keyword/DashAbility.java index 9e89a3c160b..67bd739b0a5 100644 --- a/Mage/src/main/java/mage/abilities/keyword/DashAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/DashAbility.java @@ -1,8 +1,5 @@ package mage.abilities.keyword; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.SpellAbility; @@ -10,13 +7,7 @@ import mage.abilities.StaticAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.condition.common.DashedCondition; -import mage.abilities.condition.common.SourceOnBattlefieldCondition; -import mage.abilities.costs.AlternativeCost2; -import mage.abilities.costs.AlternativeCost2Impl; -import mage.abilities.costs.AlternativeSourceCosts; -import mage.abilities.costs.Cost; -import mage.abilities.costs.Costs; -import mage.abilities.costs.CostsImpl; +import mage.abilities.costs.*; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.OneShotEffect; @@ -30,8 +21,11 @@ import mage.game.Game; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + /** - * * @author LevelX2 */ public class DashAbility extends StaticAbility implements AlternativeSourceCosts { @@ -112,11 +106,11 @@ public class DashAbility extends StaticAbility implements AlternativeSourceCosts for (AlternativeCost2 dashCost : alternativeSourceCosts) { if (dashCost.canPay(ability, this, player.getId(), game) && player.chooseUse(Outcome.Benefit, KEYWORD - + " the creature for " + dashCost.getText(true) + " ?", ability, game)) { + + " the creature for " + dashCost.getText(true) + " ?", ability, game)) { activateDash(dashCost, game); ability.getManaCostsToPay().clear(); ability.getCosts().clear(); - for (Iterator it = ((Costs) dashCost).iterator(); it.hasNext();) { + for (Iterator it = ((Costs) dashCost).iterator(); it.hasNext(); ) { Cost cost = (Cost) it.next(); if (cost instanceof ManaCostsImpl) { ability.getManaCostsToPay().add((ManaCostsImpl) cost.copy()); @@ -208,7 +202,7 @@ class DashAddDelayedTriggeredAbilityEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { if (game.getPermanentEntering(source.getSourceId()) != null) { OneShotEffect returnToHandEffect = new ReturnToHandTargetEffect(); - ConditionalOneShotEffect mustBeOnBattlefieldToReturn = new ConditionalOneShotEffect(returnToHandEffect, SourceOnBattlefieldCondition.instance); + ConditionalOneShotEffect mustBeOnBattlefieldToReturn = new ConditionalOneShotEffect(returnToHandEffect, DashAddDelayedTriggeredAbilityEffect::check); mustBeOnBattlefieldToReturn.setText("return the dashed creature from the battlefield to its owner's hand"); // init target pointer now because the dashed creature will only be returned from battlefield zone (now in entering state so zone change counter is not raised yet) mustBeOnBattlefieldToReturn.setTargetPointer(new FixedTarget(source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId()) + 1)); @@ -218,4 +212,8 @@ class DashAddDelayedTriggeredAbilityEffect extends OneShotEffect { } return false; } + + static boolean check(Game game, Ability source) { + return game.getState().getZoneChangeCounter(source.getSourceId()) == source.getSourceObjectZoneChangeCounter() + 1; + } } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index eb84945b56b..1a1c4c0d75c 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -30,7 +30,6 @@ import mage.filter.Filter; import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; @@ -2389,7 +2388,13 @@ public abstract class GameImpl implements Game { if (auraFilter instanceof FilterPermanent) { if (!((FilterPermanent) auraFilter).match(attachedTo, perm.getId(), perm.getControllerId(), this) || attachedTo.cantBeAttachedBy(perm, null, this, true)) { - if (movePermanentToGraveyardWithInfo(perm)) { + Card card = this.getCard(perm.getId()); + if (card != null && card.isCreature(this)) { + UUID wasAttachedTo = perm.getAttachedTo(); + perm.attachTo(null, null, this); + BestowAbility.becomeCreature(perm, this); + fireEvent(new UnattachedEvent(wasAttachedTo, perm.getId(), perm, null)); + } else if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } }