cleanup AbilityType for easier check that an ability is an activated ability (#12153)

* cleanup AbilityType

* further cleanup

* cleanup instanceof

* tweak formatting

* rework Rex

* fix mistake in PlayerImpl

* cleanup 'instanceof' for 'ActivatedManaAbilityImpl'
This commit is contained in:
Susucre 2024-05-04 04:13:34 +02:00 committed by GitHub
parent 62cc49ffa3
commit 85cad4ff1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
118 changed files with 486 additions and 574 deletions

View file

@ -280,9 +280,9 @@ public class CardPanelRenderModeImage extends CardPanel {
// Ability icon // Ability icon
if (newGameCard.isAbility()) { if (newGameCard.isAbility()) {
if (newGameCard.getAbilityType() == AbilityType.TRIGGERED) { if (newGameCard.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability"); setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability");
} else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED) { } else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED_NONMANA) {
setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability"); setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability");
} }
} }

View file

@ -425,9 +425,9 @@ public abstract class CardRenderer {
// Get a string representing the type line // Get a string representing the type line
protected String getCardTypeLine() { protected String getCardTypeLine() {
if (cardView.isAbility()) { if (cardView.isAbility()) {
if (cardView.getAbilityType() == AbilityType.TRIGGERED) { if (cardView.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
return "Triggered Ability"; return "Triggered Ability";
} else if (cardView.getAbilityType() == AbilityType.ACTIVATED) { } else if (cardView.getAbilityType() == AbilityType.ACTIVATED_NONMANA) {
return "Activated Ability"; return "Activated Ability";
} else if (cardView.getAbilityType() == null) { } else if (cardView.getAbilityType() == null) {
// TODO: Triggered abilities waiting to be put onto the stack have abilityType = null. Figure out why // TODO: Triggered abilities waiting to be put onto the stack have abilityType = null. Figure out why

View file

@ -12,7 +12,6 @@ import mage.abilities.keyword.*;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.Cards; import mage.cards.Cards;
import mage.choices.Choice; import mage.choices.Choice;
import mage.constants.AbilityType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.RangeOfInfluence; import mage.constants.RangeOfInfluence;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -1082,7 +1081,7 @@ public class ComputerPlayer6 extends ComputerPlayer {
private boolean checkForRepeatedAction(Game sim, SimulationNode2 node, Ability action, UUID playerId) { private boolean checkForRepeatedAction(Game sim, SimulationNode2 node, Ability action, UUID playerId) {
// pass or casting two times a spell multiple times on hand is ok // pass or casting two times a spell multiple times on hand is ok
if (action instanceof PassAbility || action instanceof SpellAbility || action.getAbilityType() == AbilityType.MANA) { if (action instanceof PassAbility || action instanceof SpellAbility || action.isManaAbility()) {
return false; return false;
} }
int newVal = GameStateEvaluator2.evaluate(playerId, sim).getTotalScore(); int newVal = GameStateEvaluator2.evaluate(playerId, sim).getTotalScore();

View file

@ -11,7 +11,6 @@ import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.costs.mana.VariableManaCost;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.AbilityType;
import mage.game.Game; import mage.game.Game;
import mage.game.combat.Combat; import mage.game.combat.Combat;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
@ -100,7 +99,7 @@ public final class SimulatedPlayer2 extends ComputerPlayer {
List<ActivatedAbility> playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer); List<ActivatedAbility> playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer);
playables = filterAbilities(game, playables, suggested); playables = filterAbilities(game, playables, suggested);
for (ActivatedAbility ability : playables) { for (ActivatedAbility ability : playables) {
if (ability.getAbilityType() == AbilityType.MANA) { if (ability.isManaAbility()) {
continue; continue;
} }
List<Ability> options = game.getPlayer(playerId).getPlayableOptions(ability, game); List<Ability> options = game.getPlayer(playerId).getPlayableOptions(ability, game);

View file

@ -117,7 +117,7 @@ public class ComputerPlayer extends PlayerImpl {
if (hand.size() < 6 if (hand.size() < 6
|| isTestsMode() // ignore mulligan in tests || isTestsMode() // ignore mulligan in tests
|| game.getClass().getName().contains("Momir") // ignore mulligan in Momir games || game.getClass().getName().contains("Momir") // ignore mulligan in Momir games
) { ) {
return false; return false;
} }
Set<Card> lands = hand.getCards(new FilterLandCard(), game); Set<Card> lands = hand.getCards(new FilterLandCard(), game);
@ -1498,7 +1498,7 @@ public class ComputerPlayer extends PlayerImpl {
// TODO: wtf?! change to player.getPlayable // TODO: wtf?! change to player.getPlayable
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) {
for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) {
if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(playerId, game).canActivate()) { if (!ability.isManaActivatedAbility() && ability.canActivate(playerId, game).canActivate()) {
if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) { if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) {
continue; continue;
} }
@ -2220,7 +2220,7 @@ public class ComputerPlayer extends PlayerImpl {
@Override @Override
public List<Integer> getMultiAmountWithIndividualConstraints(Outcome outcome, List<MultiAmountMessage> messages, public List<Integer> getMultiAmountWithIndividualConstraints(Outcome outcome, List<MultiAmountMessage> messages,
int min, int max, MultiAmountType type, Game game) { int min, int max, MultiAmountType type, Game game) {
log.debug("getMultiAmount"); log.debug("getMultiAmount");
int needCount = messages.size(); int needCount = messages.size();
@ -2767,7 +2767,7 @@ public class ComputerPlayer extends PlayerImpl {
} }
protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, Ability source, FilterPermanent filter, Game game, Target target, protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, Ability source, FilterPermanent filter, Game game, Target target,
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) { List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
// searching for most valuable/powerfull permanents // searching for most valuable/powerfull permanents
goodList.clear(); goodList.clear();
badList.clear(); badList.clear();

View file

@ -18,6 +18,8 @@ import mage.cards.decks.Deck;
import mage.choices.Choice; import mage.choices.Choice;
import mage.choices.ChoiceImpl; import mage.choices.ChoiceImpl;
import mage.constants.*; import mage.constants.*;
import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterAttackingCreature; import mage.filter.common.FilterAttackingCreature;
import mage.filter.common.FilterBlockingCreature; import mage.filter.common.FilterBlockingCreature;
@ -55,9 +57,6 @@ import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
/** /**
* Human: server side logic to exchange game data between server app and another player's app * Human: server side logic to exchange game data between server app and another player's app
* *
@ -1165,7 +1164,7 @@ public class HumanPlayer extends PlayerImpl {
return false; return false;
} }
if (controllingPlayer.getUserData().isPassPriorityActivation() if (controllingPlayer.getUserData().isPassPriorityActivation()
&& getJustActivatedType() == AbilityType.ACTIVATED) { && getJustActivatedType().isNonManaActivatedAbility()) {
setJustActivatedType(null); setJustActivatedType(null);
pass(game); pass(game);
return false; return false;
@ -2365,7 +2364,7 @@ public class HumanPlayer extends PlayerImpl {
} }
if (userData.isUseFirstManaAbility() && object instanceof Permanent && object.isLand(game)) { if (userData.isUseFirstManaAbility() && object instanceof Permanent && object.isLand(game)) {
ActivatedAbility ability = abilities.values().iterator().next(); ActivatedAbility ability = abilities.values().iterator().next();
if (ability instanceof ActivatedManaAbilityImpl) { if (ability.isActivatedAbility() && ability.isManaAbility()) {
activateAbility(ability, game); activateAbility(ability, game);
return; return;
} }
@ -2427,7 +2426,7 @@ public class HumanPlayer extends PlayerImpl {
} }
// hide on mana activate and show all other // hide on mana activate and show all other
return ability instanceof ActivatedManaAbilityImpl; return ability.isManaActivatedAbility();
} }
return true; return true;
} }
@ -2620,7 +2619,7 @@ public class HumanPlayer extends PlayerImpl {
} }
// triggered abilities can't be skipped by cancel or wrong answer // triggered abilities can't be skipped by cancel or wrong answer
if (source.getAbilityType() != AbilityType.TRIGGERED) { if (!source.isTriggeredAbility()) {
done = true; done = true;
} }
} }
@ -2788,7 +2787,9 @@ public class HumanPlayer extends PlayerImpl {
holdingPriority = false; holdingPriority = false;
break; break;
case TOGGLE_RECORD_MACRO: case TOGGLE_RECORD_MACRO:
if (true) return; // TODO: macro unsupported in current version if (true) {
return; // TODO: macro unsupported in current version
}
if (recordingMacro) { if (recordingMacro) {
logger.debug("Finished Recording Macro"); logger.debug("Finished Recording Macro");
activatingMacro = true; activatingMacro = true;

View file

@ -4,7 +4,6 @@ import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -93,8 +92,7 @@ class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl {
} }
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
return ability.isPresent() return ability.isPresent() && !ability.get().isManaActivatedAbility();
&& !(ability.get() instanceof ActivatedManaAbilityImpl);
} }
return false; return false;
} }

View file

@ -82,7 +82,7 @@ class AbolethSpawnTriggeredAbility extends TriggeredAbilityImpl {
return false; // only creatures entering under opponent's control return false; // only creatures entering under opponent's control
} }
Ability stackAbility = stackObject.getStackAbility(); Ability stackAbility = stackObject.getStackAbility();
if (!(stackAbility instanceof TriggeredAbility)) { if (!stackAbility.isTriggeredAbility()) {
return false; return false;
} }
GameEvent triggerEvent = ((TriggeredAbility) stackAbility).getTriggerEvent(); GameEvent triggerEvent = ((TriggeredAbility) stackAbility).getTriggerEvent();

View file

@ -107,7 +107,7 @@ class AgathaOfTheVileCauldronEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
// Activated abilities you control // Activated abilities you control
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED if (!abilityToModify.getAbilityType().isActivatedAbility()
|| !abilityToModify.isControlledBy(source.getControllerId())) { || !abilityToModify.isControlledBy(source.getControllerId())) {
return false; return false;
} }

View file

@ -1,7 +1,6 @@
package mage.cards.a; package mage.cards.a;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
@ -132,7 +131,7 @@ class AgathasSoulCauldronAbilityEffect extends ContinuousEffectImpl {
.stream() .stream()
.map(card -> card.getAbilities(game)) .map(card -> card.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance) .filter(Ability::isActivatedAbility)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
if (abilities.isEmpty()) { if (abilities.isEmpty()) {
return false; return false;

View file

@ -2,7 +2,6 @@ package mage.cards.a;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.SacrificeTargetCost;
@ -107,9 +106,7 @@ class AngelOfJubilationSacrificeFilterEffect extends CostModificationEffectImpl
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return (abilityToModify.isActivatedAbility() || abilityToModify.getAbilityType() == AbilityType.SPELL)
return (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|| abilityToModify instanceof SpellAbility)
&& game.getState().getPlayersInRange(source.getControllerId(), game).contains(abilityToModify.getControllerId()); && game.getState().getPlayersInRange(source.getControllerId(), game).contains(abilityToModify.getControllerId());
} }

View file

@ -1,6 +1,5 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -9,17 +8,18 @@ import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.SpellsCostIncreasingAllEffect; import mage.abilities.effects.common.cost.SpellsCostIncreasingAllEffect;
import mage.constants.*;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.ChosenNamePredicate; import mage.filter.predicate.mageobject.ChosenNamePredicate;
import mage.game.Game; import mage.game.Game;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.UUID;
/** /**
*
* @author weirddan455 * @author weirddan455
*/ */
public final class AnointedPeacekeeper extends CardImpl { public final class AnointedPeacekeeper extends CardImpl {
@ -88,7 +88,7 @@ class AnointedPeacekeeperEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED) { if (!abilityToModify.getAbilityType().isNonManaActivatedAbility()) {
return false; return false;
} }
MageObject activatedSource = game.getObject(abilityToModify.getSourceId()); MageObject activatedSource = game.getObject(abilityToModify.getSourceId());

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.SacrificeCost; import mage.abilities.costs.SacrificeCost;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -77,7 +76,7 @@ class AshnodTheUncaringTriggeredAbility extends TriggeredAbilityImpl {
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null if (stackAbility == null
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl || stackAbility.getStackAbility().isManaActivatedAbility()
|| stackAbility || stackAbility
.getStackAbility() .getStackAbility()
.getCosts() .getCosts()

View file

@ -13,6 +13,7 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ManaCondition; import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.game.Game; import mage.game.Game;
@ -76,15 +77,14 @@ class AutomatedArtificerManaCondition extends ManaCondition {
if (source == null || source.isActivated()) { if (source == null || source.isActivated()) {
return false; return false;
} }
switch (source.getAbilityType()) { if (source.isActivatedAbility()) {
case MANA: return true;
case ACTIVATED: }
return true; if (source.getAbilityType() == AbilityType.SPELL) {
case SPELL: if (source instanceof SpellAbility) {
if (source instanceof SpellAbility) { MageObject object = game.getObject(source);
MageObject object = game.getObject(source); return object != null && object.isArtifact(game);
return object != null && object.isArtifact(game); }
}
} }
return false; return false;
} }

View file

@ -8,7 +8,6 @@ import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -16,9 +15,9 @@ import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.stack.StackAbility; import mage.game.stack.StackAbility;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID; import java.util.UUID;
import mage.target.common.TargetControlledCreaturePermanent;
/** /**
* @author TheElk801 * @author TheElk801
@ -79,7 +78,7 @@ class BattlemagesBracersTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
getEffects().setValue("stackObject", stackAbility); getEffects().setValue("stackObject", stackAbility);

View file

@ -2,7 +2,6 @@ package mage.cards.b;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -73,7 +72,7 @@ class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
if (controller == null) { if (controller == null) {
return false; return false;
} }
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1); int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
if (reduceMax <= 0) { if (reduceMax <= 0) {
return true; return true;
} }
@ -84,9 +83,7 @@ class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED if (!abilityToModify.getAbilityType().isActivatedAbility()) {
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|| !(abilityToModify instanceof ActivatedAbility))) {
return false; return false;
} }
//Activated abilities of creatures you control //Activated abilities of creatures you control

View file

@ -1,31 +1,24 @@
package mage.cards.b; package mage.cards.b;
import java.util.Set;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType; import mage.constants.*;
import mage.constants.CardType; import mage.filter.FilterCard;
import mage.constants.CostModificationType; import mage.game.Game;
import mage.constants.Duration; import mage.game.permanent.Permanent;
import mage.constants.Outcome; import mage.players.Player;
import mage.util.CardUtil;
import java.util.Set;
import java.util.UUID;
/** /**
*
* @author @stwalsh4118 * @author @stwalsh4118
*/ */
public final class BladegraftAspirant extends CardImpl { public final class BladegraftAspirant extends CardImpl {
@ -39,7 +32,7 @@ public final class BladegraftAspirant extends CardImpl {
public BladegraftAspirant(UUID ownerId, CardSetInfo setInfo) { public BladegraftAspirant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.subtype.add(SubType.PHYREXIAN); this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -52,7 +45,7 @@ public final class BladegraftAspirant extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1))); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1)));
// Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate. // Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.
this.addAbility(new SimpleStaticAbility(new BladegraftAspirantCostReductionEffect())); this.addAbility(new SimpleStaticAbility(new BladegraftAspirantCostReductionEffect()));
} }
@ -71,7 +64,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
private static final String effectText = "Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate."; private static final String effectText = "Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.";
BladegraftAspirantCostReductionEffect() { BladegraftAspirantCostReductionEffect() {
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST); super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
staticText = effectText; staticText = effectText;
} }
@ -86,7 +79,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
if (controller == null) { if (controller == null) {
return false; return false;
} }
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0); int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0);
if (reduceMax <= 0) { if (reduceMax <= 0) {
return true; return true;
} }
@ -97,15 +90,13 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED if (!abilityToModify.getAbilityType().isActivatedAbility()) {
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|| !(abilityToModify instanceof ActivatedAbility))) {
return false; return false;
} }
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
if(!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) { if (!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) {
return false; return false;
} }

View file

@ -1,9 +1,6 @@
package mage.cards.b; package mage.cards.b;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -11,20 +8,17 @@ import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
import mage.constants.Zone;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BloodSun extends CardImpl { public final class BloodSun extends CardImpl {
@ -73,9 +67,9 @@ class BloodSunEffect extends ContinuousEffectImpl {
switch (layer) { switch (layer) {
case AbilityAddingRemovingEffects_6: case AbilityAddingRemovingEffects_6:
List<Ability> toRemove = new ArrayList<>(); List<Ability> toRemove = new ArrayList<>();
permanent.getAbilities().forEach(a -> { permanent.getAbilities().forEach(ability -> {
if (a.getAbilityType() != AbilityType.MANA) { if (!ability.getAbilityType().isManaAbility()) {
toRemove.add(a); toRemove.add(ability);
} }
}); });
permanent.removeAbilities(toRemove, source.getSourceId(), game); permanent.removeAbilities(toRemove, source.getSourceId(), game);

View file

@ -2,7 +2,6 @@ package mage.cards.b;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
@ -25,7 +24,6 @@ import mage.util.CardUtil;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author Susucr * @author Susucr
*/ */
public final class BlossomingTortoise extends CardImpl { public final class BlossomingTortoise extends CardImpl {
@ -38,7 +36,7 @@ public final class BlossomingTortoise extends CardImpl {
public BlossomingTortoise(UUID ownerId, CardSetInfo setInfo) { public BlossomingTortoise(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.subtype.add(SubType.TURTLE); this.subtype.add(SubType.TURTLE);
this.power = new MageInt(3); this.power = new MageInt(3);
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
@ -121,7 +119,7 @@ class BlossomingTortoiseCostReductionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!(abilityToModify instanceof ActivatedAbility)) { if (!abilityToModify.isActivatedAbility()) {
return false; return false;
} }
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game); Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);

View file

@ -1,24 +1,23 @@
package mage.cards.b; package mage.cards.b;
import java.util.Optional; import mage.abilities.Ability;
import java.util.UUID;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl; import java.util.Optional;
import mage.cards.CardSetInfo; import java.util.UUID;
/** /**
*
* @author weirddan455 * @author weirddan455
*/ */
public final class BoundInGold extends CardImpl { public final class BoundInGold extends CardImpl {
@ -90,7 +89,7 @@ class BoundInGoldEffect extends ContinuousRuleModifyingEffectImpl {
case ACTIVATE_ABILITY: case ACTIVATE_ABILITY:
if (enchantment.isAttachedTo(event.getSourceId())) { if (enchantment.isAttachedTo(event.getSourceId())) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
return ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA; return ability.isPresent() && ability.get().isNonManaActivatedAbility();
} }
} }
} }

View file

@ -1,29 +1,22 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.AbilityType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author L_J * @author L_J
*/ */
public final class BrutalSuppression extends CardImpl { public final class BrutalSuppression extends CardImpl {
@ -48,12 +41,14 @@ public final class BrutalSuppression extends CardImpl {
class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl { class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land"); private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land");
static{
static {
filter.add(CardType.LAND.getPredicate()); filter.add(CardType.LAND.getPredicate());
} }
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels"); private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
static{
static {
filter2.add(SubType.REBEL.getPredicate()); filter2.add(SubType.REBEL.getPredicate());
filter.add(TokenPredicate.FALSE); filter.add(TokenPredicate.FALSE);
} }
@ -75,7 +70,7 @@ class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || abilityToModify.getAbilityType() == AbilityType.MANA) { if (abilityToModify.isActivatedAbility()){
Permanent rebelPermanent = game.getPermanent(abilityToModify.getSourceId()); Permanent rebelPermanent = game.getPermanent(abilityToModify.getSourceId());
if (rebelPermanent != null) { if (rebelPermanent != null) {
return filter2.match(rebelPermanent, game); return filter2.match(rebelPermanent, game);

View file

@ -7,13 +7,11 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.stack.StackAbility; import mage.game.stack.StackAbility;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
@ -68,7 +66,7 @@ class BurningTreeShamanTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility != null && stackAbility.getAbilityType() == AbilityType.ACTIVATED) { if (stackAbility != null && stackAbility.isNonManaActivatedAbility()) {
for (Effect effect : getEffects()) { for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId())); effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
} }

View file

@ -1,7 +1,6 @@
package mage.cards.c; package mage.cards.c;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.condition.common.ControlYourCommanderCondition;
@ -76,7 +75,7 @@ class ConvergenceOfDominionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return ControlYourCommanderCondition.instance.apply(game, source) return ControlYourCommanderCondition.instance.apply(game, source)
&& abilityToModify instanceof ActivatedAbility && abilityToModify.isActivatedAbility()
&& game.getState().getZone(abilityToModify.getSourceId()) == Zone.GRAVEYARD; && game.getState().getZone(abilityToModify.getSourceId()) == Zone.GRAVEYARD;
} }

View file

@ -1,24 +1,23 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.stack.StackAbility; import mage.game.stack.StackAbility;
import java.util.UUID;
/** /**
*
* @author spjspj * @author spjspj
*/ */
public final class CrackdownConstruct extends CardImpl { public final class CrackdownConstruct extends CardImpl {
@ -71,9 +70,7 @@ class CrackdownConstructTriggeredAbility extends TriggeredAbilityImpl {
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (source != null && (source.isArtifact(game) || source.isCreature(game))) { if (source != null && (source.isArtifact(game) || source.isCreature(game))) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { return !stackAbility.getStackAbility().isManaActivatedAbility();
return true;
}
} }
} }
return false; return false;

View file

@ -1,6 +1,5 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.ConditionalMana; import mage.ConditionalMana;
import mage.MageInt; import mage.MageInt;
import mage.Mana; import mage.Mana;
@ -20,12 +19,13 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ManaCondition; import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import java.util.UUID;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -94,12 +94,9 @@ class CrypticTrilobiteManaCondition extends ManaCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source != null && !source.isActivated()) { return source != null
// ex: SimpleManaAbility is an ACTIVATED ability, but it is categorized as a MANA ability && !source.isActivated()
return source.getAbilityType() == AbilityType.MANA && source.isActivatedAbility();
|| source.getAbilityType() == AbilityType.ACTIVATED;
}
return false;
} }
@Override @Override

View file

@ -1,13 +1,11 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.ConditionalMana; import mage.ConditionalMana;
import mage.MageInt; import mage.MageInt;
import mage.MageObject; import mage.MageObject;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.SpellAbility; import mage.abilities.SpellAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
@ -24,14 +22,15 @@ import mage.constants.SubType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class CultivatorDrone extends CardImpl { public final class CultivatorDrone extends CardImpl {
public CultivatorDrone(UUID ownerId, CardSetInfo setInfo) { public CultivatorDrone(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.ELDRAZI); this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.DRONE); this.subtype.add(SubType.DRONE);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -85,7 +84,7 @@ class CultivatorDroneManaCondition extends ManaCondition implements Condition {
return true; return true;
} }
} }
if (source instanceof ActivatedAbility && !source.isActivated()) { if (source.isActivatedAbility() && !source.isActivated()) {
Permanent object = game.getPermanentOrLKIBattlefield(source.getSourceId()); Permanent object = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (object != null && object.getColor(game).isColorless()) { if (object != null && object.getColor(game).isColorless()) {
return true; return true;

View file

@ -5,7 +5,6 @@ import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -22,13 +21,12 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class DampingMatrix extends CardImpl { public final class DampingMatrix extends CardImpl {
public DampingMatrix(UUID ownerId, CardSetInfo setInfo) { public DampingMatrix(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// Activated abilities of artifacts and creatures can't be activated unless they're mana abilities. // Activated abilities of artifacts and creatures can't be activated unless they're mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingMatrixEffect())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingMatrixEffect()));
@ -47,6 +45,7 @@ public final class DampingMatrix extends CardImpl {
class DampingMatrixEffect extends ReplacementEffectImpl { class DampingMatrixEffect extends ReplacementEffectImpl {
private static final FilterPermanent filter = new FilterPermanent("artifacts and creatures"); private static final FilterPermanent filter = new FilterPermanent("artifacts and creatures");
static { static {
filter.add(Predicates.or( filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(), CardType.ARTIFACT.getPredicate(),
@ -71,20 +70,18 @@ class DampingMatrixEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) { public boolean replaceEvent(GameEvent event, Ability source, Game game) {
return true; return true;
} }
@Override @Override
public boolean checksEventType(GameEvent event, Game game) { public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY; return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
} }
@Override @Override
public boolean applies(GameEvent event, Ability source, Game game) { public boolean applies(GameEvent event, Ability source, Game game) {
MageObject object = game.getObject(event.getSourceId()); MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) { if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId()); Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return ability.isPresent() && !ability.get().isManaActivatedAbility();
return true;
}
} }
return false; return false;
} }

View file

@ -2,7 +2,6 @@ package mage.cards.d;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
@ -109,7 +108,7 @@ class DarkImpostorContinuousEffect extends ContinuousEffectImpl {
} }
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) { for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
permanent.addAbility(ability, source.getSourceId(), game, true); permanent.addAbility(ability, source.getSourceId(), game, true);
} }
} }

View file

@ -1,12 +1,6 @@
package mage.cards.d; package mage.cards.d;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ActivatedManaAbilityImpl;
@ -25,8 +19,9 @@ import mage.players.Player;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.*;
/** /**
*
* @author L_J * @author L_J
*/ */
public final class DrainPower extends CardImpl { public final class DrainPower extends CardImpl {
@ -84,7 +79,7 @@ class DrainPowerEffect extends OneShotEffect {
List<ActivatedManaAbilityImpl> manaAbilities = new ArrayList<>(); List<ActivatedManaAbilityImpl> manaAbilities = new ArrayList<>();
abilitySearch: abilitySearch:
for (Ability ability : permanent.getAbilities()) { for (Ability ability : permanent.getAbilities()) {
if (ability instanceof ActivatedAbility && ability.getAbilityType() == AbilityType.MANA) { if (AbilityType.ACTIVATED_MANA.equals(ability.getAbilityType())) {
ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability; ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability;
if (manaAbility.canActivate(targetPlayer.getId(), game).canActivate()) { if (manaAbility.canActivate(targetPlayer.getId(), game).canActivate()) {
// canActivate can't check for mana abilities that require a mana cost, if the payment isn't possible (Cabal Coffers etc) // canActivate can't check for mana abilities that require a mana cost, if the payment isn't possible (Cabal Coffers etc)
@ -126,7 +121,7 @@ class DrainPowerEffect extends OneShotEffect {
i++; i++;
if (manaAbilitiesMap.get(permanent).size() <= i if (manaAbilitiesMap.get(permanent).size() <= i
|| targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName() || targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName()
+ "? (Choose \"no\" to activate next mana ability)", source, game)) { + "? (Choose \"no\" to activate next mana ability)", source, game)) {
boolean originalCanUndo = manaAbility.isUndoPossible(); boolean originalCanUndo = manaAbility.isUndoPossible();
manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power
if (targetPlayer.activateAbility(manaAbility, game)) { if (targetPlayer.activateAbility(manaAbility, game)) {

View file

@ -120,8 +120,7 @@ class DranaAndLinvalaGainAbilitiesEffect extends ContinuousEffectImpl {
.map(permanent -> permanent.getAbilities(game)) .map(permanent -> permanent.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED .filter(Ability::isActivatedAbility)
|| ability.getAbilityType() == AbilityType.MANA)
.collect(Collectors.toList())) { .collect(Collectors.toList())) {
Ability addedAbility = perm.addAbility(ability, source.getSourceId(), game, true); Ability addedAbility = perm.addAbility(ability, source.getSourceId(), game, true);
if (addedAbility != null) { if (addedAbility != null) {

View file

@ -1,6 +1,5 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -10,20 +9,13 @@ import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author L_J * @author L_J
*/ */
public final class Drought extends CardImpl { public final class Drought extends CardImpl {
@ -81,7 +73,7 @@ class DroughtAdditionalCostEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return (appliesToSpells && abilityToModify.getAbilityType() == AbilityType.SPELL) return (appliesToSpells && abilityToModify.getAbilityType() == AbilityType.SPELL)
|| (!appliesToSpells && (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || abilityToModify.getAbilityType() == AbilityType.MANA)); || (!appliesToSpells && abilityToModify.isActivatedAbility());
} }
@Override @Override

View file

@ -1,15 +1,6 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.StackAbility;
import mage.watchers.common.ManaPaidSourceWatcher;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility; import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -19,23 +10,25 @@ import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AsThoughEffectType; import mage.constants.*;
import mage.constants.CardType; import mage.game.Game;
import mage.constants.Duration; import mage.game.events.GameEvent;
import mage.constants.Outcome; import mage.game.permanent.Permanent;
import mage.game.stack.StackAbility;
import mage.watchers.common.ManaPaidSourceWatcher;
import java.util.UUID;
/** /**
*
* @author Xanderhall * @author Xanderhall
*/ */
public final class DynaheirInvokerAdept extends CardImpl { public final class DynaheirInvokerAdept extends CardImpl {
public DynaheirInvokerAdept(UUID ownerId, CardSetInfo setInfo) { public DynaheirInvokerAdept(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD); this.subtype.add(SubType.WIZARD);
@ -50,7 +43,7 @@ public final class DynaheirInvokerAdept extends CardImpl {
// {T}: When you next activate an ability that isn't a mana ability this turn by spending four or more mana to activate it, copy that ability. You may choose new targets for the copy. // {T}: When you next activate an ability that isn't a mana ability this turn by spending four or more mana to activate it, copy that ability. You may choose new targets for the copy.
this.addAbility(new SimpleActivatedAbility(new CreateDelayedTriggeredAbilityEffect(new DynaheirInvokerAdeptTriggeredAbility()), new TapSourceCost())); this.addAbility(new SimpleActivatedAbility(new CreateDelayedTriggeredAbilityEffect(new DynaheirInvokerAdeptTriggeredAbility()), new TapSourceCost()));
} }
private DynaheirInvokerAdept(final DynaheirInvokerAdept card) { private DynaheirInvokerAdept(final DynaheirInvokerAdept card) {
@ -88,9 +81,9 @@ class DynaheirInvokerAdeptHasteEffect extends AsThoughEffectImpl {
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
Permanent permanent = game.getPermanent(sourceId); Permanent permanent = game.getPermanent(sourceId);
return permanent != null return permanent != null
&& permanent.isCreature(game) && permanent.isCreature(game)
&& permanent.isControlledBy(source.getControllerId()) && permanent.isControlledBy(source.getControllerId())
&& !permanent.getId().equals(source.getSourceId()); && !permanent.getId().equals(source.getSourceId());
} }
} }
@ -121,7 +114,7 @@ class DynaheirInvokerAdeptTriggeredAbility extends DelayedTriggeredAbility {
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null if (stackAbility == null
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl || stackAbility.getStackAbility().isManaActivatedAbility()
|| ManaPaidSourceWatcher.getTotalPaid(stackAbility.getId(), game) < 4) { || ManaPaidSourceWatcher.getTotalPaid(stackAbility.getId(), game) < 4) {
return false; return false;
} }

View file

@ -1,10 +1,8 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.ProtectionAbility; import mage.abilities.keyword.ProtectionAbility;
@ -18,8 +16,9 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.UUID;
/** /**
*
* @author Styxo * @author Styxo
*/ */
public final class EchoBaseCommando extends CardImpl { public final class EchoBaseCommando extends CardImpl {
@ -84,7 +83,7 @@ class EchoBaseCommandoEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || (abilityToModify.getAbilityType() == AbilityType.MANA && (abilityToModify instanceof ActivatedAbility))) { if (abilityToModify.isActivatedAbility()){
Permanent permanent = game.getPermanent(abilityToModify.getSourceId()); Permanent permanent = game.getPermanent(abilityToModify.getSourceId());
if (filter.match(permanent, source.getControllerId(), source, game)) { if (filter.match(permanent, source.getControllerId(), source, game)) {
return true; return true;

View file

@ -1,7 +1,6 @@
package mage.cards.e; package mage.cards.e;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.common.TapTargetCost;
@ -86,8 +85,7 @@ class EmbalmersToolsEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED if (abilityToModify.isActivatedAbility()){
|| (abilityToModify.getAbilityType() == AbilityType.MANA && (abilityToModify instanceof ActivatedAbility))) {
// Activated abilities of creatures // Activated abilities of creatures
Card card = game.getCard(abilityToModify.getSourceId()); Card card = game.getCard(abilityToModify.getSourceId());
if (filter.match(card, source.getControllerId(), source, game) && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { if (filter.match(card, source.getControllerId(), source, game) && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {

View file

@ -1,10 +1,8 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -20,14 +18,15 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class ExperimentKraj extends CardImpl { public final class ExperimentKraj extends CardImpl {
public ExperimentKraj(UUID ownerId, CardSetInfo setInfo) { public ExperimentKraj(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{U}{U}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.OOZE); this.subtype.add(SubType.OOZE);
this.subtype.add(SubType.MUTANT); this.subtype.add(SubType.MUTANT);
@ -39,7 +38,7 @@ public final class ExperimentKraj extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ExperimentKrajEffect())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ExperimentKrajEffect()));
// {tap}: Put a +1/+1 counter on target creature. // {tap}: Put a +1/+1 counter on target creature.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()),new TapSourceCost()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }
@ -76,9 +75,9 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent perm = game.getPermanent(source.getSourceId()); Permanent perm = game.getPermanent(source.getSourceId());
if (perm != null) { if (perm != null) {
for (Permanent creature :game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)){ for (Permanent creature : game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
for (Ability ability: creature.getAbilities()) { for (Ability ability : creature.getAbilities()) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
perm.addAbility(ability, source.getSourceId(), game, true); perm.addAbility(ability, source.getSourceId(), game, true);
} }
} }

View file

@ -1,8 +1,6 @@
package mage.cards.f; package mage.cards.f;
import java.util.Optional;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -20,6 +18,9 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import java.util.Optional;
import java.util.UUID;
/** /**
* @author LevelX2 * @author LevelX2
*/ */
@ -83,7 +84,7 @@ class FaithsFettersEffect extends ContinuousRuleModifyingEffectImpl {
Permanent enchantment = game.getPermanent(source.getSourceId()); Permanent enchantment = game.getPermanent(source.getSourceId());
if (enchantment != null && enchantment.isAttachedTo(event.getSourceId())) { if (enchantment != null && enchantment.isAttachedTo(event.getSourceId())) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA) { if (ability.isPresent() && ability.get().isManaAbility()) {
return true; return true;
} }

View file

@ -11,7 +11,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.ExileSpellEffect; import mage.abilities.effects.common.ExileSpellEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.ModalDoubleFacedCard; import mage.cards.ModalDoubleFacedCard;
import mage.constants.*; import mage.constants.*;
@ -97,7 +96,7 @@ class FlamescrollCelebrantTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
getEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));

View file

@ -2,7 +2,6 @@ package mage.cards.f;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
@ -76,9 +75,7 @@ class ForensicGadgeteerEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED if (abilityToModify.isActivatedAbility()){
|| (abilityToModify.getAbilityType() == AbilityType.MANA
&& (abilityToModify instanceof ActivatedAbility))) {
// Activated abilities of artifacts // Activated abilities of artifacts
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
return permanent != null return permanent != null

View file

@ -66,15 +66,11 @@ class GloomCostIncreaseEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
boolean isWhiteEnchantment = false; if (!abilityToModify.isActivatedAbility()) {
boolean isActivated = abilityToModify.getAbilityType() == AbilityType.ACTIVATED; return false;
if (isActivated) {
MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
if (permanent != null) {
isWhiteEnchantment = permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
}
} }
return isActivated && isWhiteEnchantment; MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
return permanent != null && permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
} }
@Override @Override

View file

@ -1,27 +1,26 @@
package mage.cards.h; package mage.cards.h;
import java.util.Optional;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import java.util.Optional;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class HandToHand extends CardImpl { public final class HandToHand extends CardImpl {
public HandToHand(UUID ownerId, CardSetInfo setInfo) { public HandToHand(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
// During combat, players can't cast instant spells or activate abilities that aren't mana abilities. // During combat, players can't cast instant spells or activate abilities that aren't mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect()));
@ -79,9 +78,7 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl {
} }
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return ability.isPresent() && !ability.get().isManaActivatedAbility();
return true;
}
} }
} }
return false; return false;

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -72,7 +71,7 @@ class HarshMentorTriggeredAbility extends TriggeredAbilityImpl {
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) { if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
for (Effect effect : getEffects()) { for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId())); effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
} }

View file

@ -1,7 +1,6 @@
package mage.cards.h; package mage.cards.h;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -56,10 +55,10 @@ class HeartstoneEffect extends CostModificationEffectImpl {
public boolean apply(Game game, Ability source, Ability abilityToModify) { public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(abilityToModify.getControllerId()); Player controller = game.getPlayer(abilityToModify.getControllerId());
if (controller != null) { if (controller != null) {
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1); int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1);
if (reduceMax <= 0) { if (reduceMax <= 0) {
return true; return true;
} }
CardUtil.reduceCost(abilityToModify, reduceMax); CardUtil.reduceCost(abilityToModify, reduceMax);
return true; return true;
} }
@ -68,9 +67,7 @@ class HeartstoneEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED if (abilityToModify.isActivatedAbility()) {
|| (abilityToModify.getAbilityType() == AbilityType.MANA
&& (abilityToModify instanceof ActivatedAbility))) {
// Activated abilities of creatures // Activated abilities of creatures
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
return permanent != null && permanent.isCreature(game); return permanent != null && permanent.isCreature(game);

View file

@ -1,7 +1,5 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.MageItem; import mage.MageItem;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbility;
@ -28,8 +26,9 @@ import mage.game.events.GameEvent;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import mage.target.targetpointer.FirstTargetPointer; import mage.target.targetpointer.FirstTargetPointer;
import java.util.UUID;
/** /**
*
* @author DominionSpy * @author DominionSpy
*/ */
public final class IllicitMasquerade extends CardImpl { public final class IllicitMasquerade extends CardImpl {
@ -107,7 +106,7 @@ enum IllicitMasqueradePredicate implements ObjectSourcePlayerPredicate<MageItem>
@Override @Override
public boolean apply(ObjectSourcePlayer<MageItem> input, Game game) { public boolean apply(ObjectSourcePlayer<MageItem> input, Game game) {
Ability ability = input.getSource(); Ability ability = input.getSource();
if (!(ability instanceof TriggeredAbility)) { if (!ability.isTriggeredAbility()) {
return true; return true;
} }
GameEvent event = ((TriggeredAbility) ability).getTriggerEvent(); GameEvent event = ((TriggeredAbility) ability).getTriggerEvent();

View file

@ -4,7 +4,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.EquipAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -71,7 +70,7 @@ class IllusionistsBracersTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
this.getEffects().setValue("stackObject", stackAbility); this.getEffects().setValue("stackObject", stackAbility);

View file

@ -11,7 +11,6 @@ import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.MenaceAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -93,7 +92,7 @@ class ImmolationShamanTriggeredAbility extends TriggeredAbilityImpl {
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) { if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
for (Effect effect : getEffects()) { for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId())); effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
} }

View file

@ -1,21 +1,14 @@
package mage.cards.i; package mage.cards.i;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.AttacksOrBlocksAttachedTriggeredAbility; import mage.abilities.common.AttacksOrBlocksAttachedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.*;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.effects.common.DestroySourceEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.EnchantAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -29,8 +22,10 @@ import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import mage.watchers.common.BlockedByOnlyOneCreatureThisCombatWatcher; import mage.watchers.common.BlockedByOnlyOneCreatureThisCombatWatcher;
import java.util.Set;
import java.util.UUID;
/** /**
*
* @author L_J * @author L_J
*/ */
public final class Imprison extends CardImpl { public final class Imprison extends CardImpl {
@ -38,7 +33,7 @@ public final class Imprison extends CardImpl {
public Imprison(UUID ownerId, CardSetInfo setInfo) { public Imprison(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
this.subtype.add(SubType.AURA); this.subtype.add(SubType.AURA);
// Enchant creature // Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent(); TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addTarget(auraTarget);
@ -48,7 +43,7 @@ public final class Imprison extends CardImpl {
// Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison. // Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison.
this.addAbility(new ImprisonTriggeredAbility()); this.addAbility(new ImprisonTriggeredAbility());
// Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison. // Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison.
this.addAbility(new AttacksOrBlocksAttachedTriggeredAbility(new DoIfCostPaid(new ImprisonUnblockEffect(), new DestroySourceEffect(), new ManaCostsImpl<>("{1}")), AttachmentType.AURA)); this.addAbility(new AttacksOrBlocksAttachedTriggeredAbility(new DoIfCostPaid(new ImprisonUnblockEffect(), new DestroySourceEffect(), new ManaCostsImpl<>("{1}")), AttachmentType.AURA));
} }
@ -91,7 +86,7 @@ class ImprisonTriggeredAbility extends TriggeredAbilityImpl {
Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
if (event.getSourceId().equals(enchantedPermanent.getId())) { if (event.getSourceId().equals(enchantedPermanent.getId())) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
String abilityText = stackAbility.getRule(true); String abilityText = stackAbility.getRule(true);
if (abilityText.contains("{T},") || abilityText.contains("{T}:") || abilityText.contains("{T} or")) { if (abilityText.contains("{T},") || abilityText.contains("{T}:") || abilityText.contains("{T} or")) {
getEffects().get(0).setTargetPointer(new FixedTarget(stackAbility.getId())); getEffects().get(0).setTargetPointer(new FixedTarget(stackAbility.getId()));
@ -127,15 +122,15 @@ class ImprisonUnblockEffect extends OneShotEffect {
Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); Permanent permanent = game.getPermanent(enchantment.getAttachedTo());
if (permanent != null) { if (permanent != null) {
if (permanent.isCreature(game)) { if (permanent.isCreature(game)) {
// Tap the creature // Tap the creature
permanent.tap(source, game); permanent.tap(source, game);
// Remove it from combat // Remove it from combat
Effect effect = new RemoveFromCombatTargetEffect(); Effect effect = new RemoveFromCombatTargetEffect();
effect.setTargetPointer(new FixedTarget(permanent, game)); effect.setTargetPointer(new FixedTarget(permanent, game));
effect.apply(game, source); effect.apply(game, source);
// Make blocked creatures unblocked // Make blocked creatures unblocked
BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class); BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
if (watcher != null) { if (watcher != null) {

View file

@ -89,7 +89,7 @@ class IntercessorsArrestEffect extends ContinuousRuleModifyingEffectImpl {
case ACTIVATE_ABILITY: case ACTIVATE_ABILITY:
if (enchantment.isAttachedTo(event.getSourceId())) { if (enchantment.isAttachedTo(event.getSourceId())) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
return ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA; return ability.isPresent() && ability.get().isNonManaActivatedAbility();
} }
} }
return false; return false;

View file

@ -7,7 +7,6 @@ import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
@ -61,7 +60,7 @@ class InterdictPredicate implements Predicate<StackObject> {
@Override @Override
public boolean apply(StackObject input, Game game) { public boolean apply(StackObject input, Game game) {
if (input instanceof StackAbility && ((StackAbility) input).getAbilityType() == AbilityType.ACTIVATED) { if (input instanceof StackAbility && ((StackAbility) input).isActivatedAbility()){
MageObject sourceObject = ((StackAbility) input).getSourceObject(game); MageObject sourceObject = ((StackAbility) input).getSourceObject(game);
if (sourceObject != null) { if (sourceObject != null) {
return (sourceObject.isArtifact(game) return (sourceObject.isArtifact(game)

View file

@ -14,7 +14,6 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ManaCondition; import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.AdventureCard; import mage.cards.AdventureCard;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
@ -90,12 +89,9 @@ class JamesWanderingDadManaCondition extends ManaCondition implements Condition
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source != null && !source.isActivated()) { return source != null
// ex: SimpleManaAbility is an ACTIVATED ability, but it is categorized as a MANA ability && !source.isActivated()
return source.getAbilityType() == AbilityType.MANA && source.isActivatedAbility();
|| source.getAbilityType() == AbilityType.ACTIVATED;
}
return false;
} }
@Override @Override

View file

@ -130,7 +130,7 @@ class KopalaWardenOfWavesCostModificationEffect2 extends CostModificationEffectI
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED return abilityToModify.isActivatedAbility()
&& KopalaWardenOfWaves.isAbilityCompatible(abilityToModify, source, game); && KopalaWardenOfWaves.isAbilityCompatible(abilityToModify, source, game);
} }

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -78,7 +77,7 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
this.getEffects().setValue("stackObject", stackAbility); this.getEffects().setValue("stackObject", stackAbility);

View file

@ -9,7 +9,6 @@ import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.hint.StaticHint; import mage.abilities.hint.StaticHint;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.choices.Choice; import mage.choices.Choice;
@ -45,8 +44,8 @@ public final class LeoriSparktouchedHunter extends CardImpl {
// Whenever Leori, Sparktouched Hunter deals combat damage to a player, choose a planeswalker type. Until end of turn, whenever you activate an ability of a planeswalker of that type, copy that ability. You may choose new targets for the copies. // Whenever Leori, Sparktouched Hunter deals combat damage to a player, choose a planeswalker type. Until end of turn, whenever you activate an ability of a planeswalker of that type, copy that ability. You may choose new targets for the copies.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new LeoriSparktouchedHunterEffect(), new LeoriSparktouchedHunterEffect(),
false false
)); ));
} }
@ -66,7 +65,7 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
LeoriSparktouchedHunterEffect() { LeoriSparktouchedHunterEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "choose a planeswalker type. Until end of turn, whenever you activate an ability " + this.staticText = "choose a planeswalker type. Until end of turn, whenever you activate an ability " +
"of a planeswalker of that type, copy that ability. You may choose new targets for the copies."; "of a planeswalker of that type, copy that ability. You may choose new targets for the copies.";
} }
private LeoriSparktouchedHunterEffect(final LeoriSparktouchedHunterEffect effect) { private LeoriSparktouchedHunterEffect(final LeoriSparktouchedHunterEffect effect) {
@ -98,8 +97,8 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
game.informPlayers(controller.getLogName() + " has chosen " + subType); game.informPlayers(controller.getLogName() + " has chosen " + subType);
game.addDelayedTriggeredAbility( game.addDelayedTriggeredAbility(
new LeoriSparktouchedHunterTriggeredAbility(subType), new LeoriSparktouchedHunterTriggeredAbility(subType),
source source
); );
return true; return true;
@ -139,8 +138,7 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
return false; return false;
} }
@ -155,6 +153,6 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever you activate an ability of a planeswalker of the chosen type, copy that ability. " + return "Whenever you activate an ability of a planeswalker of the chosen type, copy that ability. " +
"You may choose new targets for the copies."; "You may choose new targets for the copies.";
} }
} }

View file

@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -82,7 +81,7 @@ class LocusOfEnlightenmentEffect extends ContinuousEffectImpl {
} }
for (Card card : exileZone.getCards(game)) { for (Card card : exileZone.getCards(game)) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) { if (ability.isActivatedAbility()) {
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
copyAbility.setMaxActivationsPerTurn(1); copyAbility.setMaxActivationsPerTurn(1);
permanent.addAbility(copyAbility, source.getSourceId(), game, true); permanent.addAbility(copyAbility, source.getSourceId(), game, true);
@ -120,7 +119,7 @@ class LocusOfEnlightenmentTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.isManaAbility()) {
return false; return false;
} }
this.getEffects().setValue("stackObject", stackAbility); this.getEffects().setValue("stackObject", stackAbility);

View file

@ -11,7 +11,6 @@ import mage.abilities.effects.common.UntapTargetEffect;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
@ -64,10 +63,8 @@ class HasAbilityWithTapSymbolPredicate implements Predicate<MageObject> {
} }
for (Ability ability : abilities) { for (Ability ability : abilities) {
if ((ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) && !ability.getCosts().isEmpty()) { if (ability.isActivatedAbility() && ability.hasTapCost()) {
if (ability.hasTapCost()) { return true;
return true;
}
} }
} }
return false; return false;

View file

@ -16,13 +16,12 @@ import mage.constants.*;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.game.stack.StackAbility; import mage.game.stack.StackAbility;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
* @author TheElk801 * @author TheElk801
@ -93,7 +92,7 @@ class MagusLuceaKaneTriggeredAbility extends DelayedTriggeredAbility {
// activated ability // activated ability
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) { if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { if (stackAbility != null && !stackAbility.getStackAbility().isManaActivatedAbility()) {
if (stackAbility.getManaCostsToPay().containsX()) { if (stackAbility.getManaCostsToPay().containsX()) {
this.getEffects().setValue("stackObject", (StackObject) stackAbility); this.getEffects().setValue("stackObject", (StackObject) stackAbility);
return true; return true;

View file

@ -138,7 +138,7 @@ class MairsilThePretenderGainAbilitiesEffect extends ContinuousEffectImpl {
for (Card card : game.getExile().getAllCards(game)) { for (Card card : game.getExile().getAllCards(game)) {
if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) { if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
copyAbility.setMaxActivationsPerTurn(1); copyAbility.setMaxActivationsPerTurn(1);
perm.addAbility(copyAbility, source.getSourceId(), game, true); perm.addAbility(copyAbility, source.getSourceId(), game, true);

View file

@ -82,8 +82,7 @@ class ManascapeRefractorGainAbilitiesEffect extends ContinuousEffectImpl {
.map(permanent -> permanent.getAbilities(game)) .map(permanent -> permanent.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED .filter(Ability::isActivatedAbility)
|| ability.getAbilityType() == AbilityType.MANA)
.collect(Collectors.toList())) { .collect(Collectors.toList())) {
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities // optimization to disallow the adding of duplicate, unnecessary basic mana abilities
if (!(ability instanceof BasicManaAbility) if (!(ability instanceof BasicManaAbility)

View file

@ -1,13 +1,6 @@
package mage.cards.m; package mage.cards.m;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -18,6 +11,12 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -70,7 +69,7 @@ class MirranSafehouseEffect extends ContinuousEffectImpl {
.flatMap(Collection::stream) .flatMap(Collection::stream)
.map(card -> card.getAbilities(game)) .map(card -> card.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance) .filter(Ability::isActivatedAbility)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
for (Ability ability : abilities) { for (Ability ability : abilities) {
permanent.addAbility(ability, source.getSourceId(), game, true); permanent.addAbility(ability, source.getSourceId(), game, true);

View file

@ -7,7 +7,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility; import mage.abilities.keyword.KickerAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -84,9 +83,8 @@ class MoltenDisasterSplitSecondEffect extends ContinuousRuleModifyingEffectImpl
} }
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return ability.isPresent() && !ability.get().isManaActivatedAbility()
return KickedCondition.ONCE.apply(game, source); && KickedCondition.ONCE.apply(game, source);
}
} }
return false; return false;
} }

View file

@ -1,9 +1,7 @@
package mage.cards.m; package mage.cards.m;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -18,8 +16,9 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInGraveyard;
import java.util.UUID;
/** /**
*
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
public final class MyrWelder extends CardImpl { public final class MyrWelder extends CardImpl {
@ -102,7 +101,7 @@ class MyrWelderContinuousEffect extends ContinuousEffectImpl {
Card card = game.getCard(imprintedId); Card card = game.getCard(imprintedId);
if (card != null) { if (card != null) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
perm.addAbility(ability, source.getId(), game, true); perm.addAbility(ability, source.getId(), game, true);
} }
} }

View file

@ -2,7 +2,6 @@ package mage.cards.n;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -76,7 +75,7 @@ class NecroticOozeEffect extends ContinuousEffectImpl {
.flatMap(Collection::stream) .flatMap(Collection::stream)
.map(card -> card.getAbilities(game)) .map(card -> card.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance) .filter(Ability::isActivatedAbility)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
for (Ability ability : abilities) { for (Ability ability : abilities) {
permanent.addAbility(ability, source.getSourceId(), game, true); permanent.addAbility(ability, source.getSourceId(), game, true);

View file

@ -11,7 +11,6 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ManaCondition; import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.game.Game; import mage.game.Game;
@ -74,8 +73,7 @@ class OmenHawkerManaCondition extends ManaCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source != null && !source.isActivated()) { if (source != null && !source.isActivated()) {
return source.getAbilityType() == AbilityType.MANA return source.isActivatedAbility();
|| source.getAbilityType() == AbilityType.ACTIVATED;
} }
return false; return false;
} }

View file

@ -1,10 +1,7 @@
package mage.cards.o; package mage.cards.o;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
@ -13,27 +10,22 @@ import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class OppressiveRays extends CardImpl { public final class OppressiveRays extends CardImpl {
public OppressiveRays(UUID ownerId, CardSetInfo setInfo) { public OppressiveRays(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
this.subtype.add(SubType.AURA); this.subtype.add(SubType.AURA);
// Enchant creature // Enchant creature
@ -80,13 +72,9 @@ class OppressiveRaysCostModificationEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
Permanent creature = game.getPermanent(abilityToModify.getSourceId()); Permanent creature = game.getPermanent(abilityToModify.getSourceId());
if (creature != null && creature.getAttachments().contains(source.getSourceId())) { return creature != null
if (abilityToModify instanceof ActivatedAbility && creature.getAttachments().contains(source.getSourceId())
&& !(abilityToModify instanceof SpellAbility)) { && abilityToModify.isActivatedAbility();
return true;
}
}
return false;
} }
@Override @Override

View file

@ -8,7 +8,6 @@ import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.EnchantAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -23,7 +22,6 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class OverwhelmingSplendor extends CardImpl { public final class OverwhelmingSplendor extends CardImpl {
@ -149,7 +147,7 @@ class OverwhelmingSplendorCantActivateEffect extends ContinuousRuleModifyingEffe
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
return ability.isPresent() return ability.isPresent()
&& !(ability.get() instanceof ActivatedManaAbilityImpl) && !(ability.get().isManaActivatedAbility())
&& !(ability.get() instanceof LoyaltyAbility); && !(ability.get() instanceof LoyaltyAbility);
} }
} }

View file

@ -2,7 +2,6 @@ package mage.cards.p;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
@ -76,7 +75,7 @@ class PatchworkCrawlerEffect extends ContinuousEffectImpl {
} }
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) { for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
permanent.addAbility(ability, source.getSourceId(), game, true); permanent.addAbility(ability, source.getSourceId(), game, true);
} }
} }

View file

@ -6,7 +6,6 @@ import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -71,12 +70,10 @@ class PithingNeedleEffect extends ContinuousRuleModifyingEffectImpl {
MageObject object = game.getObject(event.getSourceId()); MageObject object = game.getObject(event.getSourceId());
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() return ability.isPresent()
&& object != null) { && object != null
return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range && game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
&& !(ability.get() instanceof ActivatedManaAbilityImpl) // not an activated mana ability && !ability.get().isManaActivatedAbility() // not an activated mana ability
&& CardUtil.haveSameNames(object, cardName, game); && CardUtil.haveSameNames(object, cardName, game);
}
return false;
} }
} }

View file

@ -1,8 +1,6 @@
package mage.cards.p; package mage.cards.p;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
@ -67,10 +65,10 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
public boolean apply(Game game, Ability source, Ability abilityToModify) { public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(abilityToModify.getControllerId()); Player controller = game.getPlayer(abilityToModify.getControllerId());
if (controller != null) { if (controller != null) {
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1); int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
if (reduceMax <= 0) { if (reduceMax <= 0) {
return true; return true;
} }
CardUtil.reduceCost(abilityToModify, reduceMax); CardUtil.reduceCost(abilityToModify, reduceMax);
} }
return true; return true;
@ -81,9 +79,7 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
Permanent artifact = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId()); Permanent artifact = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
if (artifact != null if (artifact != null
&& artifact.getAttachments().contains(source.getSourceId())) { && artifact.getAttachments().contains(source.getSourceId())) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED if (abilityToModify.isActivatedAbility()){
|| (abilityToModify.getAbilityType() == AbilityType.MANA
&& (abilityToModify instanceof ActivatedAbility))) {
return true; return true;
} }
} }

View file

@ -5,7 +5,6 @@ import mage.abilities.Abilities;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -87,7 +86,7 @@ class PowerSinkCounterUnlessPaysEffect extends OneShotEffect {
for (Permanent land : lands) { for (Permanent land : lands) {
Abilities<Ability> landAbilities = land.getAbilities(); Abilities<Ability> landAbilities = land.getAbilities();
for (Ability ability : landAbilities) { for (Ability ability : landAbilities) {
if (ability instanceof ActivatedManaAbilityImpl) { if (ability.isManaActivatedAbility()) {
land.tap(source, game); land.tap(source, game);
break; break;
} }

View file

@ -9,7 +9,6 @@ import mage.abilities.effects.common.FightTargetSourceEffect;
import mage.abilities.keyword.RiotAbility; import mage.abilities.keyword.RiotAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
@ -78,7 +77,6 @@ enum RavagerWurmPredicate implements Predicate<Permanent> {
&& input && input
.getAbilities(game) .getAbilities(game)
.stream() .stream()
.map(Ability::getAbilityType) .anyMatch(Ability::isNonManaActivatedAbility);
.anyMatch(AbilityType.ACTIVATED::equals);
} }
} }

View file

@ -127,7 +127,7 @@ class RexCyberhoundContinuousEffect extends ContinuousEffectImpl {
} }
for (Card card : game.getExile().getCards(filter, game)) { for (Card card : game.getExile().getCards(filter, game)) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) { if (ability.isActivatedAbility()) {
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
copyAbility.setMaxActivationsPerTurn(1); copyAbility.setMaxActivationsPerTurn(1);
perm.addAbility(copyAbility, source.getSourceId(), game, true); perm.addAbility(copyAbility, source.getSourceId(), game, true);

View file

@ -4,7 +4,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CopyStackObjectEffect; import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -63,7 +62,7 @@ class RingsOfBrighthearthTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
this.getEffects().setValue("stackObject", stackAbility); this.getEffects().setValue("stackObject", stackAbility);

View file

@ -79,9 +79,8 @@ class RobaranMercenariesEffect extends ContinuousEffectImpl {
.map(permanent -> permanent.getAbilities(game)) .map(permanent -> permanent.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED .filter(ability -> ability.isActivatedAbility())
|| ability.getAbilityType() == AbilityType.MANA) .collect(Collectors.toList())){
.collect(Collectors.toList())) {
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities // optimization to disallow the adding of duplicate, unnecessary basic mana abilities
if (!(ability instanceof BasicManaAbility) if (!(ability instanceof BasicManaAbility)
|| perm.getAbilities(game) || perm.getAbilities(game)

View file

@ -1,13 +1,11 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.MageObject; import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
@ -15,8 +13,9 @@ import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.stack.StackAbility; import mage.game.stack.StackAbility;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class RunicArmasaur extends CardImpl { public final class RunicArmasaur extends CardImpl {
@ -67,7 +66,7 @@ class RunicArmasaurTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility != null if (stackAbility != null
&& stackAbility.getAbilityType() == AbilityType.ACTIVATED && stackAbility.isNonManaActivatedAbility()
&& game.getOpponents(this.getControllerId()).contains(stackAbility.getControllerId()) && game.getOpponents(this.getControllerId()).contains(stackAbility.getControllerId())
&& stackAbility.getSourcePermanentOrLKI(game) != null) { // must be a permanent && stackAbility.getSourcePermanentOrLKI(game) != null) { // must be a permanent
MageObject abilitySourceObject = stackAbility.getSourceObject(game); MageObject abilitySourceObject = stackAbility.getSourceObject(game);

View file

@ -2,7 +2,6 @@ package mage.cards.s;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.common.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -78,7 +77,7 @@ class SamLoyalAttendantEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!(abilityToModify instanceof ActivatedAbility)) { if (!(abilityToModify.isActivatedAbility())) {
return false; return false;
} }
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game); Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);

View file

@ -8,7 +8,6 @@ import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.AsThoughManaEffect; import mage.abilities.effects.AsThoughManaEffect;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -25,12 +24,12 @@ import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
*
* @author Susucr * @author Susucr
*/ */
public final class SharkeyTyrantOfTheShire extends CardImpl { public final class SharkeyTyrantOfTheShire extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("lands your opponents control"); private static final FilterPermanent filter = new FilterPermanent("lands your opponents control");
static { static {
filter.add(CardType.LAND.getPredicate()); filter.add(CardType.LAND.getPredicate());
filter.add(TargetController.OPPONENT.getControllerPredicate()); filter.add(TargetController.OPPONENT.getControllerPredicate());
@ -38,7 +37,7 @@ public final class SharkeyTyrantOfTheShire extends CardImpl {
public SharkeyTyrantOfTheShire(UUID ownerId, CardSetInfo setInfo) { public SharkeyTyrantOfTheShire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.AVATAR); this.subtype.add(SubType.AVATAR);
this.subtype.add(SubType.ROGUE); this.subtype.add(SubType.ROGUE);
@ -98,9 +97,9 @@ class SharkeyTyrantOfTheShireReplacementEffect extends ReplacementEffectImpl {
@Override @Override
public boolean applies(GameEvent event, Ability source, Game game) { public boolean applies(GameEvent event, Ability source, Game game) {
MageObject object = game.getObject(event.getSourceId()); MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) { if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId()); Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { if (ability.isPresent() && !ability.get().isManaActivatedAbility()) {
return true; return true;
} }
} }
@ -143,7 +142,7 @@ class SharkeyTyrantOfTheShireContinousEffect extends ContinuousEffectImpl {
.map(permanent -> permanent.getAbilities(game)) .map(permanent -> permanent.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED) // Mana abilities are separated in their own AbilityType.Mana .filter(Ability::isNonManaActivatedAbility)
.collect(Collectors.toList())) { .collect(Collectors.toList())) {
perm.addAbility(ability, source.getSourceId(), game, true); perm.addAbility(ability, source.getSourceId(), game, true);
} }

View file

@ -72,12 +72,8 @@ class ArtifactAbilityManaCondition extends ManaCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
switch (source.getAbilityType()) { if (!source.isActivatedAbility()) {
case ACTIVATED: return false;
case MANA:
break;
default:
return false;
} }
MageObject object = game.getObject(source); MageObject object = game.getObject(source);
return object != null && object.isArtifact(game) && !source.isActivated(); return object != null && object.isArtifact(game) && !source.isActivated();

View file

@ -1,7 +1,5 @@
package mage.cards.s; package mage.cards.s;
import java.util.Optional;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.AsEntersBattlefieldAbility;
@ -10,11 +8,17 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.Optional;
import java.util.UUID;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -68,7 +72,7 @@ class SorcerousSpyglassActivationEffect extends ContinuousRuleModifyingEffectImp
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && object != null) { if (ability.isPresent() && object != null) {
return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
&& ability.get().getAbilityType() != AbilityType.MANA && !ability.get().isManaAbility()
&& CardUtil.haveSameNames(object, cardName, game); && CardUtil.haveSameNames(object, cardName, game);
} }
return false; return false;

View file

@ -70,7 +70,7 @@ class StrictProctorTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
Ability ability = stackObject.getStackAbility(); Ability ability = stackObject.getStackAbility();
if (!(ability instanceof TriggeredAbility)) { if (!ability.isTriggeredAbility()) {
return false; return false;
} }
GameEvent triggerEvent = ((TriggeredAbility) ability).getTriggerEvent(); GameEvent triggerEvent = ((TriggeredAbility) ability).getTriggerEvent();

View file

@ -1,29 +1,24 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SuppressionField extends CardImpl { public final class SuppressionField extends CardImpl {
public SuppressionField(UUID ownerId, CardSetInfo setInfo) { public SuppressionField(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
// Activated abilities cost {2} more to activate unless they're mana abilities. // Activated abilities cost {2} more to activate unless they're mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect()));
@ -58,7 +53,7 @@ class SuppressionFieldCostReductionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED; return abilityToModify.isNonManaActivatedAbility();
} }
@Override @Override

View file

@ -80,8 +80,7 @@ class TazriStalwartSurvivorManaAbility extends ActivatedManaAbilityImpl {
&& permanent && permanent
.getAbilities(game) .getAbilities(game)
.stream() .stream()
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED .filter(ability -> ability.isActivatedAbility())
|| ability.getAbilityType() == AbilityType.MANA)
.map(Ability::getOriginalId) .map(Ability::getOriginalId)
.anyMatch(abilityId -> !source.getOriginalId().equals(abilityId)); .anyMatch(abilityId -> !source.getOriginalId().equals(abilityId));
} }
@ -124,12 +123,8 @@ class TazriStalwartSurvivorManaEffect extends ManaEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
switch (source.getAbilityType()) { if (!source.isActivatedAbility()) {
case ACTIVATED: return false;
case MANA:
break;
default:
return false;
} }
MageObject object = game.getObject(source); MageObject object = game.getObject(source);
return object != null && object.isCreature(game) && !source.isActivated(); return object != null && object.isCreature(game) && !source.isActivated();
@ -271,8 +266,7 @@ class TazriStalwartSurvivorMillEffect extends OneShotEffect {
.getCard(uuid) .getCard(uuid)
.getAbilities(game) .getAbilities(game)
.stream() .stream()
.map(Ability::getAbilityType) .noneMatch(Ability::isNonManaActivatedAbility));
.noneMatch(AbilityType.ACTIVATED::equals));
player.moveCards(cards, Zone.HAND, source, game); player.moveCards(cards, Zone.HAND, source, game);
return true; return true;
} }

View file

@ -89,7 +89,7 @@ class TerritoryForgeStaticEffect extends ContinuousEffectImpl {
} }
for (Card card : exileZone.getCards(game)) { for (Card card : exileZone.getCards(game)) {
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) { if (ability.isActivatedAbility()){
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
permanent.addAbility(copyAbility, source.getSourceId(), game, true); permanent.addAbility(copyAbility, source.getSourceId(), game, true);
} }

View file

@ -1,7 +1,6 @@
package mage.cards.t; package mage.cards.t;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.LoyaltyAbility; import mage.abilities.LoyaltyAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.common.DiscardCardCost;
@ -97,7 +96,7 @@ class TezzeretBetrayerOfFleshReductionEffect extends CostModificationEffectImpl
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify.isControlledBy(source.getControllerId()) return abilityToModify.isControlledBy(source.getControllerId())
&& abilityToModify instanceof ActivatedAbility && abilityToModify.isActivatedAbility()
&& TezzeretBetrayerOfFleshWatcher.checkPlayer(game, abilityToModify); && TezzeretBetrayerOfFleshWatcher.checkPlayer(game, abilityToModify);
} }
} }

View file

@ -2,7 +2,6 @@ package mage.cards.t;
import mage.MageObjectReference; import mage.MageObjectReference;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
@ -25,7 +24,6 @@ import mage.game.permanent.token.Token;
import mage.game.permanent.token.VecnaToken; import mage.game.permanent.token.VecnaToken;
import mage.game.permanent.token.ZombieToken; import mage.game.permanent.token.ZombieToken;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetSacrifice; import mage.target.common.TargetSacrifice;
import mage.watchers.common.PlayerLostLifeWatcher; import mage.watchers.common.PlayerLostLifeWatcher;
@ -187,7 +185,7 @@ class TheBookOfVileDarknessEffect extends OneShotEffect {
continue; continue;
} }
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof TriggeredAbility) { if (ability.isTriggeredAbility()) {
Ability copyAbility = ability.copy(); Ability copyAbility = ability.copy();
copyAbility.newId(); copyAbility.newId();
copyAbility.setControllerId(source.getControllerId()); copyAbility.setControllerId(source.getControllerId());

View file

@ -14,7 +14,6 @@ import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicate;
@ -66,7 +65,7 @@ enum TheEnigmaJewelPredicate implements Predicate<MageObject> {
&& input instanceof Card && input instanceof Card
&& ((Card) input).getAbilities(game) && ((Card) input).getAbilities(game)
.stream() .stream()
.anyMatch(a -> (a.getAbilityType() == AbilityType.ACTIVATED || a.getAbilityType() == AbilityType.MANA)); .anyMatch(a -> (a.isActivatedAbility()));
} }
} }
@ -98,8 +97,7 @@ class TheEnigmaJewelManaCondition extends ManaCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source != null && !source.isActivated()) { if (source != null && !source.isActivated()) {
return source.getAbilityType() == AbilityType.MANA return source.isActivatedAbility();
|| source.getAbilityType() == AbilityType.ACTIVATED;
} }
return false; return false;
} }

View file

@ -2,7 +2,6 @@ package mage.cards.t;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.ruleModifying.LegendRuleDoesntApplyEffect; import mage.abilities.effects.common.ruleModifying.LegendRuleDoesntApplyEffect;
@ -109,7 +108,7 @@ class TheMasterMultipliedEffect extends ContinuousRuleModifyingEffectImpl {
return controller != null && permanent != null return controller != null && permanent != null
&& filter.match(permanent, source.getControllerId(), source, game) && filter.match(permanent, source.getControllerId(), source, game)
&& stackAbility instanceof TriggeredAbility && stackAbility.isTriggeredAbility()
&& source.getControllerId().equals(eventSourceControllerId); && source.getControllerId().equals(eventSourceControllerId);
} }
} }

View file

@ -65,7 +65,7 @@ class TitheTakerCostReductionEffect extends CostModificationEffectImpl {
SpellAbility spellAbility = (SpellAbility) abilityToModify; SpellAbility spellAbility = (SpellAbility) abilityToModify;
CardUtil.adjustCost(spellAbility, -1); CardUtil.adjustCost(spellAbility, -1);
} }
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED) { if (abilityToModify.isNonManaActivatedAbility()) {
CardUtil.increaseCost(abilityToModify, 1); CardUtil.increaseCost(abilityToModify, 1);
} }
return true; return true;
@ -73,14 +73,9 @@ class TitheTakerCostReductionEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!MyTurnCondition.instance.apply(game, source)) { return MyTurnCondition.instance.apply(game, source)
return false; && (abilityToModify.getAbilityType() == AbilityType.SPELL || abilityToModify.isNonManaActivatedAbility())
} && game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId());
if (!(abilityToModify.getAbilityType() == AbilityType.SPELL)
&& !(abilityToModify.getAbilityType() == AbilityType.ACTIVATED)) {
return false;
}
return game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId());
} }
@Override @Override

View file

@ -1,12 +1,14 @@
package mage.cards.t; package mage.cards.t;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
@ -68,9 +70,7 @@ class TrainingGroundsEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED if (!abilityToModify.isActivatedAbility()) {
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|| !(abilityToModify instanceof ActivatedAbility))) {
return false; return false;
} }
//Activated abilities of creatures you control //Activated abilities of creatures you control

View file

@ -2,7 +2,6 @@ package mage.cards.t;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
@ -74,7 +73,7 @@ class TrazynTheInfiniteEffect extends ContinuousEffectImpl {
.stream() .stream()
.map(card -> card.getAbilities(game)) .map(card -> card.getAbilities(game))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance) .filter(Ability::isActivatedAbility)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
for (Ability ability : abilities) { for (Ability ability : abilities) {
permanent.addAbility(ability, source.getSourceId(), game, true); permanent.addAbility(ability, source.getSourceId(), game, true);

View file

@ -1,34 +1,27 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.PlayLandAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class TsabosWeb extends CardImpl { public final class TsabosWeb extends CardImpl {
public TsabosWeb(UUID ownerId, CardSetInfo setInfo) { public TsabosWeb(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// When Tsabo's Web enters the battlefield, draw a card. // When Tsabo's Web enters the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
@ -66,16 +59,14 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl {
public boolean checksEventType(GameEvent event, Game game) { public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UNTAP; return event.getType() == GameEvent.EventType.UNTAP;
} }
@Override @Override
public boolean applies(GameEvent event, Ability source, Game game) { public boolean applies(GameEvent event, Ability source, Game game) {
if (game.getTurnStepType() == PhaseStep.UNTAP) { if (game.getTurnStepType() == PhaseStep.UNTAP) {
Permanent permanent = game.getPermanent(event.getTargetId()); Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.isLand(game)) { if (permanent != null && permanent.isLand(game)) {
for (Ability ability :permanent.getAbilities()) { for (Ability ability : permanent.getAbilities()) {
if (!(ability instanceof PlayLandAbility) if (ability.isNonManaActivatedAbility()) {
&& !(ability instanceof ActivatedManaAbilityImpl)
&& ability instanceof ActivatedAbility) {
return true; return true;
} }
} }

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -90,7 +89,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
UnboundFlourishingCopyAbility() { UnboundFlourishingCopyAbility() {
super(Zone.BATTLEFIELD, new UnboundFlourishingCopyEffect(), false); super(Zone.BATTLEFIELD, new UnboundFlourishingCopyEffect(), false);
setTriggerPhrase("Whenever you cast an instant or sorcery spell or activate an ability, " + setTriggerPhrase("Whenever you cast an instant or sorcery spell or activate an ability, " +
"if that spell's mana cost or that ability's activation cost contains {X}" ); "if that spell's mana cost or that ability's activation cost contains {X}");
} }
private UnboundFlourishingCopyAbility(final UnboundFlourishingCopyAbility ability) { private UnboundFlourishingCopyAbility(final UnboundFlourishingCopyAbility ability) {
@ -117,7 +116,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
// activated ability // activated ability
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) { if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) { if (stackAbility != null && !stackAbility.getStackAbility().isManaActivatedAbility()) {
if (stackAbility.getManaCostsToPay().containsX()) { if (stackAbility.getManaCostsToPay().containsX()) {
game.getState().setValue(this.getSourceId() + UnboundFlourishing.needPrefix, stackAbility); game.getState().setValue(this.getSourceId() + UnboundFlourishing.needPrefix, stackAbility);
return true; return true;

View file

@ -8,7 +8,6 @@ import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -84,7 +83,7 @@ class VerrakWarpedSengirTriggeredAbility extends TriggeredAbilityImpl {
return false; return false;
} }
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) { if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false; return false;
} }
int lifePaid = CardUtil.castStream( int lifePaid = CardUtil.castStream(

View file

@ -78,9 +78,7 @@ enum ZirdaTheDawnwakerCompanionCondition implements CompanionCondition {
.allMatch(card -> card .allMatch(card -> card
.getAbilities() .getAbilities()
.stream() .stream()
.anyMatch(ability -> ability.getAbilityType() == AbilityType.ACTIVATED .anyMatch(ability -> ability.isActivatedAbility())
|| ability.getAbilityType() == AbilityType.MANA
|| ability.getAbilityType() == AbilityType.LOYALTY)
); );
} }
} }
@ -112,7 +110,7 @@ class ZirdaTheDawnwakerEffect extends CostModificationEffectImpl {
@Override @Override
public boolean applies(Ability abilityToModify, Ability source, Game game) { public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED return abilityToModify.isNonManaActivatedAbility()
&& abilityToModify.isControlledBy(source.getControllerId()); && abilityToModify.isControlledBy(source.getControllerId());
} }

View file

@ -2,7 +2,6 @@
package org.mage.test.cards.continuous; package org.mage.test.cards.continuous;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.constants.AbilityType;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
@ -11,7 +10,6 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public class DependentEffectsTest extends CardTestPlayerBase { public class DependentEffectsTest extends CardTestPlayerBase {
@ -33,9 +31,9 @@ public class DependentEffectsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence",true); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
@ -49,12 +47,12 @@ public class DependentEffectsTest extends CardTestPlayerBase {
/** /**
* Opalescence is dependent on Enchanted Evening, so it will be applied * Opalescence is dependent on Enchanted Evening, so it will be applied
* after it regardless of timestamp. * after it regardless of timestamp.
* * <p>
* Tokens can also have mana costs, and as a consequence of that, converted * Tokens can also have mana costs, and as a consequence of that, converted
* mana costs. A token created with Rite of Replication would have the mana * mana costs. A token created with Rite of Replication would have the mana
* cost of the creature it targeted. Most tokens do not have mana costs * cost of the creature it targeted. Most tokens do not have mana costs
* though. * though.
* * <p>
* Tokens with no mana costs would be 0/0, as you said, and would indeed be * Tokens with no mana costs would be 0/0, as you said, and would indeed be
* put into owner's graveyard next time State Based Actionas are performed. * put into owner's graveyard next time State Based Actionas are performed.
* Tokens with mana costs would naturally have whatever power and toughness * Tokens with mana costs would naturally have whatever power and toughness
@ -112,7 +110,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA); Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
int numberOfActivatedAbilities = 0; int numberOfActivatedAbilities = 0;
for (Ability ability : necroticOoze.getAbilities(currentGame)) { for (Ability ability : necroticOoze.getAbilities(currentGame)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED) { if (ability.isActivatedAbility()){
numberOfActivatedAbilities++; numberOfActivatedAbilities++;
} }
} }
@ -133,7 +131,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B} addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer");
setStrictChooseMode(true); setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
@ -143,7 +141,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA); Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
int numberOfActivatedAbilities = 0; int numberOfActivatedAbilities = 0;
for (Ability ability : necroticOoze.getAbilities(currentGame)) { for (Ability ability : necroticOoze.getAbilities(currentGame)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED) { if (ability.isActivatedAbility()){
numberOfActivatedAbilities++; numberOfActivatedAbilities++;
} }
} }

View file

@ -63,6 +63,6 @@ public class ConspicuousSnoopTest extends CardTestPlayerBase {
setStrictChooseMode(true); setStrictChooseMode(true);
execute(); execute();
assertAbilityCount(playerA, "Conspicuous Snoop", ActivatedAbility.class, 3); // (2 X casts + gains flying ) assertAbilityCount(playerA, "Conspicuous Snoop", ActivatedAbility.class, 2); // (own cast ability + gains flying )
} }
} }

View file

@ -5,7 +5,6 @@ import mage.abilities.costs.Cost;
import mage.abilities.keyword.ProtectionAbility; import mage.abilities.keyword.ProtectionAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.abilities.mana.ManaAbility; import mage.abilities.mana.ManaAbility;
import mage.constants.AbilityType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.util.ThreadLocalStringBuilder; import mage.util.ThreadLocalStringBuilder;
@ -103,6 +102,11 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
return rules; return rules;
} }
/**
* Activated Ability in the engine are broader than in the rules.
* Notably SpellAbility & PlayLandAbility are ActivatedAbility,
* as they can be activated by a player (the engine meaning).
*/
@Override @Override
public Abilities<ActivatedAbility> getActivatedAbilities(Zone zone) { public Abilities<ActivatedAbility> getActivatedAbilities(Zone zone) {
return stream() return stream()
@ -161,7 +165,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
public Abilities<TriggeredAbility> getTriggeredAbilities(Zone zone) { public Abilities<TriggeredAbility> getTriggeredAbilities(Zone zone) {
Abilities<TriggeredAbility> zonedAbilities = new AbilitiesImpl<>(); Abilities<TriggeredAbility> zonedAbilities = new AbilitiesImpl<>();
for (T ability : this) { for (T ability : this) {
if (ability instanceof TriggeredAbility && ability.getZone().match(zone)) { if (ability.isTriggeredAbility() && ability.getZone().match(zone)) {
zonedAbilities.add((TriggeredAbility) ability); zonedAbilities.add((TriggeredAbility) ability);
} else if (ability instanceof ZoneChangeTriggeredAbility) { } else if (ability instanceof ZoneChangeTriggeredAbility) {
ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility) ability; ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility) ability;
@ -176,7 +180,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
@Override @Override
public boolean hasPoolDependantAbilities() { public boolean hasPoolDependantAbilities() {
return stream() return stream()
.filter(ability -> ability.getAbilityType() == AbilityType.MANA) .filter(Ability::isManaAbility)
.map(ManaAbility.class::cast) .map(ManaAbility.class::cast)
.anyMatch(ManaAbility::isPoolDependant); .anyMatch(ManaAbility::isPoolDependant);
} }

View file

@ -62,6 +62,31 @@ public interface Ability extends Controllable, Serializable {
*/ */
AbilityType getAbilityType(); AbilityType getAbilityType();
/**
* If this ability is an activated one (mana included).
*/
boolean isActivatedAbility();
/**
* If this ability is a triggered one (mana included).
*/
boolean isTriggeredAbility();
/**
* If this ability is an activated one, excluding mana.
*/
boolean isNonManaActivatedAbility();
/**
* If this ability is a mana activated one.
*/
boolean isManaActivatedAbility();
/**
* If this ability is a mana ability, (both triggered and activated can be mana abilities).
*/
boolean isManaAbility();
/** /**
* Sets the id of the controller of this ability. * Sets the id of the controller of this ability.
* *

View file

@ -162,6 +162,31 @@ public abstract class AbilityImpl implements Ability {
return this.abilityType; return this.abilityType;
} }
@Override
public boolean isActivatedAbility() {
return this.abilityType.isActivatedAbility();
}
@Override
public boolean isTriggeredAbility() {
return this.abilityType.isTriggeredAbility();
}
@Override
public boolean isNonManaActivatedAbility() {
return this.abilityType.isNonManaActivatedAbility();
}
@Override
public boolean isManaActivatedAbility() {
return this.abilityType.isManaActivatedAbility();
}
@Override
public boolean isManaAbility() {
return this.abilityType.isManaAbility();
}
@Override @Override
public boolean resolve(Game game) { public boolean resolve(Game game) {
boolean result = true; boolean result = true;
@ -193,7 +218,7 @@ public abstract class AbilityImpl implements Ability {
boolean effectResult = effect.apply(game, this); boolean effectResult = effect.apply(game, this);
result &= effectResult; result &= effectResult;
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
if (this.getAbilityType() != AbilityType.MANA) { if (!this.isManaAbility()) {
if (!effectResult) { if (!effectResult) {
if (this.getSourceId() != null) { if (this.getSourceId() != null) {
MageObject mageObject = game.getObject(this.getSourceId()); MageObject mageObject = game.getObject(this.getSourceId());
@ -351,7 +376,7 @@ public abstract class AbilityImpl implements Ability {
// and/or zones become the target of a spell trigger at this point; they'll wait to be put on // and/or zones become the target of a spell trigger at this point; they'll wait to be put on
// the stack until the spell has finished being cast.) // the stack until the spell has finished being cast.)
if (this.getAbilityType() != AbilityType.TRIGGERED) { // triggered abilities check this already in playerImpl.triggerAbility if (!this.getAbilityType().isTriggeredAbility()) { // triggered abilities check this already in playerImpl.triggerAbility
adjustTargets(game); adjustTargets(game);
} }
@ -359,6 +384,7 @@ public abstract class AbilityImpl implements Ability {
Outcome outcome = getEffects().getOutcome(this); Outcome outcome = getEffects().getOutcome(this);
// only activated abilities can be canceled by human user (not triggered) // only activated abilities can be canceled by human user (not triggered)
// Note: ActivatedAbility does include SpellAbility & PlayLandAbility, but those should be able to be canceled too.
boolean canCancel = this instanceof ActivatedAbility && controller.isHuman(); boolean canCancel = this instanceof ActivatedAbility && controller.isHuman();
if (!getTargets().chooseTargets(outcome, this.controllerId, this, noMana, game, canCancel)) { if (!getTargets().chooseTargets(outcome, this.controllerId, this, noMana, game, canCancel)) {
// was canceled during targer selection // was canceled during targer selection

View file

@ -57,7 +57,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
} }
protected ActivatedAbilityImpl(Zone zone, Effect effect, Cost cost) { protected ActivatedAbilityImpl(Zone zone, Effect effect, Cost cost) {
super(AbilityType.ACTIVATED, zone); super(AbilityType.ACTIVATED_NONMANA, zone);
this.addEffect(effect); this.addEffect(effect);
this.addCost(cost); this.addCost(cost);
} }
@ -147,8 +147,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
if (approvingObjects.isEmpty()) { if (approvingObjects.isEmpty()) {
return ActivationStatus.withoutApprovingObject(true); return ActivationStatus.withoutApprovingObject(true);
} } else {
else {
return new ActivationStatus(approvingObjects); return new ActivationStatus(approvingObjects);
} }
} }

View file

@ -36,7 +36,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
} }
protected TriggeredAbilityImpl(Zone zone, Effect effect, boolean optional) { protected TriggeredAbilityImpl(Zone zone, Effect effect, boolean optional) {
super(AbilityType.TRIGGERED, zone); super(AbilityType.TRIGGERED_NONMANA, zone);
setLeavesTheBattlefieldTrigger(false); setLeavesTheBattlefieldTrigger(false);
if (effect != null) { if (effect != null) {
addEffect(effect); addEffect(effect);
@ -265,6 +265,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
/** /**
* For use in generating trigger phrases with correct text * For use in generating trigger phrases with correct text
*
* @return "When " for an effect that always removes the source from the battlefield, otherwise "Whenever " * @return "When " for an effect that always removes the source from the battlefield, otherwise "Whenever "
*/ */
protected final String getWhen() { protected final String getWhen() {

View file

@ -54,19 +54,22 @@ public class FinalChapterAbilityResolvesTriggeredAbility extends TriggeredAbilit
// the ID of the original ability (on the permanent) that the resolving ability // the ID of the original ability (on the permanent) that the resolving ability
// came from. // came from.
Optional<Ability> ability_opt = game.getAbility(event.getTargetId(), event.getSourceId()); Optional<Ability> ability_opt = game.getAbility(event.getTargetId(), event.getSourceId());
if (!ability_opt.isPresent()) if (!ability_opt.isPresent()) {
return false; return false;
}
// Make sure it was a triggered ability (needed for checking if it's a chapter // Make sure it was a triggered ability (needed for checking if it's a chapter
// ability) // ability)
Ability ability = ability_opt.get(); Ability ability = ability_opt.get();
if (!(ability instanceof TriggeredAbility)) if (!(ability.isTriggeredAbility())) {
return false; return false;
}
// Make sure it was a chapter ability // Make sure it was a chapter ability
TriggeredAbility triggeredAbility = (TriggeredAbility) ability; TriggeredAbility triggeredAbility = (TriggeredAbility) ability;
if (!SagaAbility.isChapterAbility(triggeredAbility)) if (!SagaAbility.isChapterAbility(triggeredAbility)) {
return false; return false;
}
// There's a chance that the permanent that this abiltiy came from no longer // There's a chance that the permanent that this abiltiy came from no longer
// exists, so try and find it on the battlefield or check last known // exists, so try and find it on the battlefield or check last known
@ -75,17 +78,17 @@ public class FinalChapterAbilityResolvesTriggeredAbility extends TriggeredAbilit
// chapter ability on that permanent. // chapter ability on that permanent.
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent == null if (permanent == null
|| !permanent.isControlledBy(getControllerId()) || !permanent.isControlledBy(getControllerId())
|| !permanent.hasSubtype(SubType.SAGA, game)) { || !permanent.hasSubtype(SubType.SAGA, game)) {
return false; return false;
} }
// Find the max chapter number from that permanent // Find the max chapter number from that permanent
int maxChapter = CardUtil int maxChapter = CardUtil
.castStream(permanent.getAbilities(game).stream(), SagaAbility.class) .castStream(permanent.getAbilities(game).stream(), SagaAbility.class)
.map(SagaAbility::getMaxChapter) .map(SagaAbility::getMaxChapter)
.mapToInt(SagaChapter::getNumber) .mapToInt(SagaChapter::getNumber)
.sum(); .sum();
// Check if the ability was the last one // Check if the ability was the last one
if (!SagaAbility.isFinalAbility(triggeredAbility, maxChapter)) { if (!SagaAbility.isFinalAbility(triggeredAbility, maxChapter)) {

Some files were not shown because too many files have changed in this diff Show more