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

@ -117,7 +117,7 @@ public class ComputerPlayer extends PlayerImpl {
if (hand.size() < 6
|| isTestsMode() // ignore mulligan in tests
|| game.getClass().getName().contains("Momir") // ignore mulligan in Momir games
) {
) {
return false;
}
Set<Card> lands = hand.getCards(new FilterLandCard(), game);
@ -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;
}
@ -2220,7 +2220,7 @@ public class ComputerPlayer extends PlayerImpl {
@Override
public List<Integer> getMultiAmountWithIndividualConstraints(Outcome outcome, List<MultiAmountMessage> messages,
int min, int max, MultiAmountType type, Game game) {
int min, int max, MultiAmountType type, Game game) {
log.debug("getMultiAmount");
int needCount = messages.size();
@ -2767,7 +2767,7 @@ public class ComputerPlayer extends PlayerImpl {
}
protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, Ability source, FilterPermanent filter, Game game, Target target,
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
// searching for most valuable/powerfull permanents
goodList.clear();
badList.clear();

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,15 +77,14 @@ class AutomatedArtificerManaCondition extends ManaCondition {
if (source == null || source.isActivated()) {
return false;
}
switch (source.getAbilityType()) {
case MANA:
case ACTIVATED:
return true;
case SPELL:
if (source instanceof SpellAbility) {
MageObject object = game.getObject(source);
return object != null && object.isArtifact(game);
}
if (source.isActivatedAbility()) {
return true;
}
if (source.getAbilityType() == AbilityType.SPELL) {
if (source instanceof SpellAbility) {
MageObject object = game.getObject(source);
return object != null && object.isArtifact(game);
}
}
return false;
}

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;
@ -73,7 +72,7 @@ class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
if (controller == null) {
return false;
}
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
if (reduceMax <= 0) {
return true;
}
@ -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 {
@ -39,7 +32,7 @@ public final class BladegraftAspirant extends CardImpl {
public BladegraftAspirant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2);
@ -52,7 +45,7 @@ public final class BladegraftAspirant extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1)));
// Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.
this.addAbility(new SimpleStaticAbility(new BladegraftAspirantCostReductionEffect()));
}
@ -71,7 +64,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
private static final String effectText = "Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.";
BladegraftAspirantCostReductionEffect() {
BladegraftAspirantCostReductionEffect() {
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
staticText = effectText;
}
@ -86,7 +79,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
if (controller == null) {
return false;
}
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0);
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0);
if (reduceMax <= 0) {
return true;
}
@ -97,15 +90,13 @@ 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;
}
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
if(!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) {
if (!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) {
return false;
}

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 {
@ -38,7 +36,7 @@ public final class BlossomingTortoise extends CardImpl {
public BlossomingTortoise(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.subtype.add(SubType.TURTLE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
@ -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,12 +41,14 @@ public final class BrutalSuppression extends CardImpl {
class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land");
static{
static {
filter.add(CardType.LAND.getPredicate());
}
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
static{
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,14 +22,15 @@ 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 {
public CultivatorDrone(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.DRONE);
this.power = new MageInt(2);
@ -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,13 +21,12 @@ import java.util.Optional;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DampingMatrix extends CardImpl {
public DampingMatrix(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// Activated abilities of artifacts and creatures can't be activated unless they're mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingMatrixEffect()));
@ -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(),
@ -71,20 +70,18 @@ class DampingMatrixEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
return true;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) {
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
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)
@ -126,7 +121,7 @@ class DrainPowerEffect extends OneShotEffect {
i++;
if (manaAbilitiesMap.get(permanent).size() <= i
|| targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName()
+ "? (Choose \"no\" to activate next mana ability)", source, game)) {
+ "? (Choose \"no\" to activate next mana ability)", source, game)) {
boolean originalCanUndo = manaAbility.isUndoPossible();
manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power
if (targetPlayer.activateAbility(manaAbility, game)) {

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,23 +10,25 @@ 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 {
public DynaheirInvokerAdept(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
@ -50,7 +43,7 @@ public final class DynaheirInvokerAdept extends CardImpl {
// {T}: When you next activate an ability that isn't a mana ability this turn by spending four or more mana to activate it, copy that ability. You may choose new targets for the copy.
this.addAbility(new SimpleActivatedAbility(new CreateDelayedTriggeredAbilityEffect(new DynaheirInvokerAdeptTriggeredAbility()), new TapSourceCost()));
}
private DynaheirInvokerAdept(final DynaheirInvokerAdept card) {
@ -88,9 +81,9 @@ class DynaheirInvokerAdeptHasteEffect extends AsThoughEffectImpl {
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
Permanent permanent = game.getPermanent(sourceId);
return permanent != null
&& permanent.isCreature(game)
&& permanent.isControlledBy(source.getControllerId())
&& !permanent.getId().equals(source.getSourceId());
&& permanent.isCreature(game)
&& permanent.isControlledBy(source.getControllerId())
&& !permanent.getId().equals(source.getSourceId());
}
}
@ -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,14 +18,15 @@ 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 {
public ExperimentKraj(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}{U}{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{U}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.OOZE);
this.subtype.add(SubType.MUTANT);
@ -39,7 +38,7 @@ public final class ExperimentKraj extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ExperimentKrajEffect()));
// {tap}: Put a +1/+1 counter on target creature.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()),new TapSourceCost());
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
@ -76,9 +75,9 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) {
Permanent perm = game.getPermanent(source.getSourceId());
if (perm != null) {
for (Permanent creature :game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)){
for (Ability ability: creature.getAbilities()) {
if (ability instanceof ActivatedAbility) {
for (Permanent creature : game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
for (Ability ability : creature.getAbilities()) {
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) {
MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
if (permanent != null) {
isWhiteEnchantment = permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
}
if (!abilityToModify.isActivatedAbility()) {
return false;
}
return isActivated && isWhiteEnchantment;
MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
return permanent != null && permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
}
@Override

View file

@ -1,27 +1,26 @@
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 {
public HandToHand(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}");
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
// During combat, players can't cast instant spells or activate abilities that aren't mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect()));
@ -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;
@ -56,10 +55,10 @@ class HeartstoneEffect extends CostModificationEffectImpl {
public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(abilityToModify.getControllerId());
if (controller != null) {
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1);
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1);
if (reduceMax <= 0) {
return true;
}
}
CardUtil.reduceCost(abilityToModify, reduceMax);
return true;
}
@ -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 {
@ -38,7 +33,7 @@ public final class Imprison extends CardImpl {
public Imprison(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
this.subtype.add(SubType.AURA);
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
@ -48,7 +43,7 @@ public final class Imprison extends CardImpl {
// Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison.
this.addAbility(new ImprisonTriggeredAbility());
// Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison.
this.addAbility(new AttacksOrBlocksAttachedTriggeredAbility(new DoIfCostPaid(new ImprisonUnblockEffect(), new DestroySourceEffect(), new ManaCostsImpl<>("{1}")), AttachmentType.AURA));
}
@ -91,7 +86,7 @@ class ImprisonTriggeredAbility extends TriggeredAbilityImpl {
Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
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()));
@ -127,15 +122,15 @@ class ImprisonUnblockEffect extends OneShotEffect {
Permanent permanent = game.getPermanent(enchantment.getAttachedTo());
if (permanent != null) {
if (permanent.isCreature(game)) {
// Tap the creature
permanent.tap(source, game);
// Remove it from combat
Effect effect = new RemoveFromCombatTargetEffect();
effect.setTargetPointer(new FixedTarget(permanent, game));
effect.apply(game, source);
// Make blocked creatures unblocked
BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
if (watcher != null) {

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;
@ -45,8 +44,8 @@ public final class LeoriSparktouchedHunter extends CardImpl {
// Whenever Leori, Sparktouched Hunter deals combat damage to a player, choose a planeswalker type. Until end of turn, whenever you activate an ability of a planeswalker of that type, copy that ability. You may choose new targets for the copies.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new LeoriSparktouchedHunterEffect(),
false
new LeoriSparktouchedHunterEffect(),
false
));
}
@ -66,7 +65,7 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
LeoriSparktouchedHunterEffect() {
super(Outcome.Benefit);
this.staticText = "choose a planeswalker type. Until end of turn, whenever you activate an ability " +
"of a planeswalker of that type, copy that ability. You may choose new targets for the copies.";
"of a planeswalker of that type, copy that ability. You may choose new targets for the copies.";
}
private LeoriSparktouchedHunterEffect(final LeoriSparktouchedHunterEffect effect) {
@ -98,8 +97,8 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
game.informPlayers(controller.getLogName() + " has chosen " + subType);
game.addDelayedTriggeredAbility(
new LeoriSparktouchedHunterTriggeredAbility(subType),
source
new LeoriSparktouchedHunterTriggeredAbility(subType),
source
);
return true;
@ -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;
}
@ -155,6 +153,6 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
@Override
public String getRule() {
return "Whenever you activate an ability of a planeswalker of the chosen type, copy that ability. " +
"You may choose new targets for the copies.";
"You may choose new targets for the copies.";
}
}

View file

@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.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,10 +63,8 @@ class HasAbilityWithTapSymbolPredicate implements Predicate<MageObject> {
}
for (Ability ability : abilities) {
if ((ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) && !ability.getCosts().isEmpty()) {
if (ability.hasTapCost()) {
return true;
}
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,27 +10,22 @@ 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 {
public OppressiveRays(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}");
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
this.subtype.add(SubType.AURA);
// Enchant creature
@ -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
&& CardUtil.haveSameNames(object, cardName, game);
}
return false;
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);
}
}

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;
@ -67,10 +65,10 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(abilityToModify.getControllerId());
if (controller != null) {
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
if (reduceMax <= 0) {
return true;
}
}
CardUtil.reduceCost(abilityToModify, reduceMax);
}
return true;
@ -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,9 +79,8 @@ 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)
.collect(Collectors.toList())) {
.filter(ability -> ability.isActivatedAbility())
.collect(Collectors.toList())){
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities
if (!(ability instanceof BasicManaAbility)
|| perm.getAbilities(game)

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());
@ -38,7 +37,7 @@ public final class SharkeyTyrantOfTheShire extends CardImpl {
public SharkeyTyrantOfTheShire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.AVATAR);
this.subtype.add(SubType.ROGUE);
@ -98,9 +97,9 @@ class SharkeyTyrantOfTheShireReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
MageObject object = game.getObject(event.getSourceId());
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) {
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
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,12 +72,8 @@ class ArtifactAbilityManaCondition extends ManaCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
switch (source.getAbilityType()) {
case ACTIVATED:
case MANA:
break;
default:
return false;
if (!source.isActivatedAbility()) {
return false;
}
MageObject object = game.getObject(source);
return object != null && object.isArtifact(game) && !source.isActivated();

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,29 +1,24 @@
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 {
public SuppressionField(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}");
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
// Activated abilities cost {2} more to activate unless they're mana abilities.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect()));
@ -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,12 +123,8 @@ class TazriStalwartSurvivorManaEffect extends ManaEffect {
@Override
public boolean apply(Game game, Ability source) {
switch (source.getAbilityType()) {
case ACTIVATED:
case MANA:
break;
default:
return false;
if (!source.isActivatedAbility()) {
return false;
}
MageObject object = game.getObject(source);
return object != null && object.isCreature(game) && !source.isActivated();
@ -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,34 +1,27 @@
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 {
public TsabosWeb(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// When Tsabo's Web enters the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
@ -66,16 +59,14 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl {
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UNTAP;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.getTurnStepType() == PhaseStep.UNTAP) {
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) {
for (Ability ability : permanent.getAbilities()) {
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;
@ -90,7 +89,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
UnboundFlourishingCopyAbility() {
super(Zone.BATTLEFIELD, new UnboundFlourishingCopyEffect(), false);
setTriggerPhrase("Whenever you cast an instant or sorcery spell or activate an ability, " +
"if that spell's mana cost or that ability's activation cost contains {X}" );
"if that spell's mana cost or that ability's activation cost contains {X}");
}
private UnboundFlourishingCopyAbility(final UnboundFlourishingCopyAbility ability) {
@ -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 {
@ -33,9 +31,9 @@ public class DependentEffectsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence",true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
@ -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++;
}
}
@ -133,7 +131,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
@ -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
@ -75,17 +78,17 @@ public class FinalChapterAbilityResolvesTriggeredAbility extends TriggeredAbilit
// chapter ability on that permanent.
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent == null
|| !permanent.isControlledBy(getControllerId())
|| !permanent.hasSubtype(SubType.SAGA, game)) {
|| !permanent.isControlledBy(getControllerId())
|| !permanent.hasSubtype(SubType.SAGA, game)) {
return false;
}
// Find the max chapter number from that permanent
int maxChapter = CardUtil
.castStream(permanent.getAbilities(game).stream(), SagaAbility.class)
.map(SagaAbility::getMaxChapter)
.mapToInt(SagaChapter::getNumber)
.sum();
.castStream(permanent.getAbilities(game).stream(), SagaAbility.class)
.map(SagaAbility::getMaxChapter)
.mapToInt(SagaChapter::getNumber)
.sum();
// Check if the ability was the last one
if (!SagaAbility.isFinalAbility(triggeredAbility, maxChapter)) {

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