diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/NonTappingManaAbilitiesTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/NonTappingManaAbilitiesTest.java index 4fef84ad09c..efb41f1cac9 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/NonTappingManaAbilitiesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/NonTappingManaAbilitiesTest.java @@ -334,4 +334,19 @@ public class NonTappingManaAbilitiesTest extends CardTestPlayerBase { assertManaOptions("{C}{C}", manaOptions); } + @Test + public void testAvailableManaWithSpiritGuides() { + // Exile Simian Spirit Guide from your hand: Add {R}. + addCard(Zone.HAND, playerA, "Simian Spirit Guide", 1); + // Exile Simian Spirit Guide from your hand: Add {R}. + addCard(Zone.HAND, playerA, "Elvish Spirit Guide", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + assertManaOptions("{R}{G}", manaOptions); + } + } diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 7e24747eccc..0e36019cb61 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -2891,12 +2891,26 @@ public abstract class PlayerImpl implements Player, Serializable { List> sourceWithoutManaCosts = new ArrayList<>(); List> sourceWithCosts = new ArrayList<>(); + for (Card card : getHand().getCards(game)) { + Abilities manaAbilities + = card.getAbilities(game).getAvailableActivatedManaAbilities(Zone.HAND, playerId, game); + for (Iterator it = manaAbilities.iterator(); it.hasNext();) { + ActivatedManaAbilityImpl ability = it.next(); + Abilities noTapAbilities = new AbilitiesImpl<>(ability); + if (ability.getManaCosts().isEmpty() && !ability.isPoolDependant()) { + sourceWithoutManaCosts.add(noTapAbilities); + } else { + sourceWithCosts.add(noTapAbilities); + } + } + } + for (Permanent permanent : game.getBattlefield().getActivePermanents(playerId, game)) { // Some permanents allow use of abilities from non controlling players. so check all permanents in range Boolean canUse = null; boolean canAdd = false; boolean useLater = false; // sources with mana costs or mana pool dependency Abilities manaAbilities - = permanent.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, playerId, game); // returns ability only if canActivate is true + = permanent.getAbilities(game).getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, playerId, game); // returns ability only if canActivate is true for (Iterator it = manaAbilities.iterator(); it.hasNext();) { ActivatedManaAbilityImpl ability = it.next(); if (canUse == null) { @@ -2978,7 +2992,8 @@ public abstract class PlayerImpl implements Player, Serializable { * abaility */ @Override - public void addAvailableTriggeredMana(List netManaAvailable) { + public void addAvailableTriggeredMana(List netManaAvailable + ) { this.availableTriggeredManaList.add(netManaAvailable); } @@ -2993,8 +3008,8 @@ public abstract class PlayerImpl implements Player, Serializable { public List> getAvailableTriggeredMana() { return availableTriggeredManaList; } - // returns only mana producers that don't require mana payment + protected List getAvailableManaProducers(Game game) { List result = new ArrayList<>(); for (Permanent permanent : game.getBattlefield().getActivePermanents(playerId, game)) { // Some permanents allow use of abilities from non controlling players. so check all permanents in range