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
if (newGameCard.isAbility()) {
if (newGameCard.getAbilityType() == AbilityType.TRIGGERED) {
if (newGameCard.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
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");
}
}

View file

@ -425,9 +425,9 @@ public abstract class CardRenderer {
// Get a string representing the type line
protected String getCardTypeLine() {
if (cardView.isAbility()) {
if (cardView.getAbilityType() == AbilityType.TRIGGERED) {
if (cardView.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
return "Triggered Ability";
} else if (cardView.getAbilityType() == AbilityType.ACTIVATED) {
} else if (cardView.getAbilityType() == AbilityType.ACTIVATED_NONMANA) {
return "Activated Ability";
} else if (cardView.getAbilityType() == null) {
// 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.Cards;
import mage.choices.Choice;
import mage.constants.AbilityType;
import mage.constants.Outcome;
import mage.constants.RangeOfInfluence;
import mage.counters.CounterType;
@ -1082,7 +1081,7 @@ public class ComputerPlayer6 extends ComputerPlayer {
private boolean checkForRepeatedAction(Game sim, SimulationNode2 node, Ability action, UUID playerId) {
// 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;
}
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.effects.Effect;
import mage.cards.Card;
import mage.constants.AbilityType;
import mage.game.Game;
import mage.game.combat.Combat;
import mage.game.events.GameEvent;
@ -100,7 +99,7 @@ public final class SimulatedPlayer2 extends ComputerPlayer {
List<ActivatedAbility> playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer);
playables = filterAbilities(game, playables, suggested);
for (ActivatedAbility ability : playables) {
if (ability.getAbilityType() == AbilityType.MANA) {
if (ability.isManaAbility()) {
continue;
}
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
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) {
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) {
continue;
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -13,6 +13,7 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.Game;
@ -76,11 +77,10 @@ class AutomatedArtificerManaCondition extends ManaCondition {
if (source == null || source.isActivated()) {
return false;
}
switch (source.getAbilityType()) {
case MANA:
case ACTIVATED:
if (source.isActivatedAbility()) {
return true;
case SPELL:
}
if (source.getAbilityType() == AbilityType.SPELL) {
if (source instanceof SpellAbility) {
MageObject object = game.getObject(source);
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.keyword.EquipAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -16,9 +15,9 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.StackAbility;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
import mage.target.common.TargetControlledCreaturePermanent;
/**
* @author TheElk801
@ -79,7 +78,7 @@ class BattlemagesBracersTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false;
}
getEffects().setValue("stackObject", stackAbility);

View file

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

View file

@ -1,31 +1,24 @@
package mage.cards.b;
import java.util.Set;
import java.util.UUID;
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.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.Set;
import java.util.UUID;
/**
*
* @author @stwalsh4118
*/
public final class BladegraftAspirant extends CardImpl {
@ -97,9 +90,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|| !(abilityToModify instanceof ActivatedAbility))) {
if (!abilityToModify.getAbilityType().isActivatedAbility()) {
return false;
}

View file

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

View file

@ -2,7 +2,6 @@ package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
@ -25,7 +24,6 @@ import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author Susucr
*/
public final class BlossomingTortoise extends CardImpl {
@ -121,7 +119,7 @@ class BlossomingTortoiseCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!(abilityToModify instanceof ActivatedAbility)) {
if (!abilityToModify.isActivatedAbility()) {
return false;
}
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);

View file

@ -1,24 +1,23 @@
package mage.cards.b;
import java.util.Optional;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
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.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.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import java.util.Optional;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class BoundInGold extends CardImpl {
@ -90,7 +89,7 @@ class BoundInGoldEffect extends ContinuousRuleModifyingEffectImpl {
case ACTIVATE_ABILITY:
if (enchantment.isAttachedTo(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;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
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.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
*
* @author L_J
*/
public final class BrutalSuppression extends CardImpl {
@ -48,11 +41,13 @@ public final class BrutalSuppression extends CardImpl {
class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land");
static {
filter.add(CardType.LAND.getPredicate());
}
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
static {
filter2.add(SubType.REBEL.getPredicate());
filter.add(TokenPredicate.FALSE);
@ -75,7 +70,7 @@ class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
@Override
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());
if (rebelPermanent != null) {
return filter2.match(rebelPermanent, game);

View file

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

View file

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

View file

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

View file

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

View file

@ -1,13 +1,11 @@
package mage.cards.c;
import java.util.UUID;
import mage.ConditionalMana;
import mage.MageInt;
import mage.MageObject;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.SpellAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost;
@ -24,8 +22,9 @@ import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class CultivatorDrone extends CardImpl {
@ -85,7 +84,7 @@ class CultivatorDroneManaCondition extends ManaCondition implements Condition {
return true;
}
}
if (source instanceof ActivatedAbility && !source.isActivated()) {
if (source.isActivatedAbility() && !source.isActivated()) {
Permanent object = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (object != null && object.getColor(game).isColorless()) {
return true;

View file

@ -5,7 +5,6 @@ import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -22,7 +21,6 @@ import java.util.Optional;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DampingMatrix extends CardImpl {
@ -47,6 +45,7 @@ public final class DampingMatrix extends CardImpl {
class DampingMatrixEffect extends ReplacementEffectImpl {
private static final FilterPermanent filter = new FilterPermanent("artifacts and creatures");
static {
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
@ -82,9 +81,7 @@ class DampingMatrixEffect extends ReplacementEffectImpl {
MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
return true;
}
return ability.isPresent() && !ability.get().isManaActivatedAbility();
}
return false;
}

View file

@ -2,7 +2,6 @@ package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
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 (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) {
if (ability.isActivatedAbility()) {
permanent.addAbility(ability, source.getSourceId(), game, true);
}
}

View file

@ -1,12 +1,6 @@
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.ActivatedAbility;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
@ -25,8 +19,9 @@ import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import java.util.*;
/**
*
* @author L_J
*/
public final class DrainPower extends CardImpl {
@ -84,7 +79,7 @@ class DrainPowerEffect extends OneShotEffect {
List<ActivatedManaAbilityImpl> manaAbilities = new ArrayList<>();
abilitySearch:
for (Ability ability : permanent.getAbilities()) {
if (ability instanceof ActivatedAbility && ability.getAbilityType() == AbilityType.MANA) {
if (AbilityType.ACTIVATED_MANA.equals(ability.getAbilityType())) {
ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability;
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)

View file

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

View file

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

View file

@ -1,15 +1,6 @@
package mage.cards.d;
import java.util.UUID;
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.DelayedTriggeredAbility;
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.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AsThoughEffectType;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.*;
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 java.util.UUID;
/**
*
* @author Xanderhall
*/
public final class DynaheirInvokerAdept extends CardImpl {
@ -121,7 +114,7 @@ class DynaheirInvokerAdeptTriggeredAbility extends DelayedTriggeredAbility {
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl
|| stackAbility.getStackAbility().isManaActivatedAbility()
|| ManaPaidSourceWatcher.getTotalPaid(stackAbility.getId(), game) < 4) {
return false;
}

View file

@ -1,10 +1,8 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.ProtectionAbility;
@ -18,8 +16,9 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author Styxo
*/
public final class EchoBaseCommando extends CardImpl {
@ -84,7 +83,7 @@ class EchoBaseCommandoEffect extends CostModificationEffectImpl {
@Override
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());
if (filter.match(permanent, source.getControllerId(), source, game)) {
return true;

View file

@ -1,7 +1,6 @@
package mage.cards.e;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapTargetCost;
@ -86,8 +85,7 @@ class EmbalmersToolsEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|| (abilityToModify.getAbilityType() == AbilityType.MANA && (abilityToModify instanceof ActivatedAbility))) {
if (abilityToModify.isActivatedAbility()){
// Activated abilities of creatures
Card card = game.getCard(abilityToModify.getSourceId());
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;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
@ -20,8 +18,9 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class ExperimentKraj extends CardImpl {
@ -78,7 +77,7 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
if (perm != null) {
for (Permanent creature : game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
for (Ability ability : creature.getAbilities()) {
if (ability instanceof ActivatedAbility) {
if (ability.isActivatedAbility()) {
perm.addAbility(ability, source.getSourceId(), game, true);
}
}

View file

@ -1,8 +1,6 @@
package mage.cards.f;
import java.util.Optional;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@ -20,6 +18,9 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author LevelX2
*/
@ -83,7 +84,7 @@ class FaithsFettersEffect extends ContinuousRuleModifyingEffectImpl {
Permanent enchantment = game.getPermanent(source.getSourceId());
if (enchantment != null && enchantment.isAttachedTo(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;
}

View file

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

View file

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

View file

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

View file

@ -1,21 +1,20 @@
package mage.cards.h;
import java.util.Optional;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.Optional;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class HandToHand extends CardImpl {
@ -79,9 +78,7 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl {
}
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
return true;
}
return ability.isPresent() && !ability.get().isManaActivatedAbility();
}
}
return false;

View file

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

View file

@ -1,7 +1,6 @@
package mage.cards.h;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl;
@ -68,9 +67,7 @@ class HeartstoneEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|| (abilityToModify.getAbilityType() == AbilityType.MANA
&& (abilityToModify instanceof ActivatedAbility))) {
if (abilityToModify.isActivatedAbility()) {
// Activated abilities of creatures
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
return permanent != null && permanent.isCreature(game);

View file

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

View file

@ -4,7 +4,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -71,7 +70,7 @@ class IllusionistsBracersTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false;
}
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.GainAbilitySourceEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -93,7 +92,7 @@ class ImmolationShamanTriggeredAbility extends TriggeredAbilityImpl {
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}

View file

@ -1,21 +1,14 @@
package mage.cards.i;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.AttacksOrBlocksAttachedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
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.effects.common.*;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -29,8 +22,10 @@ import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import mage.watchers.common.BlockedByOnlyOneCreatureThisCombatWatcher;
import java.util.Set;
import java.util.UUID;
/**
*
* @author L_J
*/
public final class Imprison extends CardImpl {
@ -91,7 +86,7 @@ class ImprisonTriggeredAbility extends TriggeredAbilityImpl {
Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
if (event.getSourceId().equals(enchantedPermanent.getId())) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
String abilityText = stackAbility.getRule(true);
if (abilityText.contains("{T},") || abilityText.contains("{T}:") || abilityText.contains("{T} or")) {
getEffects().get(0).setTargetPointer(new FixedTarget(stackAbility.getId()));

View file

@ -89,7 +89,7 @@ class IntercessorsArrestEffect extends ContinuousRuleModifyingEffectImpl {
case ACTIVATE_ABILITY:
if (enchantment.isAttachedTo(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;

View file

@ -7,7 +7,6 @@ import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
@ -61,7 +60,7 @@ class InterdictPredicate implements Predicate<StackObject> {
@Override
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);
if (sourceObject != null) {
return (sourceObject.isArtifact(game)

View file

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

View file

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

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -78,7 +77,7 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false;
}
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.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.choices.Choice;
@ -139,8 +138,7 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false;
}

View file

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

View file

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

View file

@ -16,13 +16,12 @@ import mage.constants.*;
import mage.counters.CounterType;
import mage.game.Game;
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.StackAbility;
import mage.game.stack.StackObject;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
@ -93,7 +92,7 @@ class MagusLuceaKaneTriggeredAbility extends DelayedTriggeredAbility {
// activated ability
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
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()) {
this.getEffects().setValue("stackObject", (StackObject) stackAbility);
return true;

View file

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

View file

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

View file

@ -1,13 +1,6 @@
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.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl;
@ -18,6 +11,12 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
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
*/
@ -70,7 +69,7 @@ class MirranSafehouseEffect extends ContinuousEffectImpl {
.flatMap(Collection::stream)
.map(card -> card.getAbilities(game))
.flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance)
.filter(Ability::isActivatedAbility)
.collect(Collectors.toSet());
for (Ability ability : abilities) {
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.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -84,9 +83,8 @@ class MoltenDisasterSplitSecondEffect extends ContinuousRuleModifyingEffectImpl
}
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
return KickedCondition.ONCE.apply(game, source);
}
return ability.isPresent() && !ability.get().isManaActivatedAbility()
&& KickedCondition.ONCE.apply(game, source);
}
return false;
}

View file

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

View file

@ -2,7 +2,6 @@ package mage.cards.n;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl;
@ -76,7 +75,7 @@ class NecroticOozeEffect extends ContinuousEffectImpl {
.flatMap(Collection::stream)
.map(card -> card.getAbilities(game))
.flatMap(Collection::stream)
.filter(ActivatedAbility.class::isInstance)
.filter(Ability::isActivatedAbility)
.collect(Collectors.toSet());
for (Ability ability : abilities) {
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.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.Game;
@ -74,8 +73,7 @@ class OmenHawkerManaCondition extends ManaCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
if (source != null && !source.isActivated()) {
return source.getAbilityType() == AbilityType.MANA
|| source.getAbilityType() == AbilityType.ACTIVATED;
return source.isActivatedAbility();
}
return false;
}

View file

@ -1,10 +1,7 @@
package mage.cards.o;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.AttachEffect;
@ -13,21 +10,16 @@ import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
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.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class OppressiveRays extends CardImpl {
@ -80,13 +72,9 @@ class OppressiveRaysCostModificationEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
Permanent creature = game.getPermanent(abilityToModify.getSourceId());
if (creature != null && creature.getAttachments().contains(source.getSourceId())) {
if (abilityToModify instanceof ActivatedAbility
&& !(abilityToModify instanceof SpellAbility)) {
return true;
}
}
return false;
return creature != null
&& creature.getAttachments().contains(source.getSourceId())
&& abilityToModify.isActivatedAbility();
}
@Override

View file

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

View file

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

View file

@ -1,8 +1,6 @@
package mage.cards.p;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
@ -81,9 +79,7 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
Permanent artifact = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
if (artifact != null
&& artifact.getAttachments().contains(source.getSourceId())) {
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|| (abilityToModify.getAbilityType() == AbilityType.MANA
&& (abilityToModify instanceof ActivatedAbility))) {
if (abilityToModify.isActivatedAbility()){
return true;
}
}

View file

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

View file

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

View file

@ -127,7 +127,7 @@ class RexCyberhoundContinuousEffect extends ContinuousEffectImpl {
}
for (Card card : game.getExile().getCards(filter, game)) {
for (Ability ability : card.getAbilities(game)) {
if (ability instanceof ActivatedAbility) {
if (ability.isActivatedAbility()) {
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
copyAbility.setMaxActivationsPerTurn(1);
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.effects.common.CopyStackObjectEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -63,7 +62,7 @@ class RingsOfBrighthearthTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
return false;
}
this.getEffects().setValue("stackObject", stackAbility);

View file

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

View file

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

View file

@ -2,7 +2,6 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CreateTokenEffect;
@ -78,7 +77,7 @@ class SamLoyalAttendantEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!(abilityToModify instanceof ActivatedAbility)) {
if (!(abilityToModify.isActivatedAbility())) {
return false;
}
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.ContinuousEffectImpl;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -25,12 +24,12 @@ import java.util.UUID;
import java.util.stream.Collectors;
/**
*
* @author Susucr
*/
public final class SharkeyTyrantOfTheShire extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("lands your opponents control");
static {
filter.add(CardType.LAND.getPredicate());
filter.add(TargetController.OPPONENT.getControllerPredicate());
@ -100,7 +99,7 @@ class SharkeyTyrantOfTheShireReplacementEffect extends ReplacementEffectImpl {
MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
if (ability.isPresent() && !ability.get().isManaActivatedAbility()) {
return true;
}
}
@ -143,7 +142,7 @@ class SharkeyTyrantOfTheShireContinousEffect extends ContinuousEffectImpl {
.map(permanent -> permanent.getAbilities(game))
.flatMap(Collection::stream)
.filter(Objects::nonNull)
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED) // Mana abilities are separated in their own AbilityType.Mana
.filter(Ability::isNonManaActivatedAbility)
.collect(Collectors.toList())) {
perm.addAbility(ability, source.getSourceId(), game, true);
}

View file

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

View file

@ -1,7 +1,5 @@
package mage.cards.s;
import java.util.Optional;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
@ -10,11 +8,17 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.cards.CardImpl;
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.events.GameEvent;
import mage.util.CardUtil;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
@ -68,7 +72,7 @@ class SorcerousSpyglassActivationEffect extends ContinuousRuleModifyingEffectImp
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
if (ability.isPresent() && object != null) {
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);
}
return false;

View file

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

View file

@ -1,23 +1,18 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.constants.*;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SuppressionField extends CardImpl {
@ -58,7 +53,7 @@ class SuppressionFieldCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED;
return abilityToModify.isNonManaActivatedAbility();
}
@Override

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,28 +1,21 @@
package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.PlayLandAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class TsabosWeb extends CardImpl {
@ -73,9 +66,7 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.isLand(game)) {
for (Ability ability : permanent.getAbilities()) {
if (!(ability instanceof PlayLandAbility)
&& !(ability instanceof ActivatedManaAbilityImpl)
&& ability instanceof ActivatedAbility) {
if (ability.isNonManaActivatedAbility()) {
return true;
}
}

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -117,7 +116,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
// activated ability
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
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()) {
game.getState().setValue(this.getSourceId() + UnboundFlourishing.needPrefix, stackAbility);
return true;

View file

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

View file

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

View file

@ -2,7 +2,6 @@
package org.mage.test.cards.continuous;
import mage.abilities.Ability;
import mage.constants.AbilityType;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.permanent.Permanent;
@ -11,7 +10,6 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
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
* after it regardless of timestamp.
*
* <p>
* 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
* cost of the creature it targeted. Most tokens do not have mana costs
* though.
*
* <p>
* 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.
* 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);
int numberOfActivatedAbilities = 0;
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED) {
if (ability.isActivatedAbility()){
numberOfActivatedAbilities++;
}
}
@ -143,7 +141,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
int numberOfActivatedAbilities = 0;
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
if (ability.getAbilityType() == AbilityType.ACTIVATED) {
if (ability.isActivatedAbility()){
numberOfActivatedAbilities++;
}
}

View file

@ -63,6 +63,6 @@ public class ConspicuousSnoopTest extends CardTestPlayerBase {
setStrictChooseMode(true);
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.mana.ActivatedManaAbilityImpl;
import mage.abilities.mana.ManaAbility;
import mage.constants.AbilityType;
import mage.constants.Zone;
import mage.game.Game;
import mage.util.ThreadLocalStringBuilder;
@ -103,6 +102,11 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
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
public Abilities<ActivatedAbility> getActivatedAbilities(Zone zone) {
return stream()
@ -161,7 +165,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
public Abilities<TriggeredAbility> getTriggeredAbilities(Zone zone) {
Abilities<TriggeredAbility> zonedAbilities = new AbilitiesImpl<>();
for (T ability : this) {
if (ability instanceof TriggeredAbility && ability.getZone().match(zone)) {
if (ability.isTriggeredAbility() && ability.getZone().match(zone)) {
zonedAbilities.add((TriggeredAbility) ability);
} else if (ability instanceof ZoneChangeTriggeredAbility) {
ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility) ability;
@ -176,7 +180,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
@Override
public boolean hasPoolDependantAbilities() {
return stream()
.filter(ability -> ability.getAbilityType() == AbilityType.MANA)
.filter(Ability::isManaAbility)
.map(ManaAbility.class::cast)
.anyMatch(ManaAbility::isPoolDependant);
}

View file

@ -62,6 +62,31 @@ public interface Ability extends Controllable, Serializable {
*/
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.
*

View file

@ -162,6 +162,31 @@ public abstract class AbilityImpl implements Ability {
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
public boolean resolve(Game game) {
boolean result = true;
@ -193,7 +218,7 @@ public abstract class AbilityImpl implements Ability {
boolean effectResult = effect.apply(game, this);
result &= effectResult;
if (logger.isDebugEnabled()) {
if (this.getAbilityType() != AbilityType.MANA) {
if (!this.isManaAbility()) {
if (!effectResult) {
if (this.getSourceId() != null) {
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
// 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);
}
@ -359,6 +384,7 @@ public abstract class AbilityImpl implements Ability {
Outcome outcome = getEffects().getOutcome(this);
// 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();
if (!getTargets().chooseTargets(outcome, this.controllerId, this, noMana, game, canCancel)) {
// 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) {
super(AbilityType.ACTIVATED, zone);
super(AbilityType.ACTIVATED_NONMANA, zone);
this.addEffect(effect);
this.addCost(cost);
}
@ -147,8 +147,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
if (approvingObjects.isEmpty()) {
return ActivationStatus.withoutApprovingObject(true);
}
else {
} else {
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) {
super(AbilityType.TRIGGERED, zone);
super(AbilityType.TRIGGERED_NONMANA, zone);
setLeavesTheBattlefieldTrigger(false);
if (effect != null) {
addEffect(effect);
@ -265,6 +265,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
/**
* For use in generating trigger phrases with correct text
*
* @return "When " for an effect that always removes the source from the battlefield, otherwise "Whenever "
*/
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
// came from.
Optional<Ability> ability_opt = game.getAbility(event.getTargetId(), event.getSourceId());
if (!ability_opt.isPresent())
if (!ability_opt.isPresent()) {
return false;
}
// Make sure it was a triggered ability (needed for checking if it's a chapter
// ability)
Ability ability = ability_opt.get();
if (!(ability instanceof TriggeredAbility))
if (!(ability.isTriggeredAbility())) {
return false;
}
// Make sure it was a chapter ability
TriggeredAbility triggeredAbility = (TriggeredAbility) ability;
if (!SagaAbility.isChapterAbility(triggeredAbility))
if (!SagaAbility.isChapterAbility(triggeredAbility)) {
return false;
}
// 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

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