diff --git a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java index a4f7611e448..d2f261f0ca9 100644 --- a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java +++ b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java @@ -3,6 +3,7 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ReplacementEffectImpl; @@ -35,8 +36,8 @@ public final class AladdinsLamp extends CardImpl { // {X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. Ability ability = new SimpleActivatedAbility(new AladdinsLampEffect(), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); - ability.setVariableCostsMinMax(1, Integer.MAX_VALUE); - // TODO: add costAdjuster for min/max values due library size + ability.setCostAdjuster(AladdinsLampCostAdjuster.instance); + this.addAbility(ability); } @@ -96,3 +97,17 @@ class AladdinsLampEffect extends ReplacementEffectImpl { return source.isControlledBy(event.getPlayerId()); } } + +enum AladdinsLampCostAdjuster implements CostAdjuster { + instance; + + @Override + public void prepareX(Ability ability, Game game) { + Player controller = game.getPlayer(ability.getControllerId()); + if (controller == null) { + return; + } + + ability.setVariableCostsMinMax(1, Math.max(1, controller.getLibrary().size())); + } +} diff --git a/Mage.Sets/src/mage/cards/a/Archivist.java b/Mage.Sets/src/mage/cards/a/Archivist.java index b0cde1b880f..688acbb500c 100644 --- a/Mage.Sets/src/mage/cards/a/Archivist.java +++ b/Mage.Sets/src/mage/cards/a/Archivist.java @@ -1,4 +1,3 @@ - package mage.cards.a; import java.util.UUID; @@ -26,7 +25,7 @@ public final class Archivist extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - //{T}: Draw a card. + // {T}: Draw a card. this.addAbility(new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new TapSourceCost())); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/additional/AdjusterCostTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/additional/AdjusterCostTest.java index 7b9a1588ea6..35c05e4c0ff 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/additional/AdjusterCostTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/additional/AdjusterCostTest.java @@ -467,6 +467,36 @@ public class AdjusterCostTest extends CardTestPlayerBaseWithAIHelps { assertLife(playerB, 20 - 3); } + @Test + public void test_prepareX_AladdinsLamp() { + skipInitShuffling(); + + // {X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, + // put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. + addCard(Zone.BATTLEFIELD, playerA, "Aladdin's Lamp"); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 5); + // {T}: Draw a card. + addCard(Zone.BATTLEFIELD, playerA, "Archivist"); + addCard(Zone.LIBRARY, playerA, "Island", 1); + addCard(Zone.LIBRARY, playerA, "Grizzly Bears", 1); + addCard(Zone.LIBRARY, playerA, "Island", 3); + + // prepare effect + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{X}, {T}: The next time"); + setChoice(playerA, "X=5"); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + + // improved draw + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Draw"); + setChoice(playerA, "Grizzly Bears"); // keep on top and draw + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertHandCount(playerA, "Grizzly Bears", 1); + } + @Test public void test_modifyCost_Fireball() { // This spell costs {1} more to cast for each target beyond the first.