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

@ -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;
} }

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,11 +77,10 @@ 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:
case ACTIVATED:
return true; return true;
case SPELL: }
if (source.getAbilityType() == AbilityType.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);

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;
@ -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 {
@ -97,9 +90,7 @@ 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;
} }

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 {
@ -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,11 +41,13 @@ 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,8 +22,9 @@ 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 {
@ -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,7 +21,6 @@ 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 {
@ -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(),
@ -82,9 +81,7 @@ class DampingMatrixEffect extends ReplacementEffectImpl {
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)

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,16 +10,18 @@ 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 {
@ -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,8 +18,9 @@ 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 {
@ -78,7 +77,7 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
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()); MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
if (permanent != null) { return permanent != null && permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
isWhiteEnchantment = permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
}
}
return isActivated && isWhiteEnchantment;
} }
@Override @Override

View file

@ -1,21 +1,20 @@
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 {
@ -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;
@ -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 {
@ -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()));

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;
@ -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;
} }

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,12 +63,10 @@ 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,21 +10,16 @@ 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 {
@ -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;
@ -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,8 +79,7 @@ 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)

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());
@ -100,7 +99,7 @@ class SharkeyTyrantOfTheShireReplacementEffect extends ReplacementEffectImpl {
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,11 +72,7 @@ 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:
case MANA:
break;
default:
return false; return false;
} }
MageObject object = game.getObject(source); MageObject object = game.getObject(source);

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,23 +1,18 @@
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 {
@ -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,11 +123,7 @@ 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:
case MANA:
break;
default:
return false; return false;
} }
MageObject object = game.getObject(source); MageObject object = game.getObject(source);
@ -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,28 +1,21 @@
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 {
@ -73,9 +66,7 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl {
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;
@ -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 {
@ -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++;
} }
} }
@ -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

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