diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/cmr/JeweledLotusTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/cmr/JeweledLotusTest.java new file mode 100644 index 00000000000..69cd8fe864f --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/cmr/JeweledLotusTest.java @@ -0,0 +1,61 @@ +package org.mage.test.cards.single.cmr; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestCommanderDuelBase; + +/** + * @author JayDi85 + */ + +public class JeweledLotusTest extends CardTestCommanderDuelBase { + + @Test + public void test_CantUseManaForNormalSpells() { + // {T}, Sacrifice Jeweled Lotus: Add three mana of any one color. Spend this mana only to cast your commander. + addCard(Zone.BATTLEFIELD, playerA, "Jeweled Lotus", 1); + // + addCard(Zone.HAND, playerA, "Balduvian Bears", 1); + + checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Balduvian Bears", false); + + // generate mana + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice"); + setChoice(playerA, "Green"); + checkManaPool("new mana", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "G", 3); + checkPlayableAbility("after", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Balduvian Bears", false); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + assertAllCommandsUsed(); + } + + @Test + public void test_CanUseManaForCommander() { + // {T}, Sacrifice Jeweled Lotus: Add three mana of any one color. Spend this mana only to cast your commander. + addCard(Zone.BATTLEFIELD, playerA, "Jeweled Lotus", 1); + // + addCard(Zone.COMMAND, playerA, "Balduvian Bears", 1); + + // Jeweled Lotus is mana ability -- game will use that mana for playable too, so must be playable here + checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Balduvian Bears", true); + + // generate mana + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice"); + setChoice(playerA, "Green"); + checkManaPool("new mana", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "G", 3); + checkPlayableAbility("after", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Balduvian Bears", true); + + // play commander + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears"); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + assertAllCommandsUsed(); + + assertPermanentCount(playerA, "Balduvian Bears", 1); + } +} diff --git a/Mage/src/main/java/mage/abilities/mana/conditional/ConditionalSpellManaBuilder.java b/Mage/src/main/java/mage/abilities/mana/conditional/ConditionalSpellManaBuilder.java index e913956624a..b02c358e0e5 100644 --- a/Mage/src/main/java/mage/abilities/mana/conditional/ConditionalSpellManaBuilder.java +++ b/Mage/src/main/java/mage/abilities/mana/conditional/ConditionalSpellManaBuilder.java @@ -16,6 +16,7 @@ import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.Card; import mage.filter.FilterSpell; import mage.game.Game; +import mage.game.command.Commander; import mage.game.stack.Spell; import mage.game.stack.StackObject; @@ -65,13 +66,20 @@ class SpellCastManaCondition extends ManaCondition implements Condition { public boolean apply(Game game, Ability source) { if (source instanceof SpellAbility) { MageObject object = game.getObject(source.getSourceId()); - if (game.inCheckPlayableState() && object instanceof Card) { - Spell spell = new Spell((Card) object, (SpellAbility) source, source.getControllerId(), game.getState().getZone(source.getSourceId()), game); - return filter.match(spell, source.getSourceId(), source.getControllerId(), game); - } if ((object instanceof StackObject)) { return filter.match((StackObject) object, source.getSourceId(), source.getControllerId(), game); } + + // checking mana without real cast + if (game.inCheckPlayableState()) { + Spell spell = null; + if (object instanceof Card) { + spell = new Spell((Card) object, (SpellAbility) source, source.getControllerId(), game.getState().getZone(source.getSourceId()), game); + } else if (object instanceof Commander) { + spell = new Spell(((Commander) object).getSourceObject(), (SpellAbility) source, source.getControllerId(), game.getState().getZone(source.getSourceId()), game); + } + return spell != null && filter.match(spell, source.getSourceId(), source.getControllerId(), game); + } } return false; } diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java index 7ba0e16ec3a..dc4dd234bcb 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java @@ -13,8 +13,8 @@ public enum CommanderPredicate implements Predicate { @Override public boolean apply(MageObject input, Game game) { - Player owner = game.getPlayer(game.getOwnerId(input.getId())); - return owner != null && game.getCommandersIds(owner).contains(input.getId()); + Player owner = game.getPlayer(game.getOwnerId(input)); + return owner != null && game.isCommanderObject(owner, input); } @Override diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 48c8f5ab442..3a2adffe818 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -19,6 +19,7 @@ import mage.choices.Choice; import mage.constants.*; import mage.counters.Counters; import mage.game.combat.Combat; +import mage.game.command.CommandObject; import mage.game.command.Commander; import mage.game.command.Emblem; import mage.game.command.Plane; @@ -519,6 +520,27 @@ public interface Game extends MageItem, Serializable { .collect(Collectors.toSet()); } + /** + * Finds is it a commander card/object (use it in conditional and other things) + * + * @param player + * @param object + * @return + */ + default boolean isCommanderObject(Player player, MageObject object) { + UUID idToCheck = null; + if (object instanceof Spell) { + idToCheck = ((Spell) object).getCard().getId(); + } + if (object instanceof CommandObject) { + idToCheck = object.getId(); + } + if (object instanceof Card) { + idToCheck = ((Card) object).getMainCard().getId(); + } + return idToCheck != null && this.getCommandersIds(player).contains(idToCheck); + } + void setGameStopped(boolean gameStopped); boolean isGameStopped(); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 181f9f7c479..d48593c2e6c 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -436,19 +436,23 @@ public abstract class GameImpl implements Game, Serializable { @Override public UUID getOwnerId(MageObject object) { - if (object instanceof Card) { - return ((Card) object).getOwnerId(); - } if (object instanceof Spell) { return ((Spell) object).getOwnerId(); } + if (object instanceof StackObject) { // maybe this is not correct in all cases? return ((StackObject) object).getControllerId(); } + if (object instanceof CommandObject) { return ((CommandObject) object).getControllerId(); } + + if (object instanceof Card) { + return ((Card) object).getOwnerId(); + } + return null; }