diff --git a/Mage.Sets/src/mage/cards/s/StolenGoods.java b/Mage.Sets/src/mage/cards/s/StolenGoods.java index eea404db6f5..fe16c4ce7a9 100644 --- a/Mage.Sets/src/mage/cards/s/StolenGoods.java +++ b/Mage.Sets/src/mage/cards/s/StolenGoods.java @@ -6,13 +6,11 @@ import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AsThoughEffectType; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; +import mage.constants.*; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetOpponent; @@ -61,54 +59,23 @@ class StolenGoodsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); - if (opponent != null) { - Card card; - do { - card = opponent.getLibrary().getFromTop(game); - if (card != null) { - opponent.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null)); - } - } while (card != null && card.isLand(game)); - - if (card != null) { - ContinuousEffect effect = new StolenGoodsCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card, game)); - game.addEffect(effect, source); - } - return true; + if (opponent == null) { + return false; } - return false; - } -} + Card card; + do { + card = opponent.getLibrary().getFromTop(game); + if (card == null) { + continue; + } + if (card.isLand(game)) { + opponent.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null)); + } else { + PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, card, TargetController.YOU, Duration.EndOfTurn, true, false, true); + break; + } + } while (card != null && card.isLand(game)); -class StolenGoodsCastFromExileEffect extends AsThoughEffectImpl { - - public StolenGoodsCastFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may cast card from exile"; - } - - public StolenGoodsCastFromExileEffect(final StolenGoodsCastFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { return true; } - - @Override - public StolenGoodsCastFromExileEffect copy() { - return new StolenGoodsCastFromExileEffect(this); - } - - @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId != null && objectId.equals(getTargetPointer().getFirst(game, source)) - && affectedControllerId.equals(source.getControllerId())) { - allowCardToPlayWithoutMana(objectId, source, affectedControllerId, game); - return true; - } - return false; - } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/StolenGoodsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/StolenGoodsTest.java new file mode 100644 index 00000000000..3ca80652bb9 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/StolenGoodsTest.java @@ -0,0 +1,40 @@ +package org.mage.test.cards.single.avr; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * {@link mage.cards.s.StolenGoods Stolen Goods} + * {3}{U} + * Sorcery + * Target opponent exiles cards from the top of their library until they exile a nonland card. + * Until end of turn, you may cast that card without paying its mana cost. + * + @author Alex-Vasile + */ +public class StolenGoodsTest extends CardTestPlayerBase { + + private static final String stolenGoods = "Stolen Goods"; + + /** + * Reported bug: https://github.com/magefree/mage/issues/9430 + * "[[Stolen Goods]] will let you cast spells without paying their mana costs, but only if you have enough mana to cast them. + * In this example, I want to cast [[Kolvori, God of Kinship]], but can't because I have no green sources." + */ + @Test + public void castDualFaceCard() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + addCard(Zone.HAND, playerA, stolenGoods); + + addCard(Zone.LIBRARY, playerB, "Kolvori, God of Kinship"); + + skipInitShuffling(); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, stolenGoods); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Kolvori, God of Kinship"); + setStopAt(1, PhaseStep.END_TURN); + execute(); + } +}