diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 8f2d515fe35..3e7ff89435b 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -70,7 +70,7 @@ import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.TrampleAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ManaOptions; import mage.cards.Card; import mage.cards.Cards; @@ -942,7 +942,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { //play a land that will allow us to play an unplayable for (Mana mana : unplayable.keySet()) { for (Card card : lands) { - for (ManaAbility ability : card.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : card.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD)) { for (Mana netMana : ability.getNetMana(game)) { if (netMana.enough(mana)) { this.playLand(card, game, false); @@ -956,7 +956,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { //play a land that will get us closer to playing an unplayable for (Mana mana : unplayable.keySet()) { for (Card card : lands) { - for (ManaAbility ability : card.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : card.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD)) { for (Mana netMana : ability.getNetMana(game)) { if (mana.contains(netMana)) { this.playLand(card, game, false); @@ -1010,7 +1010,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { - if (!(ability instanceof ManaAbility) && ability.canActivate(playerId, game)) { + if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(playerId, game)) { if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) { continue; } @@ -1086,7 +1086,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { // use color producing mana abilities with costs first that produce all color manas that are needed to pay // otherwise the computer may not be able to pay the cost for that source ManaAbility: - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { int colored = 0; for (Mana mana : manaAbility.getNetMana(game)) { if (!unpaid.getMana().includesMana(mana)) { @@ -1109,7 +1109,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { for (MageObject mageObject : producers) { // pay all colored costs first - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof ColoredManaCost) { for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana) || spendAnyMana) { @@ -1121,7 +1121,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // then pay hybrid - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof HybridManaCost) { for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana) || spendAnyMana) { @@ -1133,7 +1133,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // then pay mono hybrid - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof MonoHybridManaCost) { for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana) || spendAnyMana) { @@ -1145,7 +1145,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // pay colorless - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof ColorlessManaCost) { for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana) || spendAnyMana) { @@ -1157,7 +1157,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // finally pay generic - for (ManaAbility manaAbility : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof GenericManaCost) { for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana) || spendAnyMana) { @@ -1200,7 +1200,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { int score = 0; for (ManaCost cost : unpaid) { Abilities: - for (ManaAbility ability : mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl ability : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { for (Mana netMana : ability.getNetMana(game)) { if (cost.testPay(netMana)) { score++; @@ -1210,7 +1210,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } if (score > 0) { // score mana producers that produce other mana types and have other uses higher - score += mageObject.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game).size(); + score += mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game).size(); score += mageObject.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD).size(); if (!mageObject.getCardType().contains(CardType.LAND)) { score += 2; @@ -1312,6 +1312,10 @@ public class ComputerPlayer extends PlayerImpl implements Player { choice.setChoice("Black"); return true; } + if (currentUnpaidMana.getMana().getColorless() > 0 && choice.getChoices().contains("Colorless")) { + choice.setChoice("Colorless"); + return true; + } } // choose by random if (!choice.isChosen()) { diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/PermanentEvaluator.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/PermanentEvaluator.java index 911276ab43c..9d1bc8e792b 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/PermanentEvaluator.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/PermanentEvaluator.java @@ -52,7 +52,7 @@ public class PermanentEvaluator { if (permanent.getCardType().contains(CardType.CREATURE)) { value += combat.evaluate(permanent, game); } - value += permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD).size(); + value += permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD).size(); value += permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD).size(); values.put(permanent.getId(), value); } diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java index 4887da0e61d..4964e93de28 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java @@ -35,7 +35,7 @@ import mage.abilities.ActivatedAbility; import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.TrampleAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.counters.BoostCounter; import mage.counters.Counter; import mage.counters.CounterType; @@ -106,9 +106,9 @@ public class GameStateEvaluator { if (permanent.getCardType().contains(CardType.CREATURE)) { value += evaluateCreature(permanent, game) * CREATURE_FACTOR; } - value += permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD).size(); + value += permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD).size(); for (ActivatedAbility ability: permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { - if (!(ability instanceof ManaAbility) && ability.canActivate(ability.getControllerId(), game)) + if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(ability.getControllerId(), game)) value += ability.getEffects().size(); } for (Counter counter: permanent.getCounters(game).values()) { diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 8d05903ba05..ed84caa5172 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -52,7 +52,7 @@ import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.PhyrexianManaCost; import mage.abilities.effects.RequirementEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; @@ -896,7 +896,7 @@ public class HumanPlayer extends PlayerImpl { } Zone zone = game.getState().getZone(object.getId()); if (zone != null) { - LinkedHashMap useableAbilities = getUseableManaAbilities(object, zone, game); + LinkedHashMap useableAbilities = getUseableManaAbilities(object, zone, game); if (useableAbilities != null && useableAbilities.size() > 0) { useableAbilities = ManaUtil.tryToAutoPay(unpaid, useableAbilities); // eliminates other abilities if one fits perfectly currentlyUnpaidMana = unpaid; @@ -1269,7 +1269,7 @@ public class HumanPlayer extends PlayerImpl { } if (userData.isUseFirstManaAbility() && object instanceof Permanent && object.getCardType().contains(CardType.LAND)) { ActivatedAbility ability = abilities.values().iterator().next(); - if (ability instanceof ManaAbility) { + if (ability instanceof ActivatedManaAbilityImpl) { activateAbility(ability, game); return; } @@ -1293,7 +1293,7 @@ public class HumanPlayer extends PlayerImpl { if (!ability.getSourceId().equals(getCastSourceIdWithAlternateMana()) && ability.getManaCostsToPay().convertedManaCost() > 0) { return true; } - return ability instanceof ManaAbility; + return ability instanceof ActivatedManaAbilityImpl; } return true; } diff --git a/Mage.Sets/src/mage/cards/a/Abeyance.java b/Mage.Sets/src/mage/cards/a/Abeyance.java index 6f5373e5f79..2c71dca48bb 100644 --- a/Mage.Sets/src/mage/cards/a/Abeyance.java +++ b/Mage.Sets/src/mage/cards/a/Abeyance.java @@ -32,7 +32,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -110,7 +110,7 @@ class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl { } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ManaAbility)) { + if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/a/AstralCornucopia.java b/Mage.Sets/src/mage/cards/a/AstralCornucopia.java index 2f586d19e78..e2e110e9220 100644 --- a/Mage.Sets/src/mage/cards/a/AstralCornucopia.java +++ b/Mage.Sets/src/mage/cards/a/AstralCornucopia.java @@ -35,7 +35,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.ChoiceColor; @@ -72,7 +72,7 @@ public class AstralCornucopia extends CardImpl { } } -class AstralCornucopiaManaAbility extends ManaAbility { +class AstralCornucopiaManaAbility extends ActivatedManaAbilityImpl { public AstralCornucopiaManaAbility() { super(Zone.BATTLEFIELD, new AstralCornucopiaManaEffect(), new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/b/BarbedSextant.java b/Mage.Sets/src/mage/cards/b/BarbedSextant.java index c26ad73b492..b3eac60f1c6 100644 --- a/Mage.Sets/src/mage/cards/b/BarbedSextant.java +++ b/Mage.Sets/src/mage/cards/b/BarbedSextant.java @@ -35,7 +35,7 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.AnyColorManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -51,7 +51,7 @@ public class BarbedSextant extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {1}, {tap}, Sacrifice Barbed Sextant: Add one mana of any color to your mana pool. Draw a card at the beginning of the next turn's upkeep. - ManaAbility ability = new AnyColorManaAbility(new GenericManaCost(1)); + ActivatedManaAbilityImpl ability = new AnyColorManaAbility(new GenericManaCost(1)); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new CreateDelayedTriggeredAbilityEffect( diff --git a/Mage.Sets/src/mage/cards/c/CagedSun.java b/Mage.Sets/src/mage/cards/c/CagedSun.java index db3ca3797b2..7f21d47faf0 100644 --- a/Mage.Sets/src/mage/cards/c/CagedSun.java +++ b/Mage.Sets/src/mage/cards/c/CagedSun.java @@ -60,7 +60,7 @@ import mage.players.Player; public class CagedSun extends CardImpl { public CagedSun(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{6}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{6}"); // As Caged Sun enters the battlefield, choose a color. this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); @@ -106,7 +106,7 @@ class CagedSunEffect2 extends ContinuousEffectImpl { if (permanent != null) { ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color"); if (color != null) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { if (perm.getColor(game).contains(color)) { perm.addPower(1); perm.addToughness(1); @@ -161,7 +161,6 @@ class CagedSunTriggeredAbility extends TriggeredManaAbility { } } - class CagedSunEffect extends ManaEffect { public CagedSunEffect() { @@ -192,7 +191,6 @@ class CagedSunEffect extends ManaEffect { } } - @Override public CagedSunEffect copy() { return new CagedSunEffect(this); diff --git a/Mage.Sets/src/mage/cards/c/ChromaticSphere.java b/Mage.Sets/src/mage/cards/c/ChromaticSphere.java index 05a03f4b94a..e8ba7052825 100644 --- a/Mage.Sets/src/mage/cards/c/ChromaticSphere.java +++ b/Mage.Sets/src/mage/cards/c/ChromaticSphere.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.AnyColorManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -48,7 +48,7 @@ public class ChromaticSphere extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color to your mana pool. Draw a card. - ManaAbility ability = new AnyColorManaAbility(new GenericManaCost(1)); + ActivatedManaAbilityImpl ability = new AnyColorManaAbility(new GenericManaCost(1)); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/c/ChromeMox.java b/Mage.Sets/src/mage/cards/c/ChromeMox.java index bd3c60a99ad..d0ccd0356b0 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeMox.java +++ b/Mage.Sets/src/mage/cards/c/ChromeMox.java @@ -42,7 +42,7 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -63,7 +63,7 @@ import mage.util.GameLog; public class ChromeMox extends CardImpl { public ChromeMox(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{0}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}"); // Imprint - When Chrome Mox enters the battlefield, you may exile a nonartifact, nonland card from your hand. this.addAbility(new EntersBattlefieldTriggeredAbility(new ChromeMoxEffect(), true)); @@ -157,7 +157,8 @@ class ChromeMoxManaEffect extends ManaEffect { if (imprinted.size() > 0) { Card imprintedCard = game.getCard(imprinted.get(0)); if (imprintedCard != null) { - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); ObjectColor color = imprintedCard.getColor(game); if (color.isBlack()) { @@ -183,18 +184,27 @@ class ChromeMoxManaEffect extends ManaEffect { } else { player.choose(outcome, choice, game); } - if (choice.getChoice().equals("Black")) { - player.getManaPool().addMana(Mana.BlackMana(1), game, source); - } else if (choice.getChoice().equals("Blue")) { - player.getManaPool().addMana(Mana.BlueMana(1), game, source); - } else if (choice.getChoice().equals("Red")) { - player.getManaPool().addMana(Mana.RedMana(1), game, source); - } else if (choice.getChoice().equals("Green")) { - player.getManaPool().addMana(Mana.GreenMana(1), game, source); - } else if (choice.getChoice().equals("White")) { - player.getManaPool().addMana(Mana.WhiteMana(1), game, source); - } else if (choice.getChoice().equals("Colorless")) { - player.getManaPool().addMana(Mana.ColorlessMana(1), game, source); + switch (choice.getChoice()) { + case "Black": + player.getManaPool().addMana(Mana.BlackMana(1), game, source); + break; + case "Blue": + player.getManaPool().addMana(Mana.BlueMana(1), game, source); + break; + case "Red": + player.getManaPool().addMana(Mana.RedMana(1), game, source); + break; + case "Green": + player.getManaPool().addMana(Mana.GreenMana(1), game, source); + break; + case "White": + player.getManaPool().addMana(Mana.WhiteMana(1), game, source); + break; + case "Colorless": + player.getManaPool().addMana(Mana.ColorlessMana(1), game, source); + break; + default: + break; } checkToFirePossibleEvents(mana, game, source); player.getManaPool().addMana(mana, game, source); diff --git a/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java b/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java index 4e38d6002bf..0f91cdd8924 100644 --- a/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java +++ b/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java @@ -36,12 +36,12 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; @@ -55,7 +55,7 @@ import mage.players.Player; public class CorruptedGrafstone extends CardImpl { public CorruptedGrafstone(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // Corrupted Grafstone enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); @@ -74,7 +74,7 @@ public class CorruptedGrafstone extends CardImpl { } } -class CorruptedGrafstoneManaAbility extends ManaAbility { +class CorruptedGrafstoneManaAbility extends ActivatedManaAbilityImpl { public CorruptedGrafstoneManaAbility() { super(Zone.BATTLEFIELD, new CorruptedGrafstoneManaEffect(), new TapSourceCost()); @@ -118,7 +118,8 @@ class CorruptedGrafstoneManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Mana types = getManaTypesInGraveyard(game, source); - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); diff --git a/Mage.Sets/src/mage/cards/c/CrumblingVestige.java b/Mage.Sets/src/mage/cards/c/CrumblingVestige.java index 546de9f1e30..99074c36281 100644 --- a/Mage.Sets/src/mage/cards/c/CrumblingVestige.java +++ b/Mage.Sets/src/mage/cards/c/CrumblingVestige.java @@ -28,13 +28,18 @@ package mage.cards.c; import java.util.UUID; +import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.ColorlessManaAbility; +import mage.abilities.mana.TriggeredManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; /** * @@ -43,14 +48,14 @@ import mage.constants.CardType; public class CrumblingVestige extends CardImpl { public CrumblingVestige(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Crumbling Vestige enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - + // When Crumbling Vestige enters the battlefield, add one mana of any color to your mana pool. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AddManaOfAnyColorEffect())); - + this.addAbility(new CrumblingVestigeTriggeredManaAbility(new AddManaOfAnyColorEffect())); + // {T}: Add {C} to you mana pool. this.addAbility(new ColorlessManaAbility()); } @@ -64,3 +69,35 @@ public class CrumblingVestige extends CardImpl { return new CrumblingVestige(this); } } + +class CrumblingVestigeTriggeredManaAbility extends TriggeredManaAbility { + + public CrumblingVestigeTriggeredManaAbility(ManaEffect effect) { + super(Zone.ALL, effect, false); + this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 1, 0)); + } + + public CrumblingVestigeTriggeredManaAbility(final CrumblingVestigeTriggeredManaAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getTargetId().equals(getSourceId()); + } + + @Override + public String getRule() { + return "When {this} enters the battlefield, " + super.getRule(); + } + + @Override + public CrumblingVestigeTriggeredManaAbility copy() { + return new CrumblingVestigeTriggeredManaAbility(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DampingMatrix.java b/Mage.Sets/src/mage/cards/d/DampingMatrix.java index c088ba395c1..548cca9ee62 100644 --- a/Mage.Sets/src/mage/cards/d/DampingMatrix.java +++ b/Mage.Sets/src/mage/cards/d/DampingMatrix.java @@ -36,7 +36,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.filter.FilterPermanent; @@ -108,7 +108,7 @@ class DampingMatrixEffect extends ReplacementEffectImpl { MageObject object = game.getObject(event.getSourceId()); if (object instanceof Permanent && filter.match((Permanent)object, game)) { Ability ability = object.getAbilities().get(event.getTargetId()); - if (ability != null && !(ability instanceof ManaAbility)) { + if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DarkwaterEgg.java b/Mage.Sets/src/mage/cards/d/DarkwaterEgg.java index fae3edca3e1..113bbc301f2 100644 --- a/Mage.Sets/src/mage/cards/d/DarkwaterEgg.java +++ b/Mage.Sets/src/mage/cards/d/DarkwaterEgg.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -50,7 +50,7 @@ public class DarkwaterEgg extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {2}, {tap}, Sacrifice Darkwater Egg: Add {U}{B} to your mana pool. Draw a card. - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 1, 0, 0, 0), new ManaCostsImpl("{2}")); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 1, 0, 0, 0), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/g/GrandArchitect.java b/Mage.Sets/src/mage/cards/g/GrandArchitect.java index c9b1320838c..03b2903bce0 100644 --- a/Mage.Sets/src/mage/cards/g/GrandArchitect.java +++ b/Mage.Sets/src/mage/cards/g/GrandArchitect.java @@ -42,7 +42,7 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -134,7 +134,7 @@ class GrandArchitectEffect extends ContinuousEffectImpl { } -class GrandArchitectManaAbility extends ManaAbility { +class GrandArchitectManaAbility extends ActivatedManaAbilityImpl { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped blue creature"); diff --git a/Mage.Sets/src/mage/cards/h/HandToHand.java b/Mage.Sets/src/mage/cards/h/HandToHand.java index 986fb29f03e..a757256d448 100644 --- a/Mage.Sets/src/mage/cards/h/HandToHand.java +++ b/Mage.Sets/src/mage/cards/h/HandToHand.java @@ -32,7 +32,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -107,7 +107,7 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl { } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ManaAbility)) { + if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/i/IllusionistsBracers.java b/Mage.Sets/src/mage/cards/i/IllusionistsBracers.java index c5d5d80aab6..4bfb89106bf 100644 --- a/Mage.Sets/src/mage/cards/i/IllusionistsBracers.java +++ b/Mage.Sets/src/mage/cards/i/IllusionistsBracers.java @@ -34,7 +34,7 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.EquipAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -99,7 +99,7 @@ class AbilityActivatedTriggeredAbility extends TriggeredAbilityImpl { Permanent equipment = game.getPermanent(this.getSourceId()); if (equipment != null && equipment.getAttachedTo() != null && equipment.getAttachedTo().equals(event.getSourceId())) { StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); - if (!(stackAbility.getStackAbility() instanceof ManaAbility)) { + if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { Effect effect = this.getEffects().get(0); effect.setValue("stackAbility", stackAbility); return true; diff --git a/Mage.Sets/src/mage/cards/k/KurkeshOnakkeAncient.java b/Mage.Sets/src/mage/cards/k/KurkeshOnakkeAncient.java index c7eb1cc1a6a..566f790717d 100644 --- a/Mage.Sets/src/mage/cards/k/KurkeshOnakkeAncient.java +++ b/Mage.Sets/src/mage/cards/k/KurkeshOnakkeAncient.java @@ -34,7 +34,7 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -104,7 +104,7 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl { Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); if (source != null && source.getCardType().contains(CardType.ARTIFACT)) { StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); - if (!(stackAbility.getStackAbility() instanceof ManaAbility)) { + if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { Effect effect = this.getEffects().get(0); effect.setValue("stackAbility", stackAbility); return true; diff --git a/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java b/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java index 889dbb540bf..dfe5a505b4c 100644 --- a/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java +++ b/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.DiscardHandCost; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.effects.common.AddManaOfAnyColorEffect; import mage.abilities.effects.common.BasicManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -66,7 +66,7 @@ public class LionsEyeDiamond extends CardImpl { } -class LionsEyeDiamondAbility extends ManaAbility { +class LionsEyeDiamondAbility extends ActivatedManaAbilityImpl { public LionsEyeDiamondAbility() { super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/m/ManaWeb.java b/Mage.Sets/src/mage/cards/m/ManaWeb.java index 88ff14a6fe6..1897edb76a0 100644 --- a/Mage.Sets/src/mage/cards/m/ManaWeb.java +++ b/Mage.Sets/src/mage/cards/m/ManaWeb.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -137,7 +137,7 @@ class ManaWebeffect extends OneShotEffect { if (permanent != null && game != null) { Mana mana = new Mana(); - for (ManaAbility ability : permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD)) { for (Mana netMana : ability.getNetMana(game)) { mana.add(netMana); } @@ -148,7 +148,7 @@ class ManaWebeffect extends OneShotEffect { if (opponentPermanent.getControllerId() == permanent.getControllerId()) { Mana opponentLandMana = new Mana(); - for (ManaAbility ability : opponentPermanent.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl ability : opponentPermanent.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { for (Mana netMana : ability.getNetMana(game)) { opponentLandMana.add(netMana); } diff --git a/Mage.Sets/src/mage/cards/m/MeteorCrater.java b/Mage.Sets/src/mage/cards/m/MeteorCrater.java index 37da97a467b..40d5f321dee 100644 --- a/Mage.Sets/src/mage/cards/m/MeteorCrater.java +++ b/Mage.Sets/src/mage/cards/m/MeteorCrater.java @@ -39,7 +39,7 @@ import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; @@ -55,7 +55,7 @@ import mage.players.Player; public class MeteorCrater extends CardImpl { public MeteorCrater(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Choose a color of a permanent you control. Add one mana of that color to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new MeteorCraterEffect(), new TapSourceCost())); @@ -73,10 +73,11 @@ public class MeteorCrater extends CardImpl { class MeteorCraterEffect extends ManaEffect { - /*** - * 04/10/2004 You can't choose "colorless". You have to choose one of the five colors. + /** + * * + * 04/10/2004 You can't choose "colorless". You have to choose one of the + * five colors. */ - private static final FilterControlledPermanent filter = new FilterControlledPermanent(); public MeteorCraterEffect() { @@ -91,29 +92,31 @@ class MeteorCraterEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Mana types = getManaTypes(game, source); - Choice choice = new ChoiceImpl(false); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); - if (types.getBlack() > 0) { - choice.getChoices().add("Black"); - } - if (types.getRed() > 0) { - choice.getChoices().add("Red"); - } - if (types.getBlue() > 0) { - choice.getChoices().add("Blue"); - } - if (types.getGreen() > 0) { - choice.getChoices().add("Green"); - } - if (types.getWhite() > 0) { - choice.getChoices().add("White"); - } if (types.getAny() > 0) { choice.getChoices().add("Black"); choice.getChoices().add("Red"); choice.getChoices().add("Blue"); choice.getChoices().add("Green"); choice.getChoices().add("White"); + } else { + if (types.getBlack() > 0) { + choice.getChoices().add("Black"); + } + if (types.getRed() > 0) { + choice.getChoices().add("Red"); + } + if (types.getBlue() > 0) { + choice.getChoices().add("Blue"); + } + if (types.getGreen() > 0) { + choice.getChoices().add("Green"); + } + if (types.getWhite() > 0) { + choice.getChoices().add("White"); + } } if (choice.getChoices().size() > 0) { Player player = game.getPlayer(source.getControllerId()); @@ -150,7 +153,7 @@ class MeteorCraterEffect extends ManaEffect { return true; } - public List getNetMana(Game game, Ability source) { + public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); if (types.getBlack() > 0) { @@ -185,10 +188,10 @@ class MeteorCraterEffect extends ManaEffect { if (color.isGreen()) { types.add(Mana.GreenMana(1)); } - if(color.isRed()) { + if (color.isRed()) { types.add(Mana.RedMana(1)); } - if(color.isWhite()) { + if (color.isWhite()) { types.add(Mana.WhiteMana(1)); } } @@ -204,4 +207,4 @@ class MeteorCraterEffect extends ManaEffect { public MeteorCraterEffect copy() { return new MeteorCraterEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java index 4d41f06252e..11136859a8e 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java +++ b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java @@ -35,7 +35,7 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.KickerAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -110,7 +110,7 @@ class MoltenDisasterSplitSecondEffect extends ContinuousRuleModifyingEffectImpl } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ManaAbility)) { + if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { if (KickedCondition.getInstance().apply(game, source)) { return true; } diff --git a/Mage.Sets/src/mage/cards/m/Morselhoarder.java b/Mage.Sets/src/mage/cards/m/Morselhoarder.java index 320825b3066..8d5a6b6ba7d 100644 --- a/Mage.Sets/src/mage/cards/m/Morselhoarder.java +++ b/Mage.Sets/src/mage/cards/m/Morselhoarder.java @@ -35,7 +35,7 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.effects.common.AddManaOfAnyColorEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -72,7 +72,7 @@ public class Morselhoarder extends CardImpl { } } -class MorselhoarderAbility extends ManaAbility { +class MorselhoarderAbility extends ActivatedManaAbilityImpl { public MorselhoarderAbility() { this(new RemoveCountersSourceCost(CounterType.M1M1.createInstance())); } diff --git a/Mage.Sets/src/mage/cards/m/MossfireEgg.java b/Mage.Sets/src/mage/cards/m/MossfireEgg.java index 827d297c070..ffddad8330b 100644 --- a/Mage.Sets/src/mage/cards/m/MossfireEgg.java +++ b/Mage.Sets/src/mage/cards/m/MossfireEgg.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -50,7 +50,7 @@ public class MossfireEgg extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {2}, {tap}, Sacrifice Mossfire Egg: Add {R}{G} to your mana pool. Draw a card. - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 1, 0, 0, 0, 0, 0, 0), new ManaCostsImpl("{2}")); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 1, 0, 0, 0, 0, 0, 0), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java b/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java index c981d8cc88c..5ac5c88ee9e 100644 --- a/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java +++ b/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java @@ -43,7 +43,7 @@ import mage.abilities.effects.common.ManaEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -95,7 +95,7 @@ public class MulDayaChannelers extends CardImpl { } -class MulDayaChannelersActivateIfConditionManaAbility extends ManaAbility { +class MulDayaChannelersActivateIfConditionManaAbility extends ActivatedManaAbilityImpl { private Condition condition; diff --git a/Mage.Sets/src/mage/cards/n/NakedSingularity.java b/Mage.Sets/src/mage/cards/n/NakedSingularity.java index 599c8ac213e..b849fd3a96f 100644 --- a/Mage.Sets/src/mage/cards/n/NakedSingularity.java +++ b/Mage.Sets/src/mage/cards/n/NakedSingularity.java @@ -37,7 +37,7 @@ import mage.abilities.keyword.CumulativeUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -55,7 +55,7 @@ import mage.players.Player; public class NakedSingularity extends CardImpl { public NakedSingularity(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); // Cumulative upkeep {3} this.addAbility(new CumulativeUpkeepAbility(new GenericManaCost(3))); @@ -100,7 +100,8 @@ class NakedSingularityEffect extends ReplacementEffectImpl { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Permanent permanent = game.getPermanent(event.getSourceId()); - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a color to produce"); if (permanent.hasSubtype("Plains", game)) { choice.getChoices().add("Red"); @@ -120,8 +121,7 @@ class NakedSingularityEffect extends ReplacementEffectImpl { String chosenColor; if (choice.getChoices().size() == 1) { chosenColor = choice.getChoices().iterator().next(); - } - else { + } else { controller.choose(Outcome.PutManaInPool, choice, game); chosenColor = choice.getChoice(); } @@ -159,9 +159,9 @@ class NakedSingularityEffect extends ReplacementEffectImpl { Permanent permanent = game.getPermanent(event.getSourceId()); return permanent != null && (permanent.hasSubtype("Plains", game) - || permanent.hasSubtype("Island", game) - || permanent.hasSubtype("Swamp", game) - || permanent.hasSubtype("Mountain", game) - || permanent.hasSubtype("Forest", game)); + || permanent.hasSubtype("Island", game) + || permanent.hasSubtype("Swamp", game) + || permanent.hasSubtype("Mountain", game) + || permanent.hasSubtype("Forest", game)); } } diff --git a/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java b/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java index b289b2c43f7..98b71829194 100644 --- a/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java +++ b/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java @@ -36,7 +36,7 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.DevotionCount; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.ColorlessManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.ChoiceColor; @@ -73,7 +73,7 @@ public class NykthosShrineToNyx extends CardImpl { } } -class NykthosShrineToNyxManaAbility extends ManaAbility { +class NykthosShrineToNyxManaAbility extends ActivatedManaAbilityImpl { public NykthosShrineToNyxManaAbility() { super(Zone.BATTLEFIELD, new NykthosDynamicManaEffect(), new GenericManaCost(2)); diff --git a/Mage.Sets/src/mage/cards/p/PowerSink.java b/Mage.Sets/src/mage/cards/p/PowerSink.java index 4cf26f93bfd..2273f48fce3 100644 --- a/Mage.Sets/src/mage/cards/p/PowerSink.java +++ b/Mage.Sets/src/mage/cards/p/PowerSink.java @@ -34,7 +34,7 @@ import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -116,7 +116,7 @@ class PowerSinkCounterUnlessPaysEffect extends OneShotEffect { for (Permanent land : lands) { Abilities landAbilities = land.getAbilities(); for (Ability ability : landAbilities) { - if (ability instanceof ManaAbility) { + if (ability instanceof ActivatedManaAbilityImpl) { land.tap(game); break; } diff --git a/Mage.Sets/src/mage/cards/r/RainOfFilth.java b/Mage.Sets/src/mage/cards/r/RainOfFilth.java index 802817ff5d1..1648eab6c65 100644 --- a/Mage.Sets/src/mage/cards/r/RainOfFilth.java +++ b/Mage.Sets/src/mage/cards/r/RainOfFilth.java @@ -33,7 +33,7 @@ import mage.constants.CardType; import mage.Mana; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -52,7 +52,7 @@ public class RainOfFilth extends CardImpl { // Until end of turn, lands you control gain "Sacrifice this land: Add {B} to your mana pool." - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(1), new SacrificeSourceCost()); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(1), new SacrificeSourceCost()); this.getSpellAbility().addEffect(new GainAbilityAllEffect(ability, Duration.EndOfTurn, new FilterControlledLandPermanent())); } diff --git a/Mage.Sets/src/mage/cards/r/ReflectingPool.java b/Mage.Sets/src/mage/cards/r/ReflectingPool.java index 9c99a60b56c..f9326c079aa 100644 --- a/Mage.Sets/src/mage/cards/r/ReflectingPool.java +++ b/Mage.Sets/src/mage/cards/r/ReflectingPool.java @@ -35,11 +35,12 @@ import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; @@ -56,7 +57,7 @@ import mage.players.Player; public class ReflectingPool extends CardImpl { public ReflectingPool(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {T}: Add to your mana pool one mana of any type that a land you control could produce. this.addAbility(new ReflectingPoolManaAbility()); @@ -72,7 +73,7 @@ public class ReflectingPool extends CardImpl { } } -class ReflectingPoolManaAbility extends ManaAbility { +class ReflectingPoolManaAbility extends ActivatedManaAbilityImpl { public ReflectingPoolManaAbility() { super(Zone.BATTLEFIELD, new ReflectingPoolEffect(), new TapSourceCost()); @@ -109,7 +110,8 @@ class ReflectingPoolEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Mana types = getManaTypes(game, source); - Choice choice = new ChoiceImpl(false); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); @@ -207,8 +209,9 @@ class ReflectingPoolEffect extends ManaEffect { List lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); Mana types = new Mana(); for (Permanent land : lands) { - Abilities manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD); - for (ManaAbility ability : manaAbilities) { + Abilities manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD); + for (Ability basicAbility : manaAbilities) { + ManaAbility ability = (ManaAbility) basicAbility; if (!ability.equals(source) && ability.definesMana()) { for (Mana netMana : ability.getNetMana(game)) { types.add(netMana); diff --git a/Mage.Sets/src/mage/cards/r/RingsOfBrighthearth.java b/Mage.Sets/src/mage/cards/r/RingsOfBrighthearth.java index 399272472b4..53b26ae4336 100644 --- a/Mage.Sets/src/mage/cards/r/RingsOfBrighthearth.java +++ b/Mage.Sets/src/mage/cards/r/RingsOfBrighthearth.java @@ -33,7 +33,7 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -93,7 +93,7 @@ class RingsOfBrighthearthTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(getControllerId())) { StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); - if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ManaAbility)) { + if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { Effect effect = this.getEffects().get(0); effect.setValue("stackAbility", stackAbility); return true; diff --git a/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java b/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java index a02b764843f..4a90ae0a6c8 100644 --- a/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java +++ b/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java @@ -40,7 +40,7 @@ import mage.abilities.effects.common.ManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; @@ -64,7 +64,7 @@ import mage.players.Player; public class SasayaOrochiAscendant extends CardImpl { public SasayaOrochiAscendant(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}"); this.supertype.add("Legendary"); this.subtype.add("Snake"); this.subtype.add("Monk"); @@ -161,7 +161,8 @@ class SasayasEssenceManaEffectEffect extends ManaEffect { filter.add(new NamePredicate(permanent.getName())); int count = game.getBattlefield().countAll(filter, controller.getId(), game); if (count > 0) { - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick the type of mana to produce"); if (mana.getBlack() > 0) { choice.getChoices().add("Black"); diff --git a/Mage.Sets/src/mage/cards/s/ShadowbloodEgg.java b/Mage.Sets/src/mage/cards/s/ShadowbloodEgg.java index 0ba2703b25e..a15d30b9635 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowbloodEgg.java +++ b/Mage.Sets/src/mage/cards/s/ShadowbloodEgg.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -50,7 +50,7 @@ public class ShadowbloodEgg extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {2}, {tap}, Sacrifice Shadowblood Egg: Add {B}{R} to your mana pool. Draw a card. - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 0, 0, 0, 1, 0, 0, 0), new ManaCostsImpl("{2}")); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 0, 0, 0, 1, 0, 0, 0), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/s/SkycloudEgg.java b/Mage.Sets/src/mage/cards/s/SkycloudEgg.java index 3fd0abd2699..74868ac7e50 100644 --- a/Mage.Sets/src/mage/cards/s/SkycloudEgg.java +++ b/Mage.Sets/src/mage/cards/s/SkycloudEgg.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -50,7 +50,7 @@ public class SkycloudEgg extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {2}, {tap}, Sacrifice Skycloud Egg: Add {W}{U} to your mana pool. Draw a card. - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 1, 0, 0, 0, 0), new ManaCostsImpl("{2}")); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 1, 0, 0, 0, 0), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/s/SquanderedResources.java b/Mage.Sets/src/mage/cards/s/SquanderedResources.java index b22da82c574..4d6f3b42fdb 100644 --- a/Mage.Sets/src/mage/cards/s/SquanderedResources.java +++ b/Mage.Sets/src/mage/cards/s/SquanderedResources.java @@ -37,11 +37,11 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; @@ -58,11 +58,11 @@ import mage.target.common.TargetControlledPermanent; * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public class SquanderedResources extends CardImpl { - + private static final FilterControlledPermanent filter = new FilterControlledLandPermanent("a land"); public SquanderedResources(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}{G}"); // Sacrifice a land: Add to your mana pool one mana of any type the sacrificed land could produce. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SquanderedResourcesEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filter)))); @@ -97,9 +97,10 @@ class SquanderedResourcesEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { - + Mana types = getManaTypes(game, source); - Choice choice = new ChoiceImpl(false); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); @@ -190,14 +191,14 @@ class SquanderedResourcesEffect extends ManaEffect { } private Mana getManaTypes(Game game, Ability source) { - + Mana types = new Mana(); for (Cost cost : source.getCosts()) { - if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost)cost).getPermanents().size() > 0) { - Permanent land = ((SacrificeTargetCost)cost).getPermanents().get(0); - if (land != null) { - Abilities manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD); - for (ManaAbility ability : manaAbilities) { + if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost) cost).getPermanents().size() > 0) { + Permanent land = ((SacrificeTargetCost) cost).getPermanents().get(0); + if (land != null) { + Abilities manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD); + for (ActivatedManaAbilityImpl ability : manaAbilities) { if (!ability.equals(source) && ability.definesMana()) { for (Mana netMana : ability.getNetMana(game)) { types.add(netMana); @@ -219,4 +220,4 @@ class SquanderedResourcesEffect extends ManaEffect { public SquanderedResourcesEffect copy() { return new SquanderedResourcesEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/StarCompass.java b/Mage.Sets/src/mage/cards/s/StarCompass.java index 45d67fe05b3..0a699f38072 100644 --- a/Mage.Sets/src/mage/cards/s/StarCompass.java +++ b/Mage.Sets/src/mage/cards/s/StarCompass.java @@ -36,11 +36,11 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; @@ -58,7 +58,7 @@ import mage.players.Player; public class StarCompass extends CardImpl { public StarCompass(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // Star Compass enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); @@ -76,7 +76,7 @@ public class StarCompass extends CardImpl { } } -class StarCompassManaAbility extends ManaAbility { +class StarCompassManaAbility extends ActivatedManaAbilityImpl { public StarCompassManaAbility() { super(Zone.BATTLEFIELD, new StarCompassManaEffect(), new TapSourceCost()); @@ -117,7 +117,8 @@ class StarCompassManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Mana types = getManaTypes(game, source); - Choice choice = new ChoiceImpl(false); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); @@ -211,8 +212,8 @@ class StarCompassManaEffect extends ManaEffect { List lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); Mana types = new Mana(); for (Permanent land : lands) { - Abilities manaAbilities = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD); - for (ManaAbility ability : manaAbilities) { + Abilities manaAbilities = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD); + for (ActivatedManaAbilityImpl ability : manaAbilities) { if (!ability.equals(source) && ability.definesMana()) { for (Mana netMana : ability.getNetMana(game)) { types.add(netMana); diff --git a/Mage.Sets/src/mage/cards/s/SungrassEgg.java b/Mage.Sets/src/mage/cards/s/SungrassEgg.java index 0423a601903..cd6041d53d1 100644 --- a/Mage.Sets/src/mage/cards/s/SungrassEgg.java +++ b/Mage.Sets/src/mage/cards/s/SungrassEgg.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -50,7 +50,7 @@ public class SungrassEgg extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {2}, {tap}, Sacrifice Sungrass Egg: Add {G}{W} to your mana pool. Draw a card. - ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 0, 1, 0, 0, 0, 0), new ManaCostsImpl("{2}")); + ActivatedManaAbilityImpl ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 0, 1, 0, 0, 0, 0), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/t/TarnishedCitadel.java b/Mage.Sets/src/mage/cards/t/TarnishedCitadel.java index eb05c9619e7..46f523780b0 100644 --- a/Mage.Sets/src/mage/cards/t/TarnishedCitadel.java +++ b/Mage.Sets/src/mage/cards/t/TarnishedCitadel.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.mana.AnyColorManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -51,7 +51,7 @@ public class TarnishedCitadel extends CardImpl { // {tap}: Add {C} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(1), new TapSourceCost())); // {tap}: Add one mana of any color to your mana pool. Tarnished Citadel deals 3 damage to you. - ManaAbility ability = new AnyColorManaAbility(new TapSourceCost()); + ActivatedManaAbilityImpl ability = new AnyColorManaAbility(new TapSourceCost()); ability.addEffect(new DamageControllerEffect(3)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TradingPost.java b/Mage.Sets/src/mage/cards/t/TradingPost.java index d616326dfdd..bbb4ab78c37 100644 --- a/Mage.Sets/src/mage/cards/t/TradingPost.java +++ b/Mage.Sets/src/mage/cards/t/TradingPost.java @@ -58,28 +58,28 @@ import mage.target.common.TargetControlledPermanent; public class TradingPost extends CardImpl { public TradingPost(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); - // {1}, {tap}, Discard a card: You gain 4 life. + // {1}, {T}, Discard a card: You gain 4 life. Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(4), new GenericManaCost(1)); ability1.addCost(new TapSourceCost()); ability1.addCost(new DiscardTargetCost(new TargetCardInHand())); this.addAbility(ability1); - // {1}, {tap}, Pay 1 life: Create a 0/1 white Goat creature token. + // {1}, {T}, Pay 1 life: Create a 0/1 white Goat creature token. Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoatToken()), new GenericManaCost(1)); ability2.addCost(new TapSourceCost()); ability2.addCost(new PayLifeCost(1)); this.addAbility(ability2); - // {1}, {tap}, Sacrifice a creature: Return target artifact card from your graveyard to your hand. + // {1}, {T}, Sacrifice a creature: Return target artifact card from your graveyard to your hand. Ability ability3 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), new GenericManaCost(1)); ability3.addTarget(new TargetCardInGraveyard(new FilterArtifactCard("an artifact card in your graveyard"))); ability3.addCost(new TapSourceCost()); ability3.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledCreaturePermanent("a creature")))); this.addAbility(ability3); - // {1}, {tap}, Sacrifice an artifact: Draw a card. + // {1}, {T}, Sacrifice an artifact: Draw a card. Ability ability4 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(1)); ability4.addCost(new TapSourceCost()); ability4.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); diff --git a/Mage.Sets/src/mage/cards/t/TsabosWeb.java b/Mage.Sets/src/mage/cards/t/TsabosWeb.java index 8adeb5a70e2..31a1bede979 100644 --- a/Mage.Sets/src/mage/cards/t/TsabosWeb.java +++ b/Mage.Sets/src/mage/cards/t/TsabosWeb.java @@ -35,7 +35,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -100,7 +100,7 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl { if (permanent != null && permanent.getCardType().contains(CardType.LAND)) { for (Ability ability :permanent.getAbilities()) { if (!(ability instanceof PlayLandAbility) - && !(ability instanceof ManaAbility) + && !(ability instanceof ActivatedManaAbilityImpl) && ability instanceof ActivatedAbility) { return true; } diff --git a/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java b/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java index fa8b83edfa0..1ce24e3b67c 100644 --- a/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java +++ b/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java @@ -38,7 +38,7 @@ import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -109,7 +109,7 @@ class VedalkenEngineerManaCondition implements Condition { } } -class VedalkenEngineerAbility extends ManaAbility { +class VedalkenEngineerAbility extends ActivatedManaAbilityImpl { public VedalkenEngineerAbility(Cost cost, int amount, ConditionalManaBuilder manaBuilder) { super(Zone.BATTLEFIELD, new VedalkenEngineerEffect(amount, manaBuilder), cost); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java index 5e69551e6e6..c04f1da5341 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java @@ -14,6 +14,24 @@ import org.mage.test.serverside.base.CardTestPlayerBase; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; /** * @author noxx diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ReflectingPoolTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ReflectingPoolTest.java new file mode 100644 index 00000000000..d7996ccffc2 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ReflectingPoolTest.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.mana; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class ReflectingPoolTest extends CardTestPlayerBase { + + /** + * Reflecting Pool does not count Crumbling Vestige as a source of all mana + * colors + */ + @Test + public void testTriggeredManaAbility() { + addCard(Zone.HAND, playerA, "Lightning Bolt", 1); // {R} + + // {T}: Add to your mana pool one mana of any type that a land you control could produce. + addCard(Zone.BATTLEFIELD, playerA, "Reflecting Pool", 1); + // Crumbling Vestige enters the battlefield tapped. + // When Crumbling Vestige enters the battlefield, add one mana of any color to your mana pool. + // {T}: Add {C} to you mana pool. + addCard(Zone.HAND, playerA, "Crumbling Vestige", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Crumbling Vestige"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Crumbling Vestige", 1); + assertGraveyardCount(playerA, "Lightning Bolt", 1); + + assertLife(playerA, 20); + assertLife(playerB, 17); + + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 7c554025fd0..a8081a8d56c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -48,7 +48,7 @@ import mage.abilities.costs.Costs; import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ManaOptions; import mage.cards.Card; import mage.cards.Cards; @@ -414,7 +414,7 @@ public class TestPlayer implements Player { for (MageObject mageObject : manaObjects) { if (mageObject instanceof Permanent) { - for (Ability manaAbility : ((Permanent) mageObject).getAbilities(game).getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (Ability manaAbility : ((Permanent) mageObject).getAbilities(game).getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (manaAbility.toString().startsWith(groups[0])) { Ability newManaAbility = manaAbility.copy(); computerPlayer.activateAbility((ActivatedAbility) newManaAbility, game); @@ -423,7 +423,7 @@ public class TestPlayer implements Player { } } } else if (mageObject instanceof Card) { - for (Ability manaAbility : ((Card) mageObject).getAbilities(game).getAvailableManaAbilities(game.getState().getZone(mageObject.getId()), game)) { + for (Ability manaAbility : ((Card) mageObject).getAbilities(game).getAvailableActivatedManaAbilities(game.getState().getZone(mageObject.getId()), game)) { if (manaAbility.toString().startsWith(groups[0])) { Ability newManaAbility = manaAbility.copy(); computerPlayer.activateAbility((ActivatedAbility) newManaAbility, game); @@ -432,7 +432,7 @@ public class TestPlayer implements Player { } } } else { - for (Ability manaAbility : mageObject.getAbilities().getAvailableManaAbilities(game.getState().getZone(mageObject.getId()), game)) { + for (Ability manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(game.getState().getZone(mageObject.getId()), game)) { if (manaAbility.toString().startsWith(groups[0])) { Ability newManaAbility = manaAbility.copy(); computerPlayer.activateAbility((ActivatedAbility) newManaAbility, game); @@ -444,7 +444,7 @@ public class TestPlayer implements Player { } List manaPermsWithCost = computerPlayer.getAvailableManaProducersWithCost(game); for (Permanent perm : manaPermsWithCost) { - for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ActivatedManaAbilityImpl manaAbility : perm.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) { if (manaAbility.toString().startsWith(groups[0]) && manaAbility.canActivate(computerPlayer.getId(), game)) { Ability newManaAbility = manaAbility.copy(); computerPlayer.activateAbility((ActivatedAbility) newManaAbility, game); diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java index cf027c38661..a1e4f7b8363 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java @@ -10,7 +10,7 @@ import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.mana.BasicManaAbility; import mage.abilities.mana.BlackManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.Card; @@ -188,10 +188,10 @@ public class ManaUtilTest extends CardTestPlayerBase { Card card = CardRepository.instance.findCard(landName).getCard(); Assert.assertNotNull(card); - HashMap useableAbilities = getManaAbilities(card); + HashMap useableAbilities = getManaAbilities(card); Assert.assertEquals(expected1, useableAbilities.size()); - useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); + useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); Assert.assertEquals(expected2, useableAbilities.size()); } @@ -216,12 +216,12 @@ public class ManaUtilTest extends CardTestPlayerBase { Card card = CardRepository.instance.findCard(landName).getCard(); Assert.assertNotNull(card); - HashMap useableAbilities = getManaAbilities(card); + HashMap useableAbilities = getManaAbilities(card); Assert.assertEquals(expected1, useableAbilities.size()); - useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); + useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); Assert.assertEquals(1, useableAbilities.size()); - ManaAbility ability = useableAbilities.values().iterator().next(); + ActivatedManaAbilityImpl ability = useableAbilities.values().iterator().next(); Assert.assertTrue("Wrong mana ability has been chosen", expectedChosen.isInstance(ability)); } @@ -251,12 +251,12 @@ public class ManaUtilTest extends CardTestPlayerBase { * @param card Card to extract mana abilities from. * @return */ - private HashMap getManaAbilities(Card card) { - HashMap useableAbilities = new LinkedHashMap<>(); + private HashMap getManaAbilities(Card card) { + HashMap useableAbilities = new LinkedHashMap<>(); for (Ability ability : card.getAbilities()) { - if (ability instanceof ManaAbility) { + if (ability instanceof ActivatedManaAbilityImpl) { ability.newId(); // we need to assign id manually as we are not in game - useableAbilities.put(ability.getId(), (ManaAbility) ability); + useableAbilities.put(ability.getId(), (ActivatedManaAbilityImpl) ability); } } return useableAbilities; diff --git a/Mage/src/main/java/mage/MageObjectImpl.java b/Mage/src/main/java/mage/MageObjectImpl.java index 8ab42221b1e..0e7df0a0e6c 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -38,7 +38,7 @@ import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.keyword.ChangelingAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.FrameStyle; import mage.constants.CardType; import mage.game.Game; @@ -187,8 +187,8 @@ public abstract class MageObjectImpl implements MageObject { if (getCardType().contains(CardType.LAND)) { ObjectColor cl = frameColor.copy(); for (Ability ab: getAbilities()) { - if (ab instanceof ManaAbility) { - ManaAbility mana = (ManaAbility)ab; + if (ab instanceof ActivatedManaAbilityImpl) { + ActivatedManaAbilityImpl mana = (ActivatedManaAbilityImpl)ab; try { List manaAdded = mana.getNetMana(game); for (Mana m: manaAdded) { diff --git a/Mage/src/main/java/mage/ObjectColor.java b/Mage/src/main/java/mage/ObjectColor.java index 4c4e1eb01fe..68ab9620f6a 100644 --- a/Mage/src/main/java/mage/ObjectColor.java +++ b/Mage/src/main/java/mage/ObjectColor.java @@ -30,6 +30,7 @@ package mage; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import mage.constants.ColoredManaSymbol; import mage.util.Copyable; import mage.util.ThreadLocalStringBuilder; @@ -380,6 +381,31 @@ public class ObjectColor implements Serializable, Copyable, Compara return o1 - o2; } + /** + * Returns a ColoredManaSymbol of a color included If multicolor only one + * symbol is returned + * + * @return null or + */ + public ColoredManaSymbol getColoredManaSymbol() { + if (isBlack()) { + return ColoredManaSymbol.B; + } + if (isRed()) { + return ColoredManaSymbol.R; + } + if (isBlue()) { + return ColoredManaSymbol.U; + } + if (isGreen()) { + return ColoredManaSymbol.G; + } + if (isWhite()) { + return ColoredManaSymbol.W; + } + return null; + } + public static List getAllColors() { List colors = new ArrayList<>(); colors.add(ObjectColor.WHITE); @@ -389,4 +415,5 @@ public class ObjectColor implements Serializable, Copyable, Compara colors.add(ObjectColor.GREEN); return colors; } + } diff --git a/Mage/src/main/java/mage/abilities/Abilities.java b/Mage/src/main/java/mage/abilities/Abilities.java index 0dd9366f18e..d6d007f3c00 100644 --- a/Mage/src/main/java/mage/abilities/Abilities.java +++ b/Mage/src/main/java/mage/abilities/Abilities.java @@ -24,24 +24,23 @@ * 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 * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.abilities; import java.io.Serializable; import java.util.List; import java.util.UUID; -import mage.constants.Zone; import mage.abilities.keyword.ProtectionAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.constants.Zone; import mage.game.Game; /** - * Represents a collection of {@link Ability Abilities}. This is the top most + * Represents a collection of {@link Ability Abilities}. This is the top most * interface for this. - * + * * @param The ability type this collection will hold. - * + * * @see mage.abilities.AbilitiesImpl * @see mage.abilities.DelayedTriggeredAbilities * @see mage.abilities.SpecialActions @@ -52,10 +51,10 @@ public interface Abilities extends List, Serializable { /** * Retrieves a {@link List}<{@link String}> of ability texts for the * given source. - * + * * @param source The source to retrieve ability texts. * @return the {@link List}<{@link String}> of ability texts. - * + * * @see mage.cards.CardImpl#getRules() * @see mage.abilities.keyword.LevelAbility#getRule() */ @@ -63,10 +62,10 @@ public interface Abilities extends List, Serializable { /** * Retrieves all activated abilities for the given {@link Zone}. - * + * * @param zone The {@link Zone} for which abilities should be retrieved. * @return All abilities for the given {@link Zone} - * + * * @see mage.cards.CardImpl#getSpellAbility() */ Abilities getActivatedAbilities(Zone zone); @@ -82,47 +81,74 @@ public interface Abilities extends List, Serializable { Abilities getPlayableAbilities(Zone zone); /** - * Retrieves all {@link ManaAbility mana abilities} in the given {@link Zone}. - * - * @param zone The {@link Zone} to search for {@link ManaAbility mana abilities}. - * @return All {@link ManaAbility mana abilities} for the given {@link Zone}. - * + * Retrieves all {@link ActivatedManaAbilityImpl mana abilities} in the + * given {@link Zone}. + * + * @param zone The {@link Zone} to search for + * {@link ActivatedManaAbilityImpl mana abilities}. + * @return All {@link ActivatedManaAbilityImpl mana abilities} for the given + * {@link Zone}. + * * @see mage.cards.CardImpl#getMana() * @see mage.players.PlayerImpl#getManaAvailable(mage.game.Game) * @see mage.players.PlayerImpl#getAvailableManaProducers(mage.game.Game) */ - Abilities getManaAbilities(Zone zone); + Abilities getActivatedManaAbilities(Zone zone); /** - * Retrieves all {@link ManaAbility mana abilities} in the given {@link Zone} that can be used. - * - * @param zone The {@link Zone} to search for {@link ManaAbility mana abilities}. - * @return All {@link ManaAbility mana abilities} for the given {@link Zone} that can be used. - * + * Retrieves a list of all mana abilities (activated and triggered + * abilities) + * + * @param zone + * @return + */ + Abilities getManaAbilities(Zone zone); + + /** + * Retrieves all {@link ActivatedManaAbilityImpl mana abilities} in the + * given {@link Zone} that can be used. + * + * @param zone The {@link Zone} to search for + * {@link ActivatedManaAbilityImpl mana abilities}. + * @return All {@link ActivatedManaAbilityImpl mana abilities} for the given + * {@link Zone} that can be used. + * * @see mage.cards.CardImpl#getMana() * @see mage.players.PlayerImpl#getManaAvailable(mage.game.Game) * @see mage.players.PlayerImpl#getAvailableManaProducers(mage.game.Game) */ - Abilities getAvailableManaAbilities(Zone zone, Game game); + Abilities getAvailableActivatedManaAbilities(Zone zone, Game game); /** - * Retrieves all {@link StaticAbility static abilities} in the given {@link Zone}. - * + * Retrieves all {@link StaticAbility static abilities} in the given + * {@link Zone}. + * * @param zone The {@link Zone} to search for {@link StaticAbility} - * @return All {@link StaticAbility static abilities} in the given {@link Zone} - * - * @see mage.abilities.effects.ContinuousEffects#getLayeredEffects(mage.game.Game) - * @see mage.abilities.effects.ContinuousEffects#getApplicableRequirementEffects(mage.game.permanent.Permanent, mage.game.Game) - * @see mage.abilities.effects.ContinuousEffects#getApplicableRestrictionEffects(mage.game.permanent.Permanent, mage.game.Game) - * @see mage.abilities.effects.ContinuousEffects#getApplicableReplacementEffects(mage.game.events.GameEvent, mage.game.Game) - * @see mage.abilities.effects.ContinuousEffects#asThough(java.util.UUID, mage.constants.AsThoughEffectType, mage.game.Game) - * @see mage.abilities.effects.ContinuousEffects#costModification(mage.abilities.Ability, mage.game.Game) + * @return All {@link StaticAbility static abilities} in the given + * {@link Zone} + * + * @see + * mage.abilities.effects.ContinuousEffects#getLayeredEffects(mage.game.Game) + * @see + * mage.abilities.effects.ContinuousEffects#getApplicableRequirementEffects(mage.game.permanent.Permanent, + * mage.game.Game) + * @see + * mage.abilities.effects.ContinuousEffects#getApplicableRestrictionEffects(mage.game.permanent.Permanent, + * mage.game.Game) + * @see + * mage.abilities.effects.ContinuousEffects#getApplicableReplacementEffects(mage.game.events.GameEvent, + * mage.game.Game) + * @see mage.abilities.effects.ContinuousEffects#asThough(java.util.UUID, + * mage.constants.AsThoughEffectType, mage.game.Game) + * @see + * mage.abilities.effects.ContinuousEffects#costModification(mage.abilities.Ability, + * mage.game.Game) */ Abilities getStaticAbilities(Zone zone); /** * Retrieves all {@link EvasionAbility evasion abilities}. - * + * * @return The {@link EvasionAbility evasion abilities}. */ Abilities getEvasionAbilities(); @@ -130,21 +156,27 @@ public interface Abilities extends List, Serializable { /** * Retrieves all {@link TriggeredAbility triggered abilities} for the given * {@link Zone}. - * - * @param zone The {@link Zone} to search for {@link TriggeredAbility triggered abilities} + * + * @param zone The {@link Zone} to search for + * {@link TriggeredAbility triggered abilities} * @return All found {@link TriggeredAbility triggered abilities}. - * - * @see mage.cards.CardImpl#checkTriggers(mage.constants.Zone, mage.game.events.GameEvent, mage.game.Game) - * @see mage.game.permanent.PermanentImpl#checkTriggers(mage.game.events.GameEvent, mage.game.Game) - * @see mage.game.permanent.PermanentCard#checkPermanentOnlyTriggers(mage.game.events.ZoneChangeEvent, mage.game.Game) + * + * @see mage.cards.CardImpl#checkTriggers(mage.constants.Zone, + * mage.game.events.GameEvent, mage.game.Game) + * @see + * mage.game.permanent.PermanentImpl#checkTriggers(mage.game.events.GameEvent, + * mage.game.Game) + * @see + * mage.game.permanent.PermanentCard#checkPermanentOnlyTriggers(mage.game.events.ZoneChangeEvent, + * mage.game.Game) */ Abilities getTriggeredAbilities(Zone zone); /** * Retrieves all {@link ProtectionAbility protection abilities}. - * + * * @return All found {@link ProtectionAbility protection abilities}. - * + * * @see mage.game.permanent.PermanentImpl#hasProtectionFrom(mage.MageObject) * @see mage.players.PlayerImpl#hasProtectionFrom(mage.MageObject) * @see mage.players.PlayerImpl#canDamage(mage.MageObject) @@ -153,32 +185,34 @@ public interface Abilities extends List, Serializable { /** * TODO Method is unused, keep it around? - * + * * The only implementation seems to want to use this for totally a set of - * abilities by some arbitrary numeral value. Possibly a good method to be + * abilities by some arbitrary numeral value. Possibly a good method to be * used by the AI's? - * - * @return A numeral value representing the 'strength' or effectiveness of the abilities? + * + * @return A numeral value representing the 'strength' or effectiveness of + * the abilities? */ int getOutcomeTotal(); /** * Sets the controller of this set of abilities. - * + * * @param controllerId - * + * * @see mage.cards.CardImpl#setControllerId(java.util.UUID) * @see mage.cards.CardImpl#setOwnerId(java.util.UUID) - * @see mage.game.permanent.PermanentImpl#changeControllerId(java.util.UUID, mage.game.Game) + * @see mage.game.permanent.PermanentImpl#changeControllerId(java.util.UUID, + * mage.game.Game) * @see mage.game.permanent.PermanentCard#copyFromCard(mage.cards.Card) */ void setControllerId(UUID controllerId); /** * Sets the source of this set of abilities. - * + * * @param sourceId - * + * * @see mage.cards.CardImpl#assignNewId() */ void setSourceId(UUID sourceId); @@ -194,39 +228,40 @@ public interface Abilities extends List, Serializable { void newOriginalId(); /** - * Searches this set of abilities to see if the ability represented by the abilityId - * is contained within. Can be used to find usages of singleton abilities. - * + * Searches this set of abilities to see if the ability represented by the + * abilityId is contained within. Can be used to find usages of singleton + * abilities. + * * @param abilityId - * @return + * @return */ boolean containsKey(UUID abilityId); /** * TODO Method is unused, keep it around? - * + * * Gets the ability represented by the given abilityId. - * + * * @param abilityId - * @return + * @return */ T get(UUID abilityId); /** - * TODO The usage of this method seems redundant to that of {@link #containsKey(java.util.UUID)} - * minus the fact that it searches for exact instances instead of id's of - * singleton Abilities. - * + * TODO The usage of this method seems redundant to that of + * {@link #containsKey(java.util.UUID)} minus the fact that it searches for + * exact instances instead of id's of singleton Abilities. + * * Searches for the exact instance of the passed in ability. - * + * * @param ability - * @return + * @return */ boolean contains(T ability); /** * Searches an ability with the same rule text as the passed in ability. - * + * * @param ability * @return */ @@ -235,9 +270,10 @@ public interface Abilities extends List, Serializable { /** * Searches this set of abilities for the existence of each of the passed in * set of abilities. - * + * * @param abilities - * @return True if the passed in set of abilities is also in this set of abilities. + * @return True if the passed in set of abilities is also in this set of + * abilities. */ boolean containsAll(Abilities abilities); @@ -250,10 +286,10 @@ public interface Abilities extends List, Serializable { boolean containsClass(Class classObject); /** - * Copies this set of abilities. This copy should be new instances of all + * Copies this set of abilities. This copy should be new instances of all * the contained abilities. - * - * @return + * + * @return */ Abilities copy(); diff --git a/Mage/src/main/java/mage/abilities/AbilitiesImpl.java b/Mage/src/main/java/mage/abilities/AbilitiesImpl.java index cf0a14bac50..f2406cf8ce8 100644 --- a/Mage/src/main/java/mage/abilities/AbilitiesImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilitiesImpl.java @@ -36,7 +36,8 @@ import java.util.UUID; import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.keyword.ProtectionAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.constants.AbilityType; import mage.constants.Zone; import mage.game.Game; import mage.util.ThreadLocalStringBuilder; @@ -48,7 +49,7 @@ import org.apache.log4j.Logger; * @param */ public class AbilitiesImpl extends ArrayList implements Abilities { - + private static final Logger logger = Logger.getLogger(AbilitiesImpl.class); private static final ThreadLocalStringBuilder threadLocalBuilder = new ThreadLocalStringBuilder(200); @@ -143,29 +144,40 @@ public class AbilitiesImpl extends ArrayList implements Ab } @Override - public Abilities getManaAbilities(Zone zone) { - Abilities abilities = new AbilitiesImpl<>(); + public Abilities getActivatedManaAbilities(Zone zone) { + Abilities abilities = new AbilitiesImpl<>(); for (T ability : this) { - if (ability instanceof ManaAbility && ability.getZone().match(zone)) { - abilities.add((ManaAbility) ability); + if (ability instanceof ActivatedManaAbilityImpl && ability.getZone().match(zone)) { + abilities.add((ActivatedManaAbilityImpl) ability); } } return abilities; } @Override - public Abilities getAvailableManaAbilities(Zone zone, Game game) { - Abilities abilities = new AbilitiesImpl<>(); + public Abilities getAvailableActivatedManaAbilities(Zone zone, Game game) { + Abilities abilities = new AbilitiesImpl<>(); for (T ability : this) { - if (ability instanceof ManaAbility && ability.getZone().match(zone)) { - if ((((ManaAbility) ability).canActivate(ability.getControllerId(), game))) { - abilities.add((ManaAbility) ability); + if (ability instanceof ActivatedManaAbilityImpl && ability.getZone().match(zone)) { + if ((((ActivatedManaAbilityImpl) ability).canActivate(ability.getControllerId(), game))) { + abilities.add((ActivatedManaAbilityImpl) ability); } } } return abilities; } + @Override + public Abilities getManaAbilities(Zone zone) { + Abilities abilities = new AbilitiesImpl<>(); + for (T ability : this) { + if (ability.getAbilityType().equals(AbilityType.MANA) && ability.getZone().match(zone)) { + abilities.add(ability); + } + } + return abilities; + } + @Override public Abilities getEvasionAbilities() { Abilities abilities = new AbilitiesImpl<>(); @@ -340,4 +352,4 @@ public class AbilitiesImpl extends ArrayList implements Ab } return sb.toString(); } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 3e4ecc12036..223c6205779 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -52,7 +52,7 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.DynamicManaEffect; import mage.abilities.keyword.FlashbackAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.Card; import mage.constants.AbilityType; import mage.constants.AbilityWord; @@ -369,7 +369,7 @@ public abstract class AbilityImpl implements Ability { } // this is a hack to prevent mana abilities with mana costs from causing endless loops - pay other costs first - if (this instanceof ManaAbility && !costs.pay(this, game, sourceId, controllerId, noMana, null)) { + if (this instanceof ActivatedManaAbilityImpl && !costs.pay(this, game, sourceId, controllerId, noMana, null)) { logger.debug("activate mana ability failed - non mana costs"); return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java index 026b8e1f9ee..da0143299f4 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java @@ -30,7 +30,7 @@ package mage.abilities.effects.common; import mage.Mana; import mage.abilities.Ability; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -59,7 +59,8 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect { return false; } Mana types = (Mana) this.getValue("mana"); - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick the type of mana to produce"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); diff --git a/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java b/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java index a281fa7c49a..f155d53c44f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java @@ -39,7 +39,7 @@ import mage.abilities.costs.mana.AlternateManaPaymentAbility; import mage.abilities.costs.mana.ManaCost; import mage.abilities.effects.OneShotEffect; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.AbilityType; import mage.constants.ManaType; import mage.constants.Outcome; @@ -263,7 +263,8 @@ class ConvokeEffect extends OneShotEffect { } private Choice buildChoice(ObjectColor creatureColor, Mana mana) { - Choice choice = new ChoiceImpl(); + Choice choice = new ChoiceColor(); + choice.getChoices().clear(); if (creatureColor.isBlack() && mana.getBlack() > 0) { choice.getChoices().add("Black"); } diff --git a/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java b/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java index 205ed3f8e99..806f71a3099 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java @@ -3,7 +3,7 @@ package mage.abilities.keyword; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; @@ -67,7 +67,7 @@ class SplitSecondEffect extends ContinuousRuleModifyingEffectImpl { } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ManaAbility)) { + if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java index e661f17281c..b7f846f9573 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java @@ -35,7 +35,7 @@ import mage.abilities.effects.common.BasicManaEffect; import mage.constants.Zone; import mage.game.Game; -public class ActivateIfConditionManaAbility extends ManaAbility { +public class ActivateIfConditionManaAbility extends ActivatedManaAbilityImpl { private final Condition condition; diff --git a/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java index a0eae4a8b84..624f42164b0 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java @@ -41,7 +41,7 @@ import mage.util.CardUtil; * * @author LevelX2 */ -public class ActivateOncePerTurnManaAbility extends ManaAbility { +public class ActivateOncePerTurnManaAbility extends ActivatedManaAbilityImpl { class ActivationInfo { diff --git a/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java new file mode 100644 index 00000000000..29d74f3b8f9 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java @@ -0,0 +1,107 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.mana; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.Mana; +import mage.abilities.ActivatedAbilityImpl; +import mage.abilities.costs.Cost; +import mage.abilities.effects.common.ManaEffect; +import mage.constants.AbilityType; +import mage.constants.Zone; +import mage.game.Game; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public abstract class ActivatedManaAbilityImpl extends ActivatedAbilityImpl implements ManaAbility { + + protected List netMana = new ArrayList<>(); + protected boolean undoPossible; + + public ActivatedManaAbilityImpl(Zone zone, ManaEffect effect, Cost cost) { + super(AbilityType.MANA, zone); + this.usesStack = false; + this.undoPossible = true; + if (effect != null) { + this.addEffect(effect); + } + if (cost != null) { + this.addCost(cost); + } + } + + public ActivatedManaAbilityImpl(final ActivatedManaAbilityImpl ability) { + super(ability); + this.netMana.addAll(ability.netMana); + this.undoPossible = ability.undoPossible; + } + + @Override + public boolean canActivate(UUID playerId, Game game) { + if (!controlsAbility(playerId, game)) { + return false; + } + //20091005 - 605.3a + return costs.canPay(this, sourceId, controllerId, game); + } + + /** + * Used to check the possible mana production to determine which spells + * and/or abilities can be used. (player.getPlayable()). + * + * @param game + * @return + */ + @Override + public List getNetMana(Game game) { + return netMana; + } + + /** + * Used to check if the ability itself defines mana types it can produce. + * + * @return + */ + @Override + public boolean definesMana() { + return netMana.size() > 0; + } + + public boolean isUndoPossible() { + return undoPossible; + } + + public void setUndoPossible(boolean undoPossible) { + this.undoPossible = undoPossible; + } + +} diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java index 488ab25a73b..398c1f27410 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java @@ -35,7 +35,7 @@ import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.choices.ChoiceColor; import mage.constants.ColoredManaSymbol; import mage.constants.TargetController; import mage.constants.Zone; @@ -50,7 +50,7 @@ import mage.players.Player; * * @author LevelX2 */ -public class AnyColorLandsProduceManaAbility extends ManaAbility { +public class AnyColorLandsProduceManaAbility extends ActivatedManaAbilityImpl { public AnyColorLandsProduceManaAbility(TargetController targetController) { super(Zone.BATTLEFIELD, new AnyColorLandsProduceManaEffect(targetController), new TapSourceCost()); @@ -91,7 +91,8 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Mana types = getManaTypes(game, source); - Choice choice = new ChoiceImpl(true); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); choice.setMessage("Pick a mana color"); if (types.getBlack() > 0) { choice.getChoices().add("Black"); @@ -157,8 +158,8 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { List lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); Mana types = new Mana(); for (Permanent land : lands) { - Abilities mana = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD); - for (ManaAbility ability : mana) { + Abilities mana = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD); + for (ActivatedManaAbilityImpl ability : mana) { if (!ability.equals(source) && ability.definesMana()) { for (Mana netMana : ability.getNetMana(game)) { types.add(netMana); diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java index 1b4b7f50950..2443d88abf6 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java @@ -33,7 +33,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.AddManaOfAnyColorEffect; import mage.constants.Zone; -public class AnyColorManaAbility extends ManaAbility { +public class AnyColorManaAbility extends ActivatedManaAbilityImpl { public AnyColorManaAbility() { this(new TapSourceCost()); } diff --git a/Mage/src/main/java/mage/abilities/mana/BasicManaAbility.java b/Mage/src/main/java/mage/abilities/mana/BasicManaAbility.java index d7872cd3a05..c2d8f04000f 100644 --- a/Mage/src/main/java/mage/abilities/mana/BasicManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/BasicManaAbility.java @@ -36,7 +36,7 @@ import mage.abilities.effects.common.ManaEffect; * * @author BetaSteward_at_googlemail.com */ -public abstract class BasicManaAbility extends ManaAbility { +public abstract class BasicManaAbility extends ActivatedManaAbilityImpl { public BasicManaAbility(ManaEffect effect) { super(Zone.BATTLEFIELD, effect, new TapSourceCost()); diff --git a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java index 0af29bb41bc..1f7244984a2 100644 --- a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java @@ -47,7 +47,7 @@ import mage.util.CardUtil; * * @author LevelX2 */ -public class CommanderColorIdentityManaAbility extends ManaAbility { +public class CommanderColorIdentityManaAbility extends ActivatedManaAbilityImpl { private FilterMana commanderMana; diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java index 46e0a7c052b..48eba56b018 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java @@ -44,7 +44,7 @@ import mage.game.Game; * * @author noxx */ -public class ConditionalAnyColorManaAbility extends ManaAbility { +public class ConditionalAnyColorManaAbility extends ActivatedManaAbilityImpl { private DynamicValue amount; diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java index 1dc01101566..df717ecdfa6 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java @@ -16,7 +16,7 @@ import mage.constants.Zone; * * @author LevelX2 */ -public class ConditionalColoredManaAbility extends ManaAbility { +public class ConditionalColoredManaAbility extends ActivatedManaAbilityImpl { public ConditionalColoredManaAbility(Mana mana, ConditionalManaBuilder manaBuilder) { this(new TapSourceCost(), mana, manaBuilder); diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java index d341e0143b0..8bf323b9d33 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java @@ -16,7 +16,7 @@ import mage.constants.Zone; * * @author LevelX2 */ -public class ConditionalColorlessManaAbility extends ManaAbility { +public class ConditionalColorlessManaAbility extends ActivatedManaAbilityImpl { public ConditionalColorlessManaAbility(int amount, ConditionalManaBuilder manaBuilder) { this(new TapSourceCost(), amount, manaBuilder); diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalManaAbility.java index af348854ca6..0ae113134e4 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalManaAbility.java @@ -41,7 +41,7 @@ import mage.game.Game; * @author LevelX2 */ -public class ConditionalManaAbility extends ManaAbility { +public class ConditionalManaAbility extends ActivatedManaAbilityImpl { ConditionalManaEffect conditionalManaEffect; diff --git a/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java b/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java index 15a44b71c3f..0412828a298 100644 --- a/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java @@ -41,7 +41,7 @@ import mage.game.Game; * * @author North */ -public class DynamicManaAbility extends ManaAbility { +public class DynamicManaAbility extends ActivatedManaAbilityImpl { private DynamicManaEffect manaEffect; private String rule; diff --git a/Mage/src/main/java/mage/abilities/mana/ManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ManaAbility.java index afb90a01d29..ea082299149 100644 --- a/Mage/src/main/java/mage/abilities/mana/ManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ManaAbility.java @@ -1,107 +1,33 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 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 -* provided with the distribution. -* -* 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 -* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR -* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -* 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 -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* 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 -* or implied, of BetaSteward_at_googlemail.com. -*/ - + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ package mage.abilities.mana; -import java.util.ArrayList; import java.util.List; -import java.util.UUID; import mage.Mana; -import mage.abilities.ActivatedAbilityImpl; -import mage.abilities.costs.Cost; -import mage.abilities.effects.common.ManaEffect; -import mage.constants.AbilityType; -import mage.constants.Zone; import mage.game.Game; /** * - * @author BetaSteward_at_googlemail.com + * @author LevelX2 */ -public abstract class ManaAbility extends ActivatedAbilityImpl { - - protected List netMana = new ArrayList<>(); - protected boolean undoPossible; - - public ManaAbility(Zone zone, ManaEffect effect, Cost cost) { - super(AbilityType.MANA, zone); - this.usesStack = false; - this.undoPossible = true; - if (effect != null) { - this.addEffect(effect); - } - if (cost != null) { - this.addCost(cost); - } - } - - public ManaAbility(final ManaAbility ability) { - super(ability); - this.netMana.addAll(ability.netMana); - this.undoPossible = ability.undoPossible; - } - - @Override - public boolean canActivate(UUID playerId, Game game) { - if (!controlsAbility(playerId, game)) { - return false; - } - //20091005 - 605.3a - return costs.canPay(this, sourceId, controllerId, game); - } +public interface ManaAbility { /** - * Used to check the possible mana production to determine - * which spells and/or abilities can be used. (player.getPlayable()). - * + * Used to check the possible mana production to determine which spells + * and/or abilities can be used. (player.getPlayable()). + * * @param game - * @return + * @return */ - public List getNetMana(Game game) { - return netMana; - } + List getNetMana(Game game); /** - * 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. * * @return */ - public boolean definesMana() { - return netMana.size() > 0; - } - - public boolean isUndoPossible() { - return undoPossible; - } - - public void setUndoPossible(boolean undoPossible) { - this.undoPossible = undoPossible; - } - + boolean definesMana(); } diff --git a/Mage/src/main/java/mage/abilities/mana/ManaOptions.java b/Mage/src/main/java/mage/abilities/mana/ManaOptions.java index 4c09adacad7..03e8bcd4ee6 100644 --- a/Mage/src/main/java/mage/abilities/mana/ManaOptions.java +++ b/Mage/src/main/java/mage/abilities/mana/ManaOptions.java @@ -54,7 +54,7 @@ public class ManaOptions extends ArrayList { } } - public void addMana(List abilities, Game game) { + public void addMana(List abilities, Game game) { if (isEmpty()) { this.add(new Mana()); } @@ -81,7 +81,7 @@ public class ManaOptions extends ArrayList { //perform a union of all existing options and the new options List copy = copy(); this.clear(); - for (ManaAbility ability : abilities) { + for (ActivatedManaAbilityImpl ability : abilities) { for (Mana netMana : ability.getNetMana(game)) { SkipAddMana: for (Mana mana : copy) { @@ -107,14 +107,14 @@ public class ManaOptions extends ArrayList { } } - public void addManaWithCost(List abilities, Game game) { + public void addManaWithCost(List abilities, Game game) { if (isEmpty()) { this.add(new Mana()); } if (!abilities.isEmpty()) { if (abilities.size() == 1) { //if there is only one mana option available add it to all the existing options - ManaAbility ability = abilities.get(0); + ActivatedManaAbilityImpl ability = abilities.get(0); List netManas = abilities.get(0).getNetMana(game); // no mana costs if (ability.getManaCosts().isEmpty()) { @@ -151,7 +151,7 @@ public class ManaOptions extends ArrayList { //perform a union of all existing options and the new options List copy = copy(); this.clear(); - for (ManaAbility ability : abilities) { + for (ActivatedManaAbilityImpl ability : abilities) { List netManas = ability.getNetMana(game); diff --git a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java index fdc58c9826c..6f78fabdce7 100644 --- a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java @@ -41,7 +41,7 @@ import mage.game.Game; * * @author BetaSteward_at_googlemail.com */ -public class SimpleManaAbility extends ManaAbility { +public class SimpleManaAbility extends ActivatedManaAbilityImpl { public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost) { super(zone, effect, cost); diff --git a/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java b/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java index f6f319a5ab3..4ef715e220d 100644 --- a/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java @@ -27,17 +27,25 @@ */ package mage.abilities.mana; +import java.util.ArrayList; +import java.util.List; +import mage.Mana; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DynamicManaEffect; import mage.abilities.effects.common.ManaEffect; import mage.constants.AbilityType; import mage.constants.Zone; +import mage.game.Game; /** * see 20110715 - 605.1b * * @author BetaSteward_at_googlemail.com */ -public abstract class TriggeredManaAbility extends TriggeredAbilityImpl { +public abstract class TriggeredManaAbility extends TriggeredAbilityImpl implements ManaAbility { + + protected List netMana = new ArrayList<>(); public TriggeredManaAbility(Zone zone, ManaEffect effect) { this(zone, effect, false); @@ -47,9 +55,48 @@ public abstract class TriggeredManaAbility extends TriggeredAbilityImpl { super(zone, effect, optional); this.usesStack = false; this.abilityType = AbilityType.MANA; + } public TriggeredManaAbility(final TriggeredManaAbility ability) { super(ability); + this.netMana.addAll(ability.netMana); + } + + /** + * Used to check the possible mana production to determine which spells + * and/or abilities can be used. (player.getPlayable()). + * + * @param game + * @return + */ + @Override + public List getNetMana(Game game) { + if (!getEffects().isEmpty()) { + Effect effect = getEffects().get(0); + if (effect != null && game != null) { + ArrayList newNetMana = new ArrayList<>(); + if (effect instanceof DynamicManaEffect) { + + // TODO: effects from replacement effects like Mana Reflection are not considered yet + // TODO: effects that need a X payment (e.g. Mage-Ring Network) return always 0 + newNetMana.add(((DynamicManaEffect) effect).computeMana(true, game, this)); + } else if (effect instanceof Effect) { + newNetMana.add(((ManaEffect) effect).getMana(game, this)); + } + return newNetMana; + } + } + return netMana; + } + + /** + * Used to check if the ability itself defines mana types it can produce. + * + * @return + */ + @Override + public boolean definesMana() { + return netMana.size() > 0; } } diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index 1bbf4b353d0..a67267fe398 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -38,7 +38,7 @@ import mage.abilities.AbilitiesImpl; import mage.abilities.Ability; import mage.abilities.PlayLandAbility; import mage.abilities.SpellAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.repository.PluginClassloaderRegistery; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; @@ -341,7 +341,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { @Override public List getMana() { List mana = new ArrayList<>(); - for (ManaAbility ability : this.abilities.getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : this.abilities.getActivatedManaAbilities(Zone.BATTLEFIELD)) { for (Mana netMana : ability.getNetMana(null)) { mana.add(netMana); } diff --git a/Mage/src/main/java/mage/cards/basiclands/BasicLand.java b/Mage/src/main/java/mage/cards/basiclands/BasicLand.java index f16b050a881..8e5ff7793dc 100644 --- a/Mage/src/main/java/mage/cards/basiclands/BasicLand.java +++ b/Mage/src/main/java/mage/cards/basiclands/BasicLand.java @@ -33,7 +33,7 @@ import java.util.UUID; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Rarity; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; /** @@ -42,7 +42,7 @@ import mage.cards.CardImpl; */ public abstract class BasicLand extends CardImpl { - public BasicLand(UUID ownerId, CardSetInfo setInfo, ManaAbility mana) { + public BasicLand(UUID ownerId, CardSetInfo setInfo, ActivatedManaAbilityImpl mana) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); this.supertype.add("Basic"); this.subtype.add(name); diff --git a/Mage/src/main/java/mage/choices/ChoiceColor.java b/Mage/src/main/java/mage/choices/ChoiceColor.java index 30208b8b7ec..55531613e8d 100644 --- a/Mage/src/main/java/mage/choices/ChoiceColor.java +++ b/Mage/src/main/java/mage/choices/ChoiceColor.java @@ -24,12 +24,10 @@ * 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 * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.choices; import java.util.ArrayList; - import mage.Mana; import mage.ObjectColor; @@ -40,6 +38,7 @@ import mage.ObjectColor; public class ChoiceColor extends ChoiceImpl { public static final ArrayList colorChoices = new ArrayList<>(); + static { colorChoices.add("Green"); colorChoices.add("Blue"); @@ -47,7 +46,7 @@ public class ChoiceColor extends ChoiceImpl { colorChoices.add("Red"); colorChoices.add("White"); } - + public ChoiceColor() { this(true); } @@ -93,7 +92,7 @@ public class ChoiceColor extends ChoiceImpl { } public Mana getMana(int amount) { - Mana mana = null; + Mana mana; if (getColor().isBlack()) { mana = Mana.BlackMana(amount); } else if (getColor().isBlue()) { @@ -104,6 +103,8 @@ public class ChoiceColor extends ChoiceImpl { mana = Mana.GreenMana(amount); } else if (getColor().isWhite()) { mana = Mana.WhiteMana(amount); + } else { + mana = Mana.ColorlessMana(amount); } return mana; } @@ -119,6 +120,8 @@ public class ChoiceColor extends ChoiceImpl { mana.increaseGreen(); } else if (getColor().isWhite()) { mana.increaseWhite(); + } else { + mana.increaseColorless(); } } } diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index a4c11c54fd6..5171c9d1a79 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -76,7 +76,7 @@ import mage.abilities.keyword.InfectAbility; import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.ProtectionAbility; import mage.abilities.keyword.ShroudAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ManaOptions; import mage.actions.MageDrawAction; import mage.cards.Card; @@ -1099,7 +1099,7 @@ public abstract class PlayerImpl implements Player, Serializable { return true; } - protected boolean playManaAbility(ManaAbility ability, Game game) { + protected boolean playManaAbility(ActivatedManaAbilityImpl ability, Game game) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getId(), ability.getSourceId(), playerId))) { int bookmark = game.bookmarkState(); if (ability.activate(game, false)) { @@ -1197,7 +1197,7 @@ public abstract class PlayerImpl implements Player, Serializable { result = specialAction((SpecialAction) ability.copy(), game); break; case MANA: - result = playManaAbility((ManaAbility) ability.copy(), game); + result = playManaAbility((ActivatedManaAbilityImpl) ability.copy(), game); break; case SPELL: if (ability instanceof FlashbackAbility) { @@ -1294,7 +1294,7 @@ public abstract class PlayerImpl implements Player, Serializable { if (canUse || ability.getAbilityType().equals(AbilityType.SPECIAL_ACTION)) { if (ability.getZone().match(zone)) { if (ability instanceof ActivatedAbility) { - if (ability instanceof ManaAbility) { + if (ability instanceof ActivatedManaAbilityImpl) { if (((ActivatedAbility) ability).canActivate(playerId, game)) { useable.put(ability.getId(), (ActivatedAbility) ability); } @@ -1391,10 +1391,10 @@ public abstract class PlayerImpl implements Player, Serializable { } } - protected LinkedHashMap getUseableManaAbilities(MageObject object, Zone zone, Game game) { - LinkedHashMap useable = new LinkedHashMap<>(); + protected LinkedHashMap getUseableManaAbilities(MageObject object, Zone zone, Game game) { + LinkedHashMap useable = new LinkedHashMap<>(); boolean canUse = !(object instanceof Permanent) || ((Permanent) object).canUseActivatedAbilities(game); - for (ManaAbility ability : object.getAbilities().getManaAbilities(zone)) { + for (ActivatedManaAbilityImpl ability : object.getAbilities().getActivatedManaAbilities(zone)) { if (canUse || ability.getAbilityType().equals(AbilityType.SPECIAL_ACTION)) { if (ability.canActivate(playerId, game)) { useable.put(ability.getId(), ability); @@ -2376,14 +2376,14 @@ public abstract class PlayerImpl implements Player, Serializable { public ManaOptions getManaAvailable(Game game) { ManaOptions available = new ManaOptions(); - List> sourceWithoutManaCosts = new ArrayList<>(); - List> sourceWithCosts = new ArrayList<>(); + List> sourceWithoutManaCosts = new ArrayList<>(); + List> sourceWithCosts = new ArrayList<>(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { Boolean canUse = null; boolean canAdd = false; boolean withCost = false; - Abilities manaAbilities = permanent.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game); - for (ManaAbility ability : manaAbilities) { + Abilities manaAbilities = permanent.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game); + for (ActivatedManaAbilityImpl ability : manaAbilities) { if (canUse == null) { canUse = permanent.canUseActivatedAbilities(game); } @@ -2404,10 +2404,10 @@ public abstract class PlayerImpl implements Player, Serializable { } } - for (Abilities manaAbilities : sourceWithoutManaCosts) { + for (Abilities manaAbilities : sourceWithoutManaCosts) { available.addMana(manaAbilities, game); } - for (Abilities manaAbilities : sourceWithCosts) { + for (Abilities manaAbilities : sourceWithCosts) { available.addManaWithCost(manaAbilities, game); } return available; @@ -2419,7 +2419,7 @@ public abstract class PlayerImpl implements Player, Serializable { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { Boolean canUse = null; boolean canAdd = false; - for (ManaAbility ability : permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD)) { if (!ability.getManaCosts().isEmpty()) { canAdd = false; break; @@ -2437,7 +2437,7 @@ public abstract class PlayerImpl implements Player, Serializable { } for (Card card : getHand().getCards(game)) { boolean canAdd = false; - for (ManaAbility ability : card.getAbilities(game).getManaAbilities(Zone.HAND)) { + for (ActivatedManaAbilityImpl ability : card.getAbilities(game).getActivatedManaAbilities(Zone.HAND)) { if (!ability.getManaCosts().isEmpty()) { canAdd = false; break; @@ -2458,7 +2458,7 @@ public abstract class PlayerImpl implements Player, Serializable { List result = new ArrayList<>(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { Boolean canUse = null; - for (ManaAbility ability : permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { + for (ActivatedManaAbilityImpl ability : permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD)) { if (canUse == null) { canUse = permanent.canUseActivatedAbilities(game); } @@ -2480,7 +2480,7 @@ public abstract class PlayerImpl implements Player, Serializable { * @return */ protected boolean canPlay(ActivatedAbility ability, ManaOptions available, MageObject sourceObject, Game game) { - if (!(ability instanceof ManaAbility)) { + if (!(ability instanceof ActivatedManaAbilityImpl)) { ActivatedAbility copy = ability.copy(); copy.setCheckPlayableMode(); // prevents from endless loops for asking player to use effects by checking this mode if (!copy.canActivate(playerId, game)) { diff --git a/Mage/src/main/java/mage/util/ManaUtil.java b/Mage/src/main/java/mage/util/ManaUtil.java index 0f753f6c7d7..b617d82a04b 100644 --- a/Mage/src/main/java/mage/util/ManaUtil.java +++ b/Mage/src/main/java/mage/util/ManaUtil.java @@ -16,7 +16,7 @@ import mage.abilities.mana.BasicManaAbility; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; -import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.Card; @@ -56,10 +56,10 @@ public class ManaUtil { * @return List of mana abilities permanent may produce and are reasonable * for unpaid mana */ - public static LinkedHashMap tryToAutoPay(ManaCost unpaid, LinkedHashMap useableAbilities) { + public static LinkedHashMap tryToAutoPay(ManaCost unpaid, LinkedHashMap useableAbilities) { // first check if we have only basic mana abilities - for (ManaAbility ability : useableAbilities.values()) { + for (ActivatedManaAbilityImpl ability : useableAbilities.values()) { if (!(ability instanceof BasicManaAbility)) { // return map as-is without any modification return useableAbilities; @@ -130,12 +130,12 @@ public class ManaUtil { return false; } - private static LinkedHashMap getManaAbilitiesUsingManaSymbols(LinkedHashMap useableAbilities, ManaSymbols symbols, Mana unpaidMana) { + private static LinkedHashMap getManaAbilitiesUsingManaSymbols(LinkedHashMap useableAbilities, ManaSymbols symbols, Mana unpaidMana) { Set countColored = new HashSet<>(); - ManaAbility chosenManaAbility = null; - ManaAbility chosenManaAbilityForHybrid; - for (ManaAbility ability : useableAbilities.values()) { + ActivatedManaAbilityImpl chosenManaAbility = null; + ActivatedManaAbilityImpl chosenManaAbilityForHybrid; + for (ActivatedManaAbilityImpl ability : useableAbilities.values()) { chosenManaAbility = getManaAbility(symbols, countColored, chosenManaAbility, ability); chosenManaAbilityForHybrid = checkRedMana(symbols, countColored, ability); @@ -181,7 +181,7 @@ public class ManaUtil { // we got another chance for auto pay if (temp.size() == 1) { - for (ManaAbility ability : useableAbilities.values()) { + for (ActivatedManaAbilityImpl ability : useableAbilities.values()) { chosenManaAbility = getManaAbility(symbols, countColored, chosenManaAbility, ability); } return replace(useableAbilities, chosenManaAbility); @@ -195,7 +195,7 @@ public class ManaUtil { return replace(useableAbilities, chosenManaAbility); } - private static ManaAbility getManaAbility(ManaSymbols symbols, Set countColored, ManaAbility chosenManaAbility, ManaAbility ability) { + private static ActivatedManaAbilityImpl getManaAbility(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl chosenManaAbility, ActivatedManaAbilityImpl ability) { if (ability instanceof RedManaAbility && symbols.contains(ManaSymbol.R)) { chosenManaAbility = ability; countColored.add(ManaSymbol.R); @@ -235,8 +235,8 @@ public class ManaUtil { return count; } - private static ManaAbility checkBlackMana(ManaSymbols symbols, Set countColored, ManaAbility ability) { - ManaAbility chosenManaAbilityForHybrid = null; + private static ActivatedManaAbilityImpl checkBlackMana(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl ability) { + ActivatedManaAbilityImpl chosenManaAbilityForHybrid = null; if (ability instanceof BlackManaAbility) { if (symbols.contains(ManaSymbol.HYBRID_BR)) { chosenManaAbilityForHybrid = ability; @@ -256,8 +256,8 @@ public class ManaUtil { return chosenManaAbilityForHybrid; } - private static ManaAbility checkRedMana(ManaSymbols symbols, Set countColored, ManaAbility ability) { - ManaAbility chosenManaAbilityForHybrid = null; + private static ActivatedManaAbilityImpl checkRedMana(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl ability) { + ActivatedManaAbilityImpl chosenManaAbilityForHybrid = null; if (ability instanceof RedManaAbility) { if (symbols.contains(ManaSymbol.HYBRID_BR)) { chosenManaAbilityForHybrid = ability; @@ -276,8 +276,8 @@ public class ManaUtil { return chosenManaAbilityForHybrid; } - private static ManaAbility checkBlueMana(ManaSymbols symbols, Set countColored, ManaAbility ability) { - ManaAbility chosenManaAbilityForHybrid = null; + private static ActivatedManaAbilityImpl checkBlueMana(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl ability) { + ActivatedManaAbilityImpl chosenManaAbilityForHybrid = null; if (ability instanceof BlueManaAbility) { if (symbols.contains(ManaSymbol.HYBRID_UB)) { chosenManaAbilityForHybrid = ability; @@ -296,8 +296,8 @@ public class ManaUtil { return chosenManaAbilityForHybrid; } - private static ManaAbility checkWhiteMana(ManaSymbols symbols, Set countColored, ManaAbility ability) { - ManaAbility chosenManaAbilityForHybrid = null; + private static ActivatedManaAbilityImpl checkWhiteMana(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl ability) { + ActivatedManaAbilityImpl chosenManaAbilityForHybrid = null; if (ability instanceof WhiteManaAbility) { if (symbols.contains(ManaSymbol.HYBRID_WU)) { chosenManaAbilityForHybrid = ability; @@ -316,8 +316,8 @@ public class ManaUtil { return chosenManaAbilityForHybrid; } - private static ManaAbility checkGreenMana(ManaSymbols symbols, Set countColored, ManaAbility ability) { - ManaAbility chosenManaAbilityForHybrid = null; + private static ActivatedManaAbilityImpl checkGreenMana(ManaSymbols symbols, Set countColored, ActivatedManaAbilityImpl ability) { + ActivatedManaAbilityImpl chosenManaAbilityForHybrid = null; if (ability instanceof GreenManaAbility) { if (symbols.contains(ManaSymbol.HYBRID_GW)) { chosenManaAbilityForHybrid = ability; @@ -344,13 +344,13 @@ public class ManaUtil { * @param useableAbilities * @return */ - private static LinkedHashMap getManaAbilitiesUsingMana(ManaCost unpaid, LinkedHashMap useableAbilities) { + private static LinkedHashMap getManaAbilitiesUsingMana(ManaCost unpaid, LinkedHashMap useableAbilities) { Mana mana = unpaid.getMana(); int countColorfull = 0; int countColorless = 0; - ManaAbility chosenManaAbility = null; - for (ManaAbility ability : useableAbilities.values()) { + ActivatedManaAbilityImpl chosenManaAbility = null; + for (ActivatedManaAbilityImpl ability : useableAbilities.values()) { if (ability instanceof RedManaAbility && mana.contains(Mana.RedMana(1))) { chosenManaAbility = ability; countColorfull++; @@ -392,7 +392,7 @@ public class ManaUtil { return replace(useableAbilities, chosenManaAbility); } - private static LinkedHashMap replace(LinkedHashMap useableAbilities, ManaAbility chosenManaAbility) { + private static LinkedHashMap replace(LinkedHashMap useableAbilities, ActivatedManaAbilityImpl chosenManaAbility) { // modify the map with the chosen mana ability useableAbilities.clear(); useableAbilities.put(chosenManaAbility.getId(), chosenManaAbility);