mirror of
https://github.com/correl/mage.git
synced 2025-04-11 01:01:05 -09:00
* Fixed bug of any mana abilities not working correctly for mana abilities that could produce mana of any type other mana sources could produce.
This commit is contained in:
parent
6bf7a89d45
commit
1d438060fc
14 changed files with 49 additions and 45 deletions
Mage.Sets/src/mage/cards
Mage.Tests/src/test/java/org/mage/test/cards/mana
Mage/src/main/java/mage/abilities/mana
|
@ -28,7 +28,6 @@
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.target.common.TargetLandPermanent;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
@ -38,15 +37,16 @@ import mage.abilities.effects.common.AddManaOfAnyColorEffect;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.abilities.mana.SimpleManaAbility;
|
import mage.abilities.mana.SimpleManaAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AttachmentType;
|
import mage.constants.AttachmentType;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.target.common.TargetLandPermanent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -215,10 +215,10 @@ class NagaVitalistEffect extends ManaEffect {
|
||||||
List<Permanent> lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game);
|
List<Permanent> lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game);
|
||||||
Mana types = new Mana();
|
Mana types = new Mana();
|
||||||
for (Permanent land : lands) {
|
for (Permanent land : lands) {
|
||||||
Abilities<Ability> manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD);
|
Abilities<Ability> manaAbilities = land.getAbilities(game).getManaAbilities(Zone.BATTLEFIELD);
|
||||||
for (Ability basicAbility : manaAbilities) {
|
for (Ability basicAbility : manaAbilities) {
|
||||||
ManaAbility ability = (ManaAbility) basicAbility;
|
ManaAbility ability = (ManaAbility) basicAbility;
|
||||||
if (!ability.equals(source) && ability.definesMana()) {
|
if (!ability.equals(source) && ability.definesMana(game)) {
|
||||||
for (Mana netMana : ability.getNetMana(game)) {
|
for (Mana netMana : ability.getNetMana(game)) {
|
||||||
types.add(netMana);
|
types.add(netMana);
|
||||||
if (netMana.getAny() > 0) {
|
if (netMana.getAny() > 0) {
|
||||||
|
|
|
@ -212,7 +212,7 @@ class ReflectingPoolEffect extends ManaEffect {
|
||||||
Abilities<Ability> manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD);
|
Abilities<Ability> manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD);
|
||||||
for (Ability basicAbility : manaAbilities) {
|
for (Ability basicAbility : manaAbilities) {
|
||||||
ManaAbility ability = (ManaAbility) basicAbility;
|
ManaAbility ability = (ManaAbility) basicAbility;
|
||||||
if (!ability.equals(source) && ability.definesMana()) {
|
if (!ability.equals(source) && ability.definesMana(game)) {
|
||||||
for (Mana netMana : ability.getNetMana(game)) {
|
for (Mana netMana : ability.getNetMana(game)) {
|
||||||
types.add(netMana);
|
types.add(netMana);
|
||||||
if (netMana.getAny() > 0) {
|
if (netMana.getAny() > 0) {
|
||||||
|
|
|
@ -201,7 +201,7 @@ class SquanderedResourcesEffect extends ManaEffect {
|
||||||
if (land != null) {
|
if (land != null) {
|
||||||
Abilities<ActivatedManaAbilityImpl> manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
Abilities<ActivatedManaAbilityImpl> manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
||||||
for (ActivatedManaAbilityImpl ability : manaAbilities) {
|
for (ActivatedManaAbilityImpl ability : manaAbilities) {
|
||||||
if (!ability.equals(source) && ability.definesMana()) {
|
if (!ability.equals(source) && ability.definesMana(game)) {
|
||||||
for (Mana netMana : ability.getNetMana(game)) {
|
for (Mana netMana : ability.getNetMana(game)) {
|
||||||
types.add(netMana);
|
types.add(netMana);
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,7 +216,7 @@ class StarCompassManaEffect extends ManaEffect {
|
||||||
for (Permanent land : lands) {
|
for (Permanent land : lands) {
|
||||||
Abilities<ActivatedManaAbilityImpl> manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
Abilities<ActivatedManaAbilityImpl> manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
||||||
for (ActivatedManaAbilityImpl ability : manaAbilities) {
|
for (ActivatedManaAbilityImpl ability : manaAbilities) {
|
||||||
if (!ability.equals(source) && ability.definesMana()) {
|
if (!ability.equals(source) && ability.definesMana(game)) {
|
||||||
for (Mana netMana : ability.getNetMana(game)) {
|
for (Mana netMana : ability.getNetMana(game)) {
|
||||||
types.add(netMana);
|
types.add(netMana);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,14 +16,14 @@ public class NagaVitalistTest extends CardTestPlayerBase {
|
||||||
/*
|
/*
|
||||||
Naga Vitalist 1G
|
Naga Vitalist 1G
|
||||||
Creature - Naga Druid 1/2
|
Creature - Naga Druid 1/2
|
||||||
T: Add to your mana pool one mana of any type that a land you control could produce.
|
T: Add to your mana pool one mana of any type that a land you control could produce.
|
||||||
*/
|
*/
|
||||||
private final String nagaVitalist = "Naga Vitalist";
|
private final String nagaVitalist = "Naga Vitalist";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Reported bug (issue #3315)
|
Reported bug (issue #3315)
|
||||||
Naga Vitalist could not produce any color mana with a Gift of Paradise enchanted on a forest. All lands on board were forests.
|
Naga Vitalist could not produce any color mana with a Gift of Paradise enchanted on a forest. All lands on board were forests.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void nagaVitalist_InteractionGiftOfParadise() {
|
public void nagaVitalist_InteractionGiftOfParadise() {
|
||||||
|
|
||||||
|
@ -32,25 +32,25 @@ public class NagaVitalistTest extends CardTestPlayerBase {
|
||||||
Enchantment - Aura
|
Enchantment - Aura
|
||||||
Enchant - Land
|
Enchant - Land
|
||||||
When Gift of Paradise enters the battlefield, you gain 3 life.
|
When Gift of Paradise enters the battlefield, you gain 3 life.
|
||||||
Enchanted land has "T: Add two mana of any one color to your mana pool."
|
Enchanted land has "T: Add two mana of any one color to your mana pool."
|
||||||
*/
|
*/
|
||||||
String giftParadise = "Gift of Paradise";
|
String giftParadise = "Gift of Paradise";
|
||||||
|
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
|
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
|
||||||
addCard(Zone.BATTLEFIELD, playerA, nagaVitalist);
|
addCard(Zone.BATTLEFIELD, playerA, nagaVitalist);
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Upwelling"); // mana pools do not empty at the end of phases or turns
|
addCard(Zone.BATTLEFIELD, playerA, "Upwelling"); // mana pools do not empty at the end of phases or turns
|
||||||
addCard(Zone.HAND, playerA, giftParadise);
|
addCard(Zone.HAND, playerA, giftParadise);
|
||||||
|
|
||||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, giftParadise, "Forest");
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, giftParadise, "Forest");
|
||||||
|
|
||||||
activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add to your mana pool one mana of any type that a land you control could produce");
|
activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add to your mana pool one mana of any type that a land you control could produce");
|
||||||
setChoice(playerA, "Green");
|
setChoice(playerA, "Red");
|
||||||
|
|
||||||
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
|
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
assertLife(playerA, 23); // gift of paradise ETB
|
assertLife(playerA, 23); // gift of paradise ETB
|
||||||
assertTapped(nagaVitalist, true);
|
assertTapped(nagaVitalist, true);
|
||||||
Assert.assertEquals("one green mana has to be in the mana pool", 1, playerA.getManaPool().get(ManaType.GREEN));
|
Assert.assertEquals("one red mana has to be in the mana pool", 1, playerA.getManaPool().get(ManaType.RED));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,14 +94,16 @@ public abstract class ActivatedManaAbilityImpl extends ActivatedAbilityImpl impl
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return !netMana.isEmpty();
|
return !getNetMana(game).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is it allowed to undo the mana creation.
|
* Is it allowed to undo the mana creation. It's e.g. not allowed if some
|
||||||
* It's e.g. not allowed if some game revealing information is related (like reveal the top card of the library)
|
* game revealing information is related (like reveal the top card of the
|
||||||
* @return
|
* library)
|
||||||
|
*
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean isUndoPossible() {
|
public boolean isUndoPossible() {
|
||||||
return undoPossible;
|
return undoPossible;
|
||||||
|
|
|
@ -73,7 +73,7 @@ public class AnyColorLandsProduceManaAbility extends ActivatedManaAbilityImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ class AnyColorLandsProduceManaEffect extends ManaEffect {
|
||||||
for (Permanent land : lands) {
|
for (Permanent land : lands) {
|
||||||
Abilities<ActivatedManaAbilityImpl> mana = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
Abilities<ActivatedManaAbilityImpl> mana = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
|
||||||
for (ActivatedManaAbilityImpl ability : mana) {
|
for (ActivatedManaAbilityImpl ability : mana) {
|
||||||
if (!ability.equals(source) && ability.definesMana()) {
|
if (!ability.equals(source) && ability.definesMana(game)) {
|
||||||
for (Mana netMana : ability.getNetMana(game)) {
|
for (Mana netMana : ability.getNetMana(game)) {
|
||||||
types.add(netMana);
|
types.add(netMana);
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ public class CommanderColorIdentityManaAbility extends ActivatedManaAbilityImpl
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class ConditionalAnyColorManaAbility extends ActivatedManaAbilityImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ public class DynamicManaAbility extends ActivatedManaAbilityImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,8 @@ public interface ManaAbility {
|
||||||
/**
|
/**
|
||||||
* Used to check if the ability itself defines mana types it can produce.
|
* Used to check if the ability itself defines mana types it can produce.
|
||||||
*
|
*
|
||||||
|
* @param game
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
boolean definesMana();
|
boolean definesMana(Game game);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification, are
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
* permitted provided that the following conditions are met:
|
* permitted provided that the following conditions are met:
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
* conditions and the following disclaimer.
|
* conditions and the following disclaimer.
|
||||||
*
|
*
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
* provided with the distribution.
|
* provided with the distribution.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
@ -20,12 +20,11 @@
|
||||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* The views and conclusions contained in the software and documentation are those of the
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
* authors and should not be interpreted as representing official policies, either expressed
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
* or implied, of BetaSteward_at_googlemail.com.
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package mage.abilities.mana;
|
package mage.abilities.mana;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,16 +43,18 @@ import mage.game.Game;
|
||||||
public class SimpleManaAbility extends ActivatedManaAbilityImpl {
|
public class SimpleManaAbility extends ActivatedManaAbilityImpl {
|
||||||
|
|
||||||
private boolean predictable;
|
private boolean predictable;
|
||||||
|
|
||||||
public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost) {
|
public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost) {
|
||||||
this(zone, effect, cost, true);
|
this(zone, effect, cost, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param zone
|
* @param zone
|
||||||
* @param effect
|
* @param effect
|
||||||
* @param cost
|
* @param cost
|
||||||
* @param predictable set to false if definig the mana type or amount needs to reveal information and can't be predicted
|
* @param predictable set to false if definig the mana type or amount needs
|
||||||
|
* to reveal information and can't be predicted
|
||||||
*/
|
*/
|
||||||
public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost, boolean predictable) {
|
public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost, boolean predictable) {
|
||||||
super(zone, effect, cost);
|
super(zone, effect, cost);
|
||||||
|
@ -79,9 +80,9 @@ public class SimpleManaAbility extends ActivatedManaAbilityImpl {
|
||||||
@Override
|
@Override
|
||||||
public List<Mana> getNetMana(Game game) {
|
public List<Mana> getNetMana(Game game) {
|
||||||
if (netMana.isEmpty() && predictable) {
|
if (netMana.isEmpty() && predictable) {
|
||||||
for (Effect effect: getEffects()) {
|
for (Effect effect : getEffects()) {
|
||||||
if (effect instanceof ManaEffect) {
|
if (effect instanceof ManaEffect) {
|
||||||
Mana effectMana =((ManaEffect)effect).getMana(game, this);
|
Mana effectMana = ((ManaEffect) effect).getMana(game, this);
|
||||||
if (effectMana != null) {
|
if (effectMana != null) {
|
||||||
netMana.add(effectMana);
|
netMana.add(effectMana);
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,7 @@ public abstract class TriggeredManaAbility extends TriggeredAbilityImpl implemen
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean definesMana() {
|
public boolean definesMana(Game game) {
|
||||||
return !netMana.isEmpty();
|
return !netMana.isEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue