mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
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:
parent
62cc49ffa3
commit
85cad4ff1e
118 changed files with 486 additions and 574 deletions
|
|
@ -280,9 +280,9 @@ public class CardPanelRenderModeImage extends CardPanel {
|
||||||
|
|
||||||
// Ability icon
|
// Ability icon
|
||||||
if (newGameCard.isAbility()) {
|
if (newGameCard.isAbility()) {
|
||||||
if (newGameCard.getAbilityType() == AbilityType.TRIGGERED) {
|
if (newGameCard.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
|
||||||
setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability");
|
setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability");
|
||||||
} else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED) {
|
} else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED_NONMANA) {
|
||||||
setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability");
|
setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -425,9 +425,9 @@ public abstract class CardRenderer {
|
||||||
// Get a string representing the type line
|
// Get a string representing the type line
|
||||||
protected String getCardTypeLine() {
|
protected String getCardTypeLine() {
|
||||||
if (cardView.isAbility()) {
|
if (cardView.isAbility()) {
|
||||||
if (cardView.getAbilityType() == AbilityType.TRIGGERED) {
|
if (cardView.getAbilityType() == AbilityType.TRIGGERED_NONMANA) {
|
||||||
return "Triggered Ability";
|
return "Triggered Ability";
|
||||||
} else if (cardView.getAbilityType() == AbilityType.ACTIVATED) {
|
} else if (cardView.getAbilityType() == AbilityType.ACTIVATED_NONMANA) {
|
||||||
return "Activated Ability";
|
return "Activated Ability";
|
||||||
} else if (cardView.getAbilityType() == null) {
|
} else if (cardView.getAbilityType() == null) {
|
||||||
// TODO: Triggered abilities waiting to be put onto the stack have abilityType = null. Figure out why
|
// TODO: Triggered abilities waiting to be put onto the stack have abilityType = null. Figure out why
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ import mage.abilities.keyword.*;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.choices.Choice;
|
import mage.choices.Choice;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.RangeOfInfluence;
|
import mage.constants.RangeOfInfluence;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
|
|
@ -1082,7 +1081,7 @@ public class ComputerPlayer6 extends ComputerPlayer {
|
||||||
|
|
||||||
private boolean checkForRepeatedAction(Game sim, SimulationNode2 node, Ability action, UUID playerId) {
|
private boolean checkForRepeatedAction(Game sim, SimulationNode2 node, Ability action, UUID playerId) {
|
||||||
// pass or casting two times a spell multiple times on hand is ok
|
// pass or casting two times a spell multiple times on hand is ok
|
||||||
if (action instanceof PassAbility || action instanceof SpellAbility || action.getAbilityType() == AbilityType.MANA) {
|
if (action instanceof PassAbility || action instanceof SpellAbility || action.isManaAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int newVal = GameStateEvaluator2.evaluate(playerId, sim).getTotalScore();
|
int newVal = GameStateEvaluator2.evaluate(playerId, sim).getTotalScore();
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.costs.mana.VariableManaCost;
|
import mage.abilities.costs.mana.VariableManaCost;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.combat.Combat;
|
import mage.game.combat.Combat;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
|
|
@ -100,7 +99,7 @@ public final class SimulatedPlayer2 extends ComputerPlayer {
|
||||||
List<ActivatedAbility> playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer);
|
List<ActivatedAbility> playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer);
|
||||||
playables = filterAbilities(game, playables, suggested);
|
playables = filterAbilities(game, playables, suggested);
|
||||||
for (ActivatedAbility ability : playables) {
|
for (ActivatedAbility ability : playables) {
|
||||||
if (ability.getAbilityType() == AbilityType.MANA) {
|
if (ability.isManaAbility()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
List<Ability> options = game.getPlayer(playerId).getPlayableOptions(ability, game);
|
List<Ability> options = game.getPlayer(playerId).getPlayableOptions(ability, game);
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ public class ComputerPlayer extends PlayerImpl {
|
||||||
if (hand.size() < 6
|
if (hand.size() < 6
|
||||||
|| isTestsMode() // ignore mulligan in tests
|
|| isTestsMode() // ignore mulligan in tests
|
||||||
|| game.getClass().getName().contains("Momir") // ignore mulligan in Momir games
|
|| game.getClass().getName().contains("Momir") // ignore mulligan in Momir games
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Set<Card> lands = hand.getCards(new FilterLandCard(), game);
|
Set<Card> lands = hand.getCards(new FilterLandCard(), game);
|
||||||
|
|
@ -1498,7 +1498,7 @@ public class ComputerPlayer extends PlayerImpl {
|
||||||
// TODO: wtf?! change to player.getPlayable
|
// TODO: wtf?! change to player.getPlayable
|
||||||
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) {
|
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) {
|
||||||
for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) {
|
for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) {
|
||||||
if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(playerId, game).canActivate()) {
|
if (!ability.isManaActivatedAbility() && ability.canActivate(playerId, game).canActivate()) {
|
||||||
if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) {
|
if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -2220,7 +2220,7 @@ public class ComputerPlayer extends PlayerImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Integer> getMultiAmountWithIndividualConstraints(Outcome outcome, List<MultiAmountMessage> messages,
|
public List<Integer> getMultiAmountWithIndividualConstraints(Outcome outcome, List<MultiAmountMessage> messages,
|
||||||
int min, int max, MultiAmountType type, Game game) {
|
int min, int max, MultiAmountType type, Game game) {
|
||||||
log.debug("getMultiAmount");
|
log.debug("getMultiAmount");
|
||||||
|
|
||||||
int needCount = messages.size();
|
int needCount = messages.size();
|
||||||
|
|
@ -2767,7 +2767,7 @@ public class ComputerPlayer extends PlayerImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, Ability source, FilterPermanent filter, Game game, Target target,
|
protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, Ability source, FilterPermanent filter, Game game, Target target,
|
||||||
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
|
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
|
||||||
// searching for most valuable/powerfull permanents
|
// searching for most valuable/powerfull permanents
|
||||||
goodList.clear();
|
goodList.clear();
|
||||||
badList.clear();
|
badList.clear();
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ import mage.cards.decks.Deck;
|
||||||
import mage.choices.Choice;
|
import mage.choices.Choice;
|
||||||
import mage.choices.ChoiceImpl;
|
import mage.choices.ChoiceImpl;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
|
||||||
|
import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterAttackingCreature;
|
import mage.filter.common.FilterAttackingCreature;
|
||||||
import mage.filter.common.FilterBlockingCreature;
|
import mage.filter.common.FilterBlockingCreature;
|
||||||
|
|
@ -55,9 +57,6 @@ import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
|
|
||||||
import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Human: server side logic to exchange game data between server app and another player's app
|
* Human: server side logic to exchange game data between server app and another player's app
|
||||||
*
|
*
|
||||||
|
|
@ -1165,7 +1164,7 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (controllingPlayer.getUserData().isPassPriorityActivation()
|
if (controllingPlayer.getUserData().isPassPriorityActivation()
|
||||||
&& getJustActivatedType() == AbilityType.ACTIVATED) {
|
&& getJustActivatedType().isNonManaActivatedAbility()) {
|
||||||
setJustActivatedType(null);
|
setJustActivatedType(null);
|
||||||
pass(game);
|
pass(game);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -2365,7 +2364,7 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
}
|
}
|
||||||
if (userData.isUseFirstManaAbility() && object instanceof Permanent && object.isLand(game)) {
|
if (userData.isUseFirstManaAbility() && object instanceof Permanent && object.isLand(game)) {
|
||||||
ActivatedAbility ability = abilities.values().iterator().next();
|
ActivatedAbility ability = abilities.values().iterator().next();
|
||||||
if (ability instanceof ActivatedManaAbilityImpl) {
|
if (ability.isActivatedAbility() && ability.isManaAbility()) {
|
||||||
activateAbility(ability, game);
|
activateAbility(ability, game);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -2427,7 +2426,7 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
// hide on mana activate and show all other
|
// hide on mana activate and show all other
|
||||||
return ability instanceof ActivatedManaAbilityImpl;
|
return ability.isManaActivatedAbility();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -2620,7 +2619,7 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
// triggered abilities can't be skipped by cancel or wrong answer
|
// triggered abilities can't be skipped by cancel or wrong answer
|
||||||
if (source.getAbilityType() != AbilityType.TRIGGERED) {
|
if (!source.isTriggeredAbility()) {
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2788,7 +2787,9 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
holdingPriority = false;
|
holdingPriority = false;
|
||||||
break;
|
break;
|
||||||
case TOGGLE_RECORD_MACRO:
|
case TOGGLE_RECORD_MACRO:
|
||||||
if (true) return; // TODO: macro unsupported in current version
|
if (true) {
|
||||||
|
return; // TODO: macro unsupported in current version
|
||||||
|
}
|
||||||
if (recordingMacro) {
|
if (recordingMacro) {
|
||||||
logger.debug("Finished Recording Macro");
|
logger.debug("Finished Recording Macro");
|
||||||
activatingMacro = true;
|
activatingMacro = true;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -93,8 +92,7 @@ class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
}
|
}
|
||||||
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
return ability.isPresent()
|
return ability.isPresent() && !ability.get().isManaActivatedAbility();
|
||||||
&& !(ability.get() instanceof ActivatedManaAbilityImpl);
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ class AbolethSpawnTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false; // only creatures entering under opponent's control
|
return false; // only creatures entering under opponent's control
|
||||||
}
|
}
|
||||||
Ability stackAbility = stackObject.getStackAbility();
|
Ability stackAbility = stackObject.getStackAbility();
|
||||||
if (!(stackAbility instanceof TriggeredAbility)) {
|
if (!stackAbility.isTriggeredAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
GameEvent triggerEvent = ((TriggeredAbility) stackAbility).getTriggerEvent();
|
GameEvent triggerEvent = ((TriggeredAbility) stackAbility).getTriggerEvent();
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ class AgathaOfTheVileCauldronEffect extends CostModificationEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
// Activated abilities you control
|
// Activated abilities you control
|
||||||
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED
|
if (!abilityToModify.getAbilityType().isActivatedAbility()
|
||||||
|| !abilityToModify.isControlledBy(source.getControllerId())) {
|
|| !abilityToModify.isControlledBy(source.getControllerId())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||||
|
|
@ -132,7 +131,7 @@ class AgathasSoulCauldronAbilityEffect extends ContinuousEffectImpl {
|
||||||
.stream()
|
.stream()
|
||||||
.map(card -> card.getAbilities(game))
|
.map(card -> card.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(ActivatedAbility.class::isInstance)
|
.filter(Ability::isActivatedAbility)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
if (abilities.isEmpty()) {
|
if (abilities.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.a;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.SpellAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||||
|
|
@ -107,9 +106,7 @@ class AngelOfJubilationSacrificeFilterEffect extends CostModificationEffectImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
|
return (abilityToModify.isActivatedAbility() || abilityToModify.getAbilityType() == AbilityType.SPELL)
|
||||||
return (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
|
||||||
|| abilityToModify instanceof SpellAbility)
|
|
||||||
&& game.getState().getPlayersInRange(source.getControllerId(), game).contains(abilityToModify.getControllerId());
|
&& game.getState().getPlayersInRange(source.getControllerId(), game).contains(abilityToModify.getControllerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
|
@ -9,17 +8,18 @@ import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.ChooseACardNameEffect;
|
import mage.abilities.effects.common.ChooseACardNameEffect;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.abilities.effects.common.cost.SpellsCostIncreasingAllEffect;
|
import mage.abilities.effects.common.cost.SpellsCostIncreasingAllEffect;
|
||||||
import mage.constants.*;
|
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.*;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.predicate.mageobject.ChosenNamePredicate;
|
import mage.filter.predicate.mageobject.ChosenNamePredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author weirddan455
|
* @author weirddan455
|
||||||
*/
|
*/
|
||||||
public final class AnointedPeacekeeper extends CardImpl {
|
public final class AnointedPeacekeeper extends CardImpl {
|
||||||
|
|
@ -88,7 +88,7 @@ class AnointedPeacekeeperEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED) {
|
if (!abilityToModify.getAbilityType().isNonManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
MageObject activatedSource = game.getObject(abilityToModify.getSourceId());
|
MageObject activatedSource = game.getObject(abilityToModify.getSourceId());
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.costs.SacrificeCost;
|
import mage.abilities.costs.SacrificeCost;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.keyword.DeathtouchAbility;
|
import mage.abilities.keyword.DeathtouchAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -77,7 +76,7 @@ class AshnodTheUncaringTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null
|
if (stackAbility == null
|
||||||
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl
|
|| stackAbility.getStackAbility().isManaActivatedAbility()
|
||||||
|| stackAbility
|
|| stackAbility
|
||||||
.getStackAbility()
|
.getStackAbility()
|
||||||
.getCosts()
|
.getCosts()
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||||
import mage.abilities.mana.conditional.ManaCondition;
|
import mage.abilities.mana.conditional.ManaCondition;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.AbilityType;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
|
@ -76,15 +77,14 @@ class AutomatedArtificerManaCondition extends ManaCondition {
|
||||||
if (source == null || source.isActivated()) {
|
if (source == null || source.isActivated()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (source.getAbilityType()) {
|
if (source.isActivatedAbility()) {
|
||||||
case MANA:
|
return true;
|
||||||
case ACTIVATED:
|
}
|
||||||
return true;
|
if (source.getAbilityType() == AbilityType.SPELL) {
|
||||||
case SPELL:
|
if (source instanceof SpellAbility) {
|
||||||
if (source instanceof SpellAbility) {
|
MageObject object = game.getObject(source);
|
||||||
MageObject object = game.getObject(source);
|
return object != null && object.isArtifact(game);
|
||||||
return object != null && object.isArtifact(game);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
import mage.abilities.keyword.EquipAbility;
|
import mage.abilities.keyword.EquipAbility;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
|
@ -16,9 +15,9 @@ import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.stack.StackAbility;
|
import mage.game.stack.StackAbility;
|
||||||
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
|
|
@ -79,7 +78,7 @@ class BattlemagesBracersTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
getEffects().setValue("stackObject", stackAbility);
|
getEffects().setValue("stackObject", stackAbility);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.b;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
|
@ -73,7 +72,7 @@ class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
|
||||||
if (controller == null) {
|
if (controller == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
|
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
|
||||||
if (reduceMax <= 0) {
|
if (reduceMax <= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -84,9 +83,7 @@ class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED
|
if (!abilityToModify.getAbilityType().isActivatedAbility()) {
|
||||||
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|
|
||||||
|| !(abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//Activated abilities of creatures you control
|
//Activated abilities of creatures you control
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,24 @@
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.util.CardUtil;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||||
import mage.abilities.keyword.MenaceAbility;
|
import mage.abilities.keyword.MenaceAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
import mage.filter.FilterCard;
|
||||||
import mage.constants.CostModificationType;
|
import mage.game.Game;
|
||||||
import mage.constants.Duration;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.constants.Outcome;
|
import mage.players.Player;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author @stwalsh4118
|
* @author @stwalsh4118
|
||||||
*/
|
*/
|
||||||
public final class BladegraftAspirant extends CardImpl {
|
public final class BladegraftAspirant extends CardImpl {
|
||||||
|
|
@ -39,7 +32,7 @@ public final class BladegraftAspirant extends CardImpl {
|
||||||
|
|
||||||
public BladegraftAspirant(UUID ownerId, CardSetInfo setInfo) {
|
public BladegraftAspirant(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
||||||
|
|
||||||
this.subtype.add(SubType.PHYREXIAN);
|
this.subtype.add(SubType.PHYREXIAN);
|
||||||
this.subtype.add(SubType.WARRIOR);
|
this.subtype.add(SubType.WARRIOR);
|
||||||
this.power = new MageInt(2);
|
this.power = new MageInt(2);
|
||||||
|
|
@ -52,7 +45,7 @@ public final class BladegraftAspirant extends CardImpl {
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1)));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1)));
|
||||||
|
|
||||||
// Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.
|
// Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.
|
||||||
|
|
||||||
this.addAbility(new SimpleStaticAbility(new BladegraftAspirantCostReductionEffect()));
|
this.addAbility(new SimpleStaticAbility(new BladegraftAspirantCostReductionEffect()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +64,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
private static final String effectText = "Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.";
|
private static final String effectText = "Activated abilities of Equipment you control that target Bladegraft Aspirant cost {1} less to activate.";
|
||||||
|
|
||||||
BladegraftAspirantCostReductionEffect() {
|
BladegraftAspirantCostReductionEffect() {
|
||||||
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
|
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
|
||||||
staticText = effectText;
|
staticText = effectText;
|
||||||
}
|
}
|
||||||
|
|
@ -86,7 +79,7 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
|
||||||
if (controller == null) {
|
if (controller == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0);
|
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 0);
|
||||||
if (reduceMax <= 0) {
|
if (reduceMax <= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -97,15 +90,13 @@ class BladegraftAspirantCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED
|
if (!abilityToModify.getAbilityType().isActivatedAbility()) {
|
||||||
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|
|
||||||
|| !(abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
||||||
|
|
||||||
if(!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) {
|
if (!(permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT) && permanent.isControlledBy(source.getControllerId()))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
|
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
|
@ -11,20 +8,17 @@ import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Layer;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubLayer;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class BloodSun extends CardImpl {
|
public final class BloodSun extends CardImpl {
|
||||||
|
|
@ -73,9 +67,9 @@ class BloodSunEffect extends ContinuousEffectImpl {
|
||||||
switch (layer) {
|
switch (layer) {
|
||||||
case AbilityAddingRemovingEffects_6:
|
case AbilityAddingRemovingEffects_6:
|
||||||
List<Ability> toRemove = new ArrayList<>();
|
List<Ability> toRemove = new ArrayList<>();
|
||||||
permanent.getAbilities().forEach(a -> {
|
permanent.getAbilities().forEach(ability -> {
|
||||||
if (a.getAbilityType() != AbilityType.MANA) {
|
if (!ability.getAbilityType().isManaAbility()) {
|
||||||
toRemove.add(a);
|
toRemove.add(ability);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
permanent.removeAbilities(toRemove, source.getSourceId(), game);
|
permanent.removeAbilities(toRemove, source.getSourceId(), game);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.b;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
|
@ -25,7 +24,6 @@ import mage.util.CardUtil;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Susucr
|
* @author Susucr
|
||||||
*/
|
*/
|
||||||
public final class BlossomingTortoise extends CardImpl {
|
public final class BlossomingTortoise extends CardImpl {
|
||||||
|
|
@ -38,7 +36,7 @@ public final class BlossomingTortoise extends CardImpl {
|
||||||
|
|
||||||
public BlossomingTortoise(UUID ownerId, CardSetInfo setInfo) {
|
public BlossomingTortoise(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
|
||||||
|
|
||||||
this.subtype.add(SubType.TURTLE);
|
this.subtype.add(SubType.TURTLE);
|
||||||
this.power = new MageInt(3);
|
this.power = new MageInt(3);
|
||||||
this.toughness = new MageInt(3);
|
this.toughness = new MageInt(3);
|
||||||
|
|
@ -121,7 +119,7 @@ class BlossomingTortoiseCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (!(abilityToModify instanceof ActivatedAbility)) {
|
if (!abilityToModify.isActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);
|
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,23 @@
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import java.util.Optional;
|
import mage.abilities.Ability;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect;
|
|
||||||
import mage.constants.*;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
|
import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect;
|
||||||
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.*;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
|
||||||
import mage.cards.CardImpl;
|
import java.util.Optional;
|
||||||
import mage.cards.CardSetInfo;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author weirddan455
|
* @author weirddan455
|
||||||
*/
|
*/
|
||||||
public final class BoundInGold extends CardImpl {
|
public final class BoundInGold extends CardImpl {
|
||||||
|
|
@ -90,7 +89,7 @@ class BoundInGoldEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
case ACTIVATE_ABILITY:
|
case ACTIVATE_ABILITY:
|
||||||
if (enchantment.isAttachedTo(event.getSourceId())) {
|
if (enchantment.isAttachedTo(event.getSourceId())) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
return ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA;
|
return ability.isPresent() && ability.get().isNonManaActivatedAbility();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,22 @@
|
||||||
|
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CostModificationType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.filter.predicate.permanent.TokenPredicate;
|
import mage.filter.predicate.permanent.TokenPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.common.TargetControlledPermanent;
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author L_J
|
* @author L_J
|
||||||
*/
|
*/
|
||||||
public final class BrutalSuppression extends CardImpl {
|
public final class BrutalSuppression extends CardImpl {
|
||||||
|
|
@ -48,12 +41,14 @@ public final class BrutalSuppression extends CardImpl {
|
||||||
class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
|
class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land");
|
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land");
|
||||||
static{
|
|
||||||
|
static {
|
||||||
filter.add(CardType.LAND.getPredicate());
|
filter.add(CardType.LAND.getPredicate());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
|
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
|
||||||
static{
|
|
||||||
|
static {
|
||||||
filter2.add(SubType.REBEL.getPredicate());
|
filter2.add(SubType.REBEL.getPredicate());
|
||||||
filter.add(TokenPredicate.FALSE);
|
filter.add(TokenPredicate.FALSE);
|
||||||
}
|
}
|
||||||
|
|
@ -75,7 +70,7 @@ class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || abilityToModify.getAbilityType() == AbilityType.MANA) {
|
if (abilityToModify.isActivatedAbility()){
|
||||||
Permanent rebelPermanent = game.getPermanent(abilityToModify.getSourceId());
|
Permanent rebelPermanent = game.getPermanent(abilityToModify.getSourceId());
|
||||||
if (rebelPermanent != null) {
|
if (rebelPermanent != null) {
|
||||||
return filter2.match(rebelPermanent, game);
|
return filter2.match(rebelPermanent, game);
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,11 @@ import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.events.GameEvent.EventType;
|
|
||||||
import mage.game.stack.StackAbility;
|
import mage.game.stack.StackAbility;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
|
|
@ -68,7 +66,7 @@ class BurningTreeShamanTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility != null && stackAbility.getAbilityType() == AbilityType.ACTIVATED) {
|
if (stackAbility != null && stackAbility.isNonManaActivatedAbility()) {
|
||||||
for (Effect effect : getEffects()) {
|
for (Effect effect : getEffects()) {
|
||||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.common.ControlYourCommanderCondition;
|
import mage.abilities.condition.common.ControlYourCommanderCondition;
|
||||||
|
|
@ -76,7 +75,7 @@ class ConvergenceOfDominionEffect extends CostModificationEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return ControlYourCommanderCondition.instance.apply(game, source)
|
return ControlYourCommanderCondition.instance.apply(game, source)
|
||||||
&& abilityToModify instanceof ActivatedAbility
|
&& abilityToModify.isActivatedAbility()
|
||||||
&& game.getState().getZone(abilityToModify.getSourceId()) == Zone.GRAVEYARD;
|
&& game.getState().getZone(abilityToModify.getSourceId()) == Zone.GRAVEYARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,23 @@
|
||||||
|
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.stack.StackAbility;
|
import mage.game.stack.StackAbility;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author spjspj
|
* @author spjspj
|
||||||
*/
|
*/
|
||||||
public final class CrackdownConstruct extends CardImpl {
|
public final class CrackdownConstruct extends CardImpl {
|
||||||
|
|
@ -71,9 +70,7 @@ class CrackdownConstructTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
||||||
if (source != null && (source.isArtifact(game) || source.isCreature(game))) {
|
if (source != null && (source.isArtifact(game) || source.isCreature(game))) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
return !stackAbility.getStackAbility().isManaActivatedAbility();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.ConditionalMana;
|
import mage.ConditionalMana;
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.Mana;
|
import mage.Mana;
|
||||||
|
|
@ -20,12 +19,13 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||||
import mage.abilities.mana.conditional.ManaCondition;
|
import mage.abilities.mana.conditional.ManaCondition;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
|
|
@ -94,12 +94,9 @@ class CrypticTrilobiteManaCondition extends ManaCondition implements Condition {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
if (source != null && !source.isActivated()) {
|
return source != null
|
||||||
// ex: SimpleManaAbility is an ACTIVATED ability, but it is categorized as a MANA ability
|
&& !source.isActivated()
|
||||||
return source.getAbilityType() == AbilityType.MANA
|
&& source.isActivatedAbility();
|
||||||
|| source.getAbilityType() == AbilityType.ACTIVATED;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
|
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.ConditionalMana;
|
import mage.ConditionalMana;
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.Mana;
|
import mage.Mana;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.SpellAbility;
|
import mage.abilities.SpellAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
|
|
@ -24,14 +22,15 @@ import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class CultivatorDrone extends CardImpl {
|
public final class CultivatorDrone extends CardImpl {
|
||||||
|
|
||||||
public CultivatorDrone(UUID ownerId, CardSetInfo setInfo) {
|
public CultivatorDrone(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
|
||||||
this.subtype.add(SubType.ELDRAZI);
|
this.subtype.add(SubType.ELDRAZI);
|
||||||
this.subtype.add(SubType.DRONE);
|
this.subtype.add(SubType.DRONE);
|
||||||
this.power = new MageInt(2);
|
this.power = new MageInt(2);
|
||||||
|
|
@ -85,7 +84,7 @@ class CultivatorDroneManaCondition extends ManaCondition implements Condition {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (source instanceof ActivatedAbility && !source.isActivated()) {
|
if (source.isActivatedAbility() && !source.isActivated()) {
|
||||||
Permanent object = game.getPermanentOrLKIBattlefield(source.getSourceId());
|
Permanent object = game.getPermanentOrLKIBattlefield(source.getSourceId());
|
||||||
if (object != null && object.getColor(game).isColorless()) {
|
if (object != null && object.getColor(game).isColorless()) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ReplacementEffectImpl;
|
import mage.abilities.effects.ReplacementEffectImpl;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -22,13 +21,12 @@ import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class DampingMatrix extends CardImpl {
|
public final class DampingMatrix extends CardImpl {
|
||||||
|
|
||||||
public DampingMatrix(UUID ownerId, CardSetInfo setInfo) {
|
public DampingMatrix(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
|
||||||
|
|
||||||
// Activated abilities of artifacts and creatures can't be activated unless they're mana abilities.
|
// Activated abilities of artifacts and creatures can't be activated unless they're mana abilities.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingMatrixEffect()));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingMatrixEffect()));
|
||||||
|
|
@ -47,6 +45,7 @@ public final class DampingMatrix extends CardImpl {
|
||||||
class DampingMatrixEffect extends ReplacementEffectImpl {
|
class DampingMatrixEffect extends ReplacementEffectImpl {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("artifacts and creatures");
|
private static final FilterPermanent filter = new FilterPermanent("artifacts and creatures");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(Predicates.or(
|
filter.add(Predicates.or(
|
||||||
CardType.ARTIFACT.getPredicate(),
|
CardType.ARTIFACT.getPredicate(),
|
||||||
|
|
@ -71,20 +70,18 @@ class DampingMatrixEffect extends ReplacementEffectImpl {
|
||||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checksEventType(GameEvent event, Game game) {
|
public boolean checksEventType(GameEvent event, Game game) {
|
||||||
return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
|
return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
MageObject object = game.getObject(event.getSourceId());
|
MageObject object = game.getObject(event.getSourceId());
|
||||||
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) {
|
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
|
||||||
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
|
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
|
||||||
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
|
return ability.isPresent() && !ability.get().isManaActivatedAbility();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.d;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
|
@ -109,7 +108,7 @@ class DarkImpostorContinuousEffect extends ContinuousEffectImpl {
|
||||||
}
|
}
|
||||||
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
|
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
permanent.addAbility(ability, source.getSourceId(), game, true);
|
permanent.addAbility(ability, source.getSourceId(), game, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,6 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.costs.mana.ManaCost;
|
import mage.abilities.costs.mana.ManaCost;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
||||||
|
|
@ -25,8 +19,9 @@ import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.TargetPlayer;
|
import mage.target.TargetPlayer;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author L_J
|
* @author L_J
|
||||||
*/
|
*/
|
||||||
public final class DrainPower extends CardImpl {
|
public final class DrainPower extends CardImpl {
|
||||||
|
|
@ -84,7 +79,7 @@ class DrainPowerEffect extends OneShotEffect {
|
||||||
List<ActivatedManaAbilityImpl> manaAbilities = new ArrayList<>();
|
List<ActivatedManaAbilityImpl> manaAbilities = new ArrayList<>();
|
||||||
abilitySearch:
|
abilitySearch:
|
||||||
for (Ability ability : permanent.getAbilities()) {
|
for (Ability ability : permanent.getAbilities()) {
|
||||||
if (ability instanceof ActivatedAbility && ability.getAbilityType() == AbilityType.MANA) {
|
if (AbilityType.ACTIVATED_MANA.equals(ability.getAbilityType())) {
|
||||||
ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability;
|
ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability;
|
||||||
if (manaAbility.canActivate(targetPlayer.getId(), game).canActivate()) {
|
if (manaAbility.canActivate(targetPlayer.getId(), game).canActivate()) {
|
||||||
// canActivate can't check for mana abilities that require a mana cost, if the payment isn't possible (Cabal Coffers etc)
|
// canActivate can't check for mana abilities that require a mana cost, if the payment isn't possible (Cabal Coffers etc)
|
||||||
|
|
@ -126,7 +121,7 @@ class DrainPowerEffect extends OneShotEffect {
|
||||||
i++;
|
i++;
|
||||||
if (manaAbilitiesMap.get(permanent).size() <= i
|
if (manaAbilitiesMap.get(permanent).size() <= i
|
||||||
|| targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName()
|
|| targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName()
|
||||||
+ "? (Choose \"no\" to activate next mana ability)", source, game)) {
|
+ "? (Choose \"no\" to activate next mana ability)", source, game)) {
|
||||||
boolean originalCanUndo = manaAbility.isUndoPossible();
|
boolean originalCanUndo = manaAbility.isUndoPossible();
|
||||||
manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power
|
manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power
|
||||||
if (targetPlayer.activateAbility(manaAbility, game)) {
|
if (targetPlayer.activateAbility(manaAbility, game)) {
|
||||||
|
|
|
||||||
|
|
@ -120,8 +120,7 @@ class DranaAndLinvalaGainAbilitiesEffect extends ContinuousEffectImpl {
|
||||||
.map(permanent -> permanent.getAbilities(game))
|
.map(permanent -> permanent.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED
|
.filter(Ability::isActivatedAbility)
|
||||||
|| ability.getAbilityType() == AbilityType.MANA)
|
|
||||||
.collect(Collectors.toList())) {
|
.collect(Collectors.toList())) {
|
||||||
Ability addedAbility = perm.addAbility(ability, source.getSourceId(), game, true);
|
Ability addedAbility = perm.addAbility(ability, source.getSourceId(), game, true);
|
||||||
if (addedAbility != null) {
|
if (addedAbility != null) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
|
@ -10,20 +9,13 @@ import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.CostModificationType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.TargetController;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.target.common.TargetControlledPermanent;
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author L_J
|
* @author L_J
|
||||||
*/
|
*/
|
||||||
public final class Drought extends CardImpl {
|
public final class Drought extends CardImpl {
|
||||||
|
|
@ -81,7 +73,7 @@ class DroughtAdditionalCostEffect extends CostModificationEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return (appliesToSpells && abilityToModify.getAbilityType() == AbilityType.SPELL)
|
return (appliesToSpells && abilityToModify.getAbilityType() == AbilityType.SPELL)
|
||||||
|| (!appliesToSpells && (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || abilityToModify.getAbilityType() == AbilityType.MANA));
|
|| (!appliesToSpells && abilityToModify.isActivatedAbility());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,6 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.game.stack.StackAbility;
|
|
||||||
import mage.watchers.common.ManaPaidSourceWatcher;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.DelayedTriggeredAbility;
|
import mage.abilities.DelayedTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -19,23 +10,25 @@ import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AsThoughEffectType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
import mage.game.Game;
|
||||||
import mage.constants.Duration;
|
import mage.game.events.GameEvent;
|
||||||
import mage.constants.Outcome;
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.game.stack.StackAbility;
|
||||||
|
import mage.watchers.common.ManaPaidSourceWatcher;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Xanderhall
|
* @author Xanderhall
|
||||||
*/
|
*/
|
||||||
public final class DynaheirInvokerAdept extends CardImpl {
|
public final class DynaheirInvokerAdept extends CardImpl {
|
||||||
|
|
||||||
public DynaheirInvokerAdept(UUID ownerId, CardSetInfo setInfo) {
|
public DynaheirInvokerAdept(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
this.subtype.add(SubType.HUMAN);
|
this.subtype.add(SubType.HUMAN);
|
||||||
this.subtype.add(SubType.WIZARD);
|
this.subtype.add(SubType.WIZARD);
|
||||||
|
|
@ -50,7 +43,7 @@ public final class DynaheirInvokerAdept extends CardImpl {
|
||||||
|
|
||||||
// {T}: When you next activate an ability that isn't a mana ability this turn by spending four or more mana to activate it, copy that ability. You may choose new targets for the copy.
|
// {T}: When you next activate an ability that isn't a mana ability this turn by spending four or more mana to activate it, copy that ability. You may choose new targets for the copy.
|
||||||
this.addAbility(new SimpleActivatedAbility(new CreateDelayedTriggeredAbilityEffect(new DynaheirInvokerAdeptTriggeredAbility()), new TapSourceCost()));
|
this.addAbility(new SimpleActivatedAbility(new CreateDelayedTriggeredAbilityEffect(new DynaheirInvokerAdeptTriggeredAbility()), new TapSourceCost()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DynaheirInvokerAdept(final DynaheirInvokerAdept card) {
|
private DynaheirInvokerAdept(final DynaheirInvokerAdept card) {
|
||||||
|
|
@ -88,9 +81,9 @@ class DynaheirInvokerAdeptHasteEffect extends AsThoughEffectImpl {
|
||||||
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
|
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
|
||||||
Permanent permanent = game.getPermanent(sourceId);
|
Permanent permanent = game.getPermanent(sourceId);
|
||||||
return permanent != null
|
return permanent != null
|
||||||
&& permanent.isCreature(game)
|
&& permanent.isCreature(game)
|
||||||
&& permanent.isControlledBy(source.getControllerId())
|
&& permanent.isControlledBy(source.getControllerId())
|
||||||
&& !permanent.getId().equals(source.getSourceId());
|
&& !permanent.getId().equals(source.getSourceId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -121,7 +114,7 @@ class DynaheirInvokerAdeptTriggeredAbility extends DelayedTriggeredAbility {
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null
|
if (stackAbility == null
|
||||||
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl
|
|| stackAbility.getStackAbility().isManaActivatedAbility()
|
||||||
|| ManaPaidSourceWatcher.getTotalPaid(stackAbility.getId(), game) < 4) {
|
|| ManaPaidSourceWatcher.getTotalPaid(stackAbility.getId(), game) < 4) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
|
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.abilities.keyword.ProtectionAbility;
|
import mage.abilities.keyword.ProtectionAbility;
|
||||||
|
|
@ -18,8 +16,9 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Styxo
|
* @author Styxo
|
||||||
*/
|
*/
|
||||||
public final class EchoBaseCommando extends CardImpl {
|
public final class EchoBaseCommando extends CardImpl {
|
||||||
|
|
@ -84,7 +83,7 @@ class EchoBaseCommandoEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED || (abilityToModify.getAbilityType() == AbilityType.MANA && (abilityToModify instanceof ActivatedAbility))) {
|
if (abilityToModify.isActivatedAbility()){
|
||||||
Permanent permanent = game.getPermanent(abilityToModify.getSourceId());
|
Permanent permanent = game.getPermanent(abilityToModify.getSourceId());
|
||||||
if (filter.match(permanent, source.getControllerId(), source, game)) {
|
if (filter.match(permanent, source.getControllerId(), source, game)) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.TapTargetCost;
|
import mage.abilities.costs.common.TapTargetCost;
|
||||||
|
|
@ -86,8 +85,7 @@ class EmbalmersToolsEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
if (abilityToModify.isActivatedAbility()){
|
||||||
|| (abilityToModify.getAbilityType() == AbilityType.MANA && (abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
// Activated abilities of creatures
|
// Activated abilities of creatures
|
||||||
Card card = game.getCard(abilityToModify.getSourceId());
|
Card card = game.getCard(abilityToModify.getSourceId());
|
||||||
if (filter.match(card, source.getControllerId(), source, game) && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {
|
if (filter.match(card, source.getControllerId(), source, game) && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
|
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
|
@ -20,14 +18,15 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class ExperimentKraj extends CardImpl {
|
public final class ExperimentKraj extends CardImpl {
|
||||||
|
|
||||||
public ExperimentKraj(UUID ownerId, CardSetInfo setInfo) {
|
public ExperimentKraj(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}{U}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{U}{U}");
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
this.subtype.add(SubType.OOZE);
|
this.subtype.add(SubType.OOZE);
|
||||||
this.subtype.add(SubType.MUTANT);
|
this.subtype.add(SubType.MUTANT);
|
||||||
|
|
@ -39,7 +38,7 @@ public final class ExperimentKraj extends CardImpl {
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ExperimentKrajEffect()));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ExperimentKrajEffect()));
|
||||||
|
|
||||||
// {tap}: Put a +1/+1 counter on target creature.
|
// {tap}: Put a +1/+1 counter on target creature.
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()),new TapSourceCost());
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new TapSourceCost());
|
||||||
ability.addTarget(new TargetCreaturePermanent());
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
@ -76,9 +75,9 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Permanent perm = game.getPermanent(source.getSourceId());
|
Permanent perm = game.getPermanent(source.getSourceId());
|
||||||
if (perm != null) {
|
if (perm != null) {
|
||||||
for (Permanent creature :game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)){
|
for (Permanent creature : game.getState().getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
|
||||||
for (Ability ability: creature.getAbilities()) {
|
for (Ability ability : creature.getAbilities()) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
perm.addAbility(ability, source.getSourceId(), game, true);
|
perm.addAbility(ability, source.getSourceId(), game, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
|
|
||||||
package mage.cards.f;
|
package mage.cards.f;
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
|
@ -20,6 +18,9 @@ import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
|
|
@ -83,7 +84,7 @@ class FaithsFettersEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
Permanent enchantment = game.getPermanent(source.getSourceId());
|
Permanent enchantment = game.getPermanent(source.getSourceId());
|
||||||
if (enchantment != null && enchantment.isAttachedTo(event.getSourceId())) {
|
if (enchantment != null && enchantment.isAttachedTo(event.getSourceId())) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA) {
|
if (ability.isPresent() && ability.get().isManaAbility()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.ExileSpellEffect;
|
import mage.abilities.effects.common.ExileSpellEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.ModalDoubleFacedCard;
|
import mage.cards.ModalDoubleFacedCard;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
|
@ -97,7 +96,7 @@ class FlamescrollCelebrantTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
|
getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.f;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
|
|
@ -76,9 +75,7 @@ class ForensicGadgeteerEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
if (abilityToModify.isActivatedAbility()){
|
||||||
|| (abilityToModify.getAbilityType() == AbilityType.MANA
|
|
||||||
&& (abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
// Activated abilities of artifacts
|
// Activated abilities of artifacts
|
||||||
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
||||||
return permanent != null
|
return permanent != null
|
||||||
|
|
|
||||||
|
|
@ -66,15 +66,11 @@ class GloomCostIncreaseEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
boolean isWhiteEnchantment = false;
|
if (!abilityToModify.isActivatedAbility()) {
|
||||||
boolean isActivated = abilityToModify.getAbilityType() == AbilityType.ACTIVATED;
|
return false;
|
||||||
if (isActivated) {
|
|
||||||
MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
|
|
||||||
if (permanent != null) {
|
|
||||||
isWhiteEnchantment = permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return isActivated && isWhiteEnchantment;
|
MageObject permanent = game.getPermanent(abilityToModify.getSourceId());
|
||||||
|
return permanent != null && permanent.isEnchantment(game) && permanent.getColor(game).isWhite();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,26 @@
|
||||||
|
|
||||||
package mage.cards.h;
|
package mage.cards.h;
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author fireshoes
|
* @author fireshoes
|
||||||
*/
|
*/
|
||||||
public final class HandToHand extends CardImpl {
|
public final class HandToHand extends CardImpl {
|
||||||
|
|
||||||
public HandToHand(UUID ownerId, CardSetInfo setInfo) {
|
public HandToHand(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
|
||||||
|
|
||||||
// During combat, players can't cast instant spells or activate abilities that aren't mana abilities.
|
// During combat, players can't cast instant spells or activate abilities that aren't mana abilities.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect()));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect()));
|
||||||
|
|
@ -79,9 +78,7 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
}
|
}
|
||||||
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
|
return ability.isPresent() && !ability.get().isManaActivatedAbility();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.dynamicvalue.common.StaticValue;
|
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -72,7 +71,7 @@ class HarshMentorTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
||||||
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
|
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
for (Effect effect : getEffects()) {
|
for (Effect effect : getEffects()) {
|
||||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.h;
|
package mage.cards.h;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -56,10 +55,10 @@ class HeartstoneEffect extends CostModificationEffectImpl {
|
||||||
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
||||||
Player controller = game.getPlayer(abilityToModify.getControllerId());
|
Player controller = game.getPlayer(abilityToModify.getControllerId());
|
||||||
if (controller != null) {
|
if (controller != null) {
|
||||||
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1);
|
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 1, 1);
|
||||||
if (reduceMax <= 0) {
|
if (reduceMax <= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
CardUtil.reduceCost(abilityToModify, reduceMax);
|
CardUtil.reduceCost(abilityToModify, reduceMax);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -68,9 +67,7 @@ class HeartstoneEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
if (abilityToModify.isActivatedAbility()) {
|
||||||
|| (abilityToModify.getAbilityType() == AbilityType.MANA
|
|
||||||
&& (abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
// Activated abilities of creatures
|
// Activated abilities of creatures
|
||||||
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
Permanent permanent = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
||||||
return permanent != null && permanent.isCreature(game);
|
return permanent != null && permanent.isCreature(game);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import mage.MageItem;
|
import mage.MageItem;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbility;
|
import mage.abilities.TriggeredAbility;
|
||||||
|
|
@ -28,8 +26,9 @@ import mage.game.events.GameEvent;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetpointer.FirstTargetPointer;
|
import mage.target.targetpointer.FirstTargetPointer;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author DominionSpy
|
* @author DominionSpy
|
||||||
*/
|
*/
|
||||||
public final class IllicitMasquerade extends CardImpl {
|
public final class IllicitMasquerade extends CardImpl {
|
||||||
|
|
@ -107,7 +106,7 @@ enum IllicitMasqueradePredicate implements ObjectSourcePlayerPredicate<MageItem>
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(ObjectSourcePlayer<MageItem> input, Game game) {
|
public boolean apply(ObjectSourcePlayer<MageItem> input, Game game) {
|
||||||
Ability ability = input.getSource();
|
Ability ability = input.getSource();
|
||||||
if (!(ability instanceof TriggeredAbility)) {
|
if (!ability.isTriggeredAbility()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
GameEvent event = ((TriggeredAbility) ability).getTriggerEvent();
|
GameEvent event = ((TriggeredAbility) ability).getTriggerEvent();
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.keyword.EquipAbility;
|
import mage.abilities.keyword.EquipAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -71,7 +70,7 @@ class IllusionistsBracersTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.getEffects().setValue("stackObject", stackAbility);
|
this.getEffects().setValue("stackObject", stackAbility);
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
import mage.abilities.keyword.MenaceAbility;
|
import mage.abilities.keyword.MenaceAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -93,7 +92,7 @@ class ImmolationShamanTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
||||||
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
|
if (source != null && (source.isArtifact(game) || source.isCreature(game) || source.isLand(game))) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
for (Effect effect : getEffects()) {
|
for (Effect effect : getEffects()) {
|
||||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,14 @@
|
||||||
|
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.AttacksOrBlocksAttachedTriggeredAbility;
|
import mage.abilities.common.AttacksOrBlocksAttachedTriggeredAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.*;
|
||||||
import mage.abilities.effects.common.CounterTargetEffect;
|
|
||||||
import mage.abilities.effects.common.DestroySourceEffect;
|
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
|
||||||
import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
|
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
|
@ -29,8 +22,10 @@ import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
import mage.watchers.common.BlockedByOnlyOneCreatureThisCombatWatcher;
|
import mage.watchers.common.BlockedByOnlyOneCreatureThisCombatWatcher;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author L_J
|
* @author L_J
|
||||||
*/
|
*/
|
||||||
public final class Imprison extends CardImpl {
|
public final class Imprison extends CardImpl {
|
||||||
|
|
@ -38,7 +33,7 @@ public final class Imprison extends CardImpl {
|
||||||
public Imprison(UUID ownerId, CardSetInfo setInfo) {
|
public Imprison(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
|
||||||
this.subtype.add(SubType.AURA);
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
// Enchant creature
|
// Enchant creature
|
||||||
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
||||||
this.getSpellAbility().addTarget(auraTarget);
|
this.getSpellAbility().addTarget(auraTarget);
|
||||||
|
|
@ -48,7 +43,7 @@ public final class Imprison extends CardImpl {
|
||||||
|
|
||||||
// Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison.
|
// Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison.
|
||||||
this.addAbility(new ImprisonTriggeredAbility());
|
this.addAbility(new ImprisonTriggeredAbility());
|
||||||
|
|
||||||
// Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison.
|
// Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison.
|
||||||
this.addAbility(new AttacksOrBlocksAttachedTriggeredAbility(new DoIfCostPaid(new ImprisonUnblockEffect(), new DestroySourceEffect(), new ManaCostsImpl<>("{1}")), AttachmentType.AURA));
|
this.addAbility(new AttacksOrBlocksAttachedTriggeredAbility(new DoIfCostPaid(new ImprisonUnblockEffect(), new DestroySourceEffect(), new ManaCostsImpl<>("{1}")), AttachmentType.AURA));
|
||||||
}
|
}
|
||||||
|
|
@ -91,7 +86,7 @@ class ImprisonTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
|
Permanent enchantedPermanent = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
|
||||||
if (event.getSourceId().equals(enchantedPermanent.getId())) {
|
if (event.getSourceId().equals(enchantedPermanent.getId())) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
if (!stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
String abilityText = stackAbility.getRule(true);
|
String abilityText = stackAbility.getRule(true);
|
||||||
if (abilityText.contains("{T},") || abilityText.contains("{T}:") || abilityText.contains("{T} or")) {
|
if (abilityText.contains("{T},") || abilityText.contains("{T}:") || abilityText.contains("{T} or")) {
|
||||||
getEffects().get(0).setTargetPointer(new FixedTarget(stackAbility.getId()));
|
getEffects().get(0).setTargetPointer(new FixedTarget(stackAbility.getId()));
|
||||||
|
|
@ -127,15 +122,15 @@ class ImprisonUnblockEffect extends OneShotEffect {
|
||||||
Permanent permanent = game.getPermanent(enchantment.getAttachedTo());
|
Permanent permanent = game.getPermanent(enchantment.getAttachedTo());
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
if (permanent.isCreature(game)) {
|
if (permanent.isCreature(game)) {
|
||||||
|
|
||||||
// Tap the creature
|
// Tap the creature
|
||||||
permanent.tap(source, game);
|
permanent.tap(source, game);
|
||||||
|
|
||||||
// Remove it from combat
|
// Remove it from combat
|
||||||
Effect effect = new RemoveFromCombatTargetEffect();
|
Effect effect = new RemoveFromCombatTargetEffect();
|
||||||
effect.setTargetPointer(new FixedTarget(permanent, game));
|
effect.setTargetPointer(new FixedTarget(permanent, game));
|
||||||
effect.apply(game, source);
|
effect.apply(game, source);
|
||||||
|
|
||||||
// Make blocked creatures unblocked
|
// Make blocked creatures unblocked
|
||||||
BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
|
BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
|
||||||
if (watcher != null) {
|
if (watcher != null) {
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ class IntercessorsArrestEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
case ACTIVATE_ABILITY:
|
case ACTIVATE_ABILITY:
|
||||||
if (enchantment.isAttachedTo(event.getSourceId())) {
|
if (enchantment.isAttachedTo(event.getSourceId())) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
return ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA;
|
return ability.isPresent() && ability.get().isNonManaActivatedAbility();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import mage.abilities.effects.RestrictionEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
|
@ -61,7 +60,7 @@ class InterdictPredicate implements Predicate<StackObject> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(StackObject input, Game game) {
|
public boolean apply(StackObject input, Game game) {
|
||||||
if (input instanceof StackAbility && ((StackAbility) input).getAbilityType() == AbilityType.ACTIVATED) {
|
if (input instanceof StackAbility && ((StackAbility) input).isActivatedAbility()){
|
||||||
MageObject sourceObject = ((StackAbility) input).getSourceObject(game);
|
MageObject sourceObject = ((StackAbility) input).getSourceObject(game);
|
||||||
if (sourceObject != null) {
|
if (sourceObject != null) {
|
||||||
return (sourceObject.isArtifact(game)
|
return (sourceObject.isArtifact(game)
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||||
import mage.abilities.mana.conditional.ManaCondition;
|
import mage.abilities.mana.conditional.ManaCondition;
|
||||||
import mage.cards.AdventureCard;
|
import mage.cards.AdventureCard;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
|
|
@ -90,12 +89,9 @@ class JamesWanderingDadManaCondition extends ManaCondition implements Condition
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
if (source != null && !source.isActivated()) {
|
return source != null
|
||||||
// ex: SimpleManaAbility is an ACTIVATED ability, but it is categorized as a MANA ability
|
&& !source.isActivated()
|
||||||
return source.getAbilityType() == AbilityType.MANA
|
&& source.isActivatedAbility();
|
||||||
|| source.getAbilityType() == AbilityType.ACTIVATED;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ class KopalaWardenOfWavesCostModificationEffect2 extends CostModificationEffectI
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
return abilityToModify.isActivatedAbility()
|
||||||
&& KopalaWardenOfWaves.isAbilityCompatible(abilityToModify, source, game);
|
&& KopalaWardenOfWaves.isAbilityCompatible(abilityToModify, source, game);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -78,7 +77,7 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.getEffects().setValue("stackObject", stackAbility);
|
this.getEffects().setValue("stackObject", stackAbility);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.hint.StaticHint;
|
import mage.abilities.hint.StaticHint;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.choices.Choice;
|
import mage.choices.Choice;
|
||||||
|
|
@ -45,8 +44,8 @@ public final class LeoriSparktouchedHunter extends CardImpl {
|
||||||
|
|
||||||
// Whenever Leori, Sparktouched Hunter deals combat damage to a player, choose a planeswalker type. Until end of turn, whenever you activate an ability of a planeswalker of that type, copy that ability. You may choose new targets for the copies.
|
// Whenever Leori, Sparktouched Hunter deals combat damage to a player, choose a planeswalker type. Until end of turn, whenever you activate an ability of a planeswalker of that type, copy that ability. You may choose new targets for the copies.
|
||||||
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
|
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
|
||||||
new LeoriSparktouchedHunterEffect(),
|
new LeoriSparktouchedHunterEffect(),
|
||||||
false
|
false
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,7 +65,7 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
|
||||||
LeoriSparktouchedHunterEffect() {
|
LeoriSparktouchedHunterEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
this.staticText = "choose a planeswalker type. Until end of turn, whenever you activate an ability " +
|
this.staticText = "choose a planeswalker type. Until end of turn, whenever you activate an ability " +
|
||||||
"of a planeswalker of that type, copy that ability. You may choose new targets for the copies.";
|
"of a planeswalker of that type, copy that ability. You may choose new targets for the copies.";
|
||||||
}
|
}
|
||||||
|
|
||||||
private LeoriSparktouchedHunterEffect(final LeoriSparktouchedHunterEffect effect) {
|
private LeoriSparktouchedHunterEffect(final LeoriSparktouchedHunterEffect effect) {
|
||||||
|
|
@ -98,8 +97,8 @@ class LeoriSparktouchedHunterEffect extends OneShotEffect {
|
||||||
game.informPlayers(controller.getLogName() + " has chosen " + subType);
|
game.informPlayers(controller.getLogName() + " has chosen " + subType);
|
||||||
|
|
||||||
game.addDelayedTriggeredAbility(
|
game.addDelayedTriggeredAbility(
|
||||||
new LeoriSparktouchedHunterTriggeredAbility(subType),
|
new LeoriSparktouchedHunterTriggeredAbility(subType),
|
||||||
source
|
source
|
||||||
);
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -139,8 +138,7 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
|
||||||
}
|
}
|
||||||
|
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
|| stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -155,6 +153,6 @@ class LeoriSparktouchedHunterTriggeredAbility extends DelayedTriggeredAbility {
|
||||||
@Override
|
@Override
|
||||||
public String getRule() {
|
public String getRule() {
|
||||||
return "Whenever you activate an ability of a planeswalker of the chosen type, copy that ability. " +
|
return "Whenever you activate an ability of a planeswalker of the chosen type, copy that ability. " +
|
||||||
"You may choose new targets for the copies.";
|
"You may choose new targets for the copies.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -82,7 +81,7 @@ class LocusOfEnlightenmentEffect extends ContinuousEffectImpl {
|
||||||
}
|
}
|
||||||
for (Card card : exileZone.getCards(game)) {
|
for (Card card : exileZone.getCards(game)) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) {
|
if (ability.isActivatedAbility()) {
|
||||||
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
||||||
copyAbility.setMaxActivationsPerTurn(1);
|
copyAbility.setMaxActivationsPerTurn(1);
|
||||||
permanent.addAbility(copyAbility, source.getSourceId(), game, true);
|
permanent.addAbility(copyAbility, source.getSourceId(), game, true);
|
||||||
|
|
@ -120,7 +119,7 @@ class LocusOfEnlightenmentTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.isManaAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.getEffects().setValue("stackObject", stackAbility);
|
this.getEffects().setValue("stackObject", stackAbility);
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import mage.abilities.effects.common.UntapTargetEffect;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
|
|
@ -64,10 +63,8 @@ class HasAbilityWithTapSymbolPredicate implements Predicate<MageObject> {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Ability ability : abilities) {
|
for (Ability ability : abilities) {
|
||||||
if ((ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) && !ability.getCosts().isEmpty()) {
|
if (ability.isActivatedAbility() && ability.hasTapCost()) {
|
||||||
if (ability.hasTapCost()) {
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,12 @@ import mage.constants.*;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
import mage.game.stack.StackAbility;
|
import mage.game.stack.StackAbility;
|
||||||
import mage.game.stack.StackObject;
|
import mage.game.stack.StackObject;
|
||||||
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
|
|
@ -93,7 +92,7 @@ class MagusLuceaKaneTriggeredAbility extends DelayedTriggeredAbility {
|
||||||
// activated ability
|
// activated ability
|
||||||
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
|
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
if (stackAbility != null && !stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
if (stackAbility.getManaCostsToPay().containsX()) {
|
if (stackAbility.getManaCostsToPay().containsX()) {
|
||||||
this.getEffects().setValue("stackObject", (StackObject) stackAbility);
|
this.getEffects().setValue("stackObject", (StackObject) stackAbility);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ class MairsilThePretenderGainAbilitiesEffect extends ContinuousEffectImpl {
|
||||||
for (Card card : game.getExile().getAllCards(game)) {
|
for (Card card : game.getExile().getAllCards(game)) {
|
||||||
if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) {
|
if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
||||||
copyAbility.setMaxActivationsPerTurn(1);
|
copyAbility.setMaxActivationsPerTurn(1);
|
||||||
perm.addAbility(copyAbility, source.getSourceId(), game, true);
|
perm.addAbility(copyAbility, source.getSourceId(), game, true);
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,7 @@ class ManascapeRefractorGainAbilitiesEffect extends ContinuousEffectImpl {
|
||||||
.map(permanent -> permanent.getAbilities(game))
|
.map(permanent -> permanent.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED
|
.filter(Ability::isActivatedAbility)
|
||||||
|| ability.getAbilityType() == AbilityType.MANA)
|
|
||||||
.collect(Collectors.toList())) {
|
.collect(Collectors.toList())) {
|
||||||
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities
|
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities
|
||||||
if (!(ability instanceof BasicManaAbility)
|
if (!(ability instanceof BasicManaAbility)
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,6 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -18,6 +11,12 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
|
|
@ -70,7 +69,7 @@ class MirranSafehouseEffect extends ContinuousEffectImpl {
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.map(card -> card.getAbilities(game))
|
.map(card -> card.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(ActivatedAbility.class::isInstance)
|
.filter(Ability::isActivatedAbility)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
for (Ability ability : abilities) {
|
for (Ability ability : abilities) {
|
||||||
permanent.addAbility(ability, source.getSourceId(), game, true);
|
permanent.addAbility(ability, source.getSourceId(), game, true);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.keyword.KickerAbility;
|
import mage.abilities.keyword.KickerAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -84,9 +83,8 @@ class MoltenDisasterSplitSecondEffect extends ContinuousRuleModifyingEffectImpl
|
||||||
}
|
}
|
||||||
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) {
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
|
return ability.isPresent() && !ability.get().isManaActivatedAbility()
|
||||||
return KickedCondition.ONCE.apply(game, source);
|
&& KickedCondition.ONCE.apply(game, source);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
|
@ -18,8 +16,9 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.common.TargetCardInGraveyard;
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author BetaSteward_at_googlemail.com
|
* @author BetaSteward_at_googlemail.com
|
||||||
*/
|
*/
|
||||||
public final class MyrWelder extends CardImpl {
|
public final class MyrWelder extends CardImpl {
|
||||||
|
|
@ -102,7 +101,7 @@ class MyrWelderContinuousEffect extends ContinuousEffectImpl {
|
||||||
Card card = game.getCard(imprintedId);
|
Card card = game.getCard(imprintedId);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
perm.addAbility(ability, source.getId(), game, true);
|
perm.addAbility(ability, source.getId(), game, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.n;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -76,7 +75,7 @@ class NecroticOozeEffect extends ContinuousEffectImpl {
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.map(card -> card.getAbilities(game))
|
.map(card -> card.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(ActivatedAbility.class::isInstance)
|
.filter(Ability::isActivatedAbility)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
for (Ability ability : abilities) {
|
for (Ability ability : abilities) {
|
||||||
permanent.addAbility(ability, source.getSourceId(), game, true);
|
permanent.addAbility(ability, source.getSourceId(), game, true);
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||||
import mage.abilities.mana.conditional.ManaCondition;
|
import mage.abilities.mana.conditional.ManaCondition;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
|
@ -74,8 +73,7 @@ class OmenHawkerManaCondition extends ManaCondition implements Condition {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
if (source != null && !source.isActivated()) {
|
if (source != null && !source.isActivated()) {
|
||||||
return source.getAbilityType() == AbilityType.MANA
|
return source.isActivatedAbility();
|
||||||
|| source.getAbilityType() == AbilityType.ACTIVATED;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,7 @@
|
||||||
|
|
||||||
package mage.cards.o;
|
package mage.cards.o;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.SpellAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
|
|
@ -13,27 +10,22 @@ import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AttachmentType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.CostModificationType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class OppressiveRays extends CardImpl {
|
public final class OppressiveRays extends CardImpl {
|
||||||
|
|
||||||
public OppressiveRays(UUID ownerId, CardSetInfo setInfo) {
|
public OppressiveRays(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
|
||||||
this.subtype.add(SubType.AURA);
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
// Enchant creature
|
// Enchant creature
|
||||||
|
|
@ -80,13 +72,9 @@ class OppressiveRaysCostModificationEffect extends CostModificationEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
Permanent creature = game.getPermanent(abilityToModify.getSourceId());
|
Permanent creature = game.getPermanent(abilityToModify.getSourceId());
|
||||||
if (creature != null && creature.getAttachments().contains(source.getSourceId())) {
|
return creature != null
|
||||||
if (abilityToModify instanceof ActivatedAbility
|
&& creature.getAttachments().contains(source.getSourceId())
|
||||||
&& !(abilityToModify instanceof SpellAbility)) {
|
&& abilityToModify.isActivatedAbility();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
|
@ -23,7 +22,6 @@ import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class OverwhelmingSplendor extends CardImpl {
|
public final class OverwhelmingSplendor extends CardImpl {
|
||||||
|
|
@ -149,7 +147,7 @@ class OverwhelmingSplendorCantActivateEffect extends ContinuousRuleModifyingEffe
|
||||||
|
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
return ability.isPresent()
|
return ability.isPresent()
|
||||||
&& !(ability.get() instanceof ActivatedManaAbilityImpl)
|
&& !(ability.get().isManaActivatedAbility())
|
||||||
&& !(ability.get() instanceof LoyaltyAbility);
|
&& !(ability.get() instanceof LoyaltyAbility);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.p;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
|
@ -76,7 +75,7 @@ class PatchworkCrawlerEffect extends ContinuousEffectImpl {
|
||||||
}
|
}
|
||||||
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
|
for (Card card : exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game)) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
permanent.addAbility(ability, source.getSourceId(), game, true);
|
permanent.addAbility(ability, source.getSourceId(), game, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import mage.abilities.common.AsEntersBattlefieldAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.ChooseACardNameEffect;
|
import mage.abilities.effects.common.ChooseACardNameEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -71,12 +70,10 @@ class PithingNeedleEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
MageObject object = game.getObject(event.getSourceId());
|
MageObject object = game.getObject(event.getSourceId());
|
||||||
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
|
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (ability.isPresent()
|
return ability.isPresent()
|
||||||
&& object != null) {
|
&& object != null
|
||||||
return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
|
&& game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
|
||||||
&& !(ability.get() instanceof ActivatedManaAbilityImpl) // not an activated mana ability
|
&& !ability.get().isManaActivatedAbility() // not an activated mana ability
|
||||||
&& CardUtil.haveSameNames(object, cardName, game);
|
&& CardUtil.haveSameNames(object, cardName, game);
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
package mage.cards.p;
|
package mage.cards.p;
|
||||||
|
|
||||||
import mage.Mana;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
|
|
@ -67,10 +65,10 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
|
||||||
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
||||||
Player controller = game.getPlayer(abilityToModify.getControllerId());
|
Player controller = game.getPlayer(abilityToModify.getControllerId());
|
||||||
if (controller != null) {
|
if (controller != null) {
|
||||||
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
|
int reduceMax = CardUtil.calculateActualPossibleGenericManaReduction(abilityToModify.getManaCostsToPay().getMana(), 2, 1);
|
||||||
if (reduceMax <= 0) {
|
if (reduceMax <= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
CardUtil.reduceCost(abilityToModify, reduceMax);
|
CardUtil.reduceCost(abilityToModify, reduceMax);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -81,9 +79,7 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
|
||||||
Permanent artifact = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
Permanent artifact = game.getPermanentOrLKIBattlefield(abilityToModify.getSourceId());
|
||||||
if (artifact != null
|
if (artifact != null
|
||||||
&& artifact.getAttachments().contains(source.getSourceId())) {
|
&& artifact.getAttachments().contains(source.getSourceId())) {
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
if (abilityToModify.isActivatedAbility()){
|
||||||
|| (abilityToModify.getAbilityType() == AbilityType.MANA
|
|
||||||
&& (abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.Abilities;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -87,7 +86,7 @@ class PowerSinkCounterUnlessPaysEffect extends OneShotEffect {
|
||||||
for (Permanent land : lands) {
|
for (Permanent land : lands) {
|
||||||
Abilities<Ability> landAbilities = land.getAbilities();
|
Abilities<Ability> landAbilities = land.getAbilities();
|
||||||
for (Ability ability : landAbilities) {
|
for (Ability ability : landAbilities) {
|
||||||
if (ability instanceof ActivatedManaAbilityImpl) {
|
if (ability.isManaActivatedAbility()) {
|
||||||
land.tap(source, game);
|
land.tap(source, game);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import mage.abilities.effects.common.FightTargetSourceEffect;
|
||||||
import mage.abilities.keyword.RiotAbility;
|
import mage.abilities.keyword.RiotAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
|
@ -78,7 +77,6 @@ enum RavagerWurmPredicate implements Predicate<Permanent> {
|
||||||
&& input
|
&& input
|
||||||
.getAbilities(game)
|
.getAbilities(game)
|
||||||
.stream()
|
.stream()
|
||||||
.map(Ability::getAbilityType)
|
.anyMatch(Ability::isNonManaActivatedAbility);
|
||||||
.anyMatch(AbilityType.ACTIVATED::equals);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ class RexCyberhoundContinuousEffect extends ContinuousEffectImpl {
|
||||||
}
|
}
|
||||||
for (Card card : game.getExile().getCards(filter, game)) {
|
for (Card card : game.getExile().getCards(filter, game)) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof ActivatedAbility) {
|
if (ability.isActivatedAbility()) {
|
||||||
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
||||||
copyAbility.setMaxActivationsPerTurn(1);
|
copyAbility.setMaxActivationsPerTurn(1);
|
||||||
perm.addAbility(copyAbility, source.getSourceId(), game, true);
|
perm.addAbility(copyAbility, source.getSourceId(), game, true);
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
import mage.abilities.effects.common.CopyStackObjectEffect;
|
import mage.abilities.effects.common.CopyStackObjectEffect;
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -63,7 +62,7 @@ class RingsOfBrighthearthTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.getEffects().setValue("stackObject", stackAbility);
|
this.getEffects().setValue("stackObject", stackAbility);
|
||||||
|
|
|
||||||
|
|
@ -79,9 +79,8 @@ class RobaranMercenariesEffect extends ContinuousEffectImpl {
|
||||||
.map(permanent -> permanent.getAbilities(game))
|
.map(permanent -> permanent.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED
|
.filter(ability -> ability.isActivatedAbility())
|
||||||
|| ability.getAbilityType() == AbilityType.MANA)
|
.collect(Collectors.toList())){
|
||||||
.collect(Collectors.toList())) {
|
|
||||||
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities
|
// optimization to disallow the adding of duplicate, unnecessary basic mana abilities
|
||||||
if (!(ability instanceof BasicManaAbility)
|
if (!(ability instanceof BasicManaAbility)
|
||||||
|| perm.getAbilities(game)
|
|| perm.getAbilities(game)
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
|
@ -15,8 +13,9 @@ import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.stack.StackAbility;
|
import mage.game.stack.StackAbility;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class RunicArmasaur extends CardImpl {
|
public final class RunicArmasaur extends CardImpl {
|
||||||
|
|
@ -67,7 +66,7 @@ class RunicArmasaurTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility != null
|
if (stackAbility != null
|
||||||
&& stackAbility.getAbilityType() == AbilityType.ACTIVATED
|
&& stackAbility.isNonManaActivatedAbility()
|
||||||
&& game.getOpponents(this.getControllerId()).contains(stackAbility.getControllerId())
|
&& game.getOpponents(this.getControllerId()).contains(stackAbility.getControllerId())
|
||||||
&& stackAbility.getSourcePermanentOrLKI(game) != null) { // must be a permanent
|
&& stackAbility.getSourcePermanentOrLKI(game) != null) { // must be a permanent
|
||||||
MageObject abilitySourceObject = stackAbility.getSourceObject(game);
|
MageObject abilitySourceObject = stackAbility.getSourceObject(game);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.s;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
|
@ -78,7 +77,7 @@ class SamLoyalAttendantEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (!(abilityToModify instanceof ActivatedAbility)) {
|
if (!(abilityToModify.isActivatedAbility())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);
|
Permanent permanent = abilityToModify.getSourcePermanentIfItStillExists(game);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
import mage.abilities.effects.AsThoughManaEffect;
|
import mage.abilities.effects.AsThoughManaEffect;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.effects.ReplacementEffectImpl;
|
import mage.abilities.effects.ReplacementEffectImpl;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
|
@ -25,12 +24,12 @@ import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Susucr
|
* @author Susucr
|
||||||
*/
|
*/
|
||||||
public final class SharkeyTyrantOfTheShire extends CardImpl {
|
public final class SharkeyTyrantOfTheShire extends CardImpl {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("lands your opponents control");
|
private static final FilterPermanent filter = new FilterPermanent("lands your opponents control");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(CardType.LAND.getPredicate());
|
filter.add(CardType.LAND.getPredicate());
|
||||||
filter.add(TargetController.OPPONENT.getControllerPredicate());
|
filter.add(TargetController.OPPONENT.getControllerPredicate());
|
||||||
|
|
@ -38,7 +37,7 @@ public final class SharkeyTyrantOfTheShire extends CardImpl {
|
||||||
|
|
||||||
public SharkeyTyrantOfTheShire(UUID ownerId, CardSetInfo setInfo) {
|
public SharkeyTyrantOfTheShire(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
this.subtype.add(SubType.AVATAR);
|
this.subtype.add(SubType.AVATAR);
|
||||||
this.subtype.add(SubType.ROGUE);
|
this.subtype.add(SubType.ROGUE);
|
||||||
|
|
@ -98,9 +97,9 @@ class SharkeyTyrantOfTheShireReplacementEffect extends ReplacementEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
MageObject object = game.getObject(event.getSourceId());
|
MageObject object = game.getObject(event.getSourceId());
|
||||||
if (object instanceof Permanent && filter.match((Permanent)object, source.getControllerId(), source, game)) {
|
if (object instanceof Permanent && filter.match((Permanent) object, source.getControllerId(), source, game)) {
|
||||||
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
|
Optional<Ability> ability = object.getAbilities().get(event.getTargetId());
|
||||||
if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) {
|
if (ability.isPresent() && !ability.get().isManaActivatedAbility()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -143,7 +142,7 @@ class SharkeyTyrantOfTheShireContinousEffect extends ContinuousEffectImpl {
|
||||||
.map(permanent -> permanent.getAbilities(game))
|
.map(permanent -> permanent.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED) // Mana abilities are separated in their own AbilityType.Mana
|
.filter(Ability::isNonManaActivatedAbility)
|
||||||
.collect(Collectors.toList())) {
|
.collect(Collectors.toList())) {
|
||||||
perm.addAbility(ability, source.getSourceId(), game, true);
|
perm.addAbility(ability, source.getSourceId(), game, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,12 +72,8 @@ class ArtifactAbilityManaCondition extends ManaCondition implements Condition {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
switch (source.getAbilityType()) {
|
if (!source.isActivatedAbility()) {
|
||||||
case ACTIVATED:
|
return false;
|
||||||
case MANA:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
MageObject object = game.getObject(source);
|
MageObject object = game.getObject(source);
|
||||||
return object != null && object.isArtifact(game) && !source.isActivated();
|
return object != null && object.isArtifact(game) && !source.isActivated();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.AsEntersBattlefieldAbility;
|
import mage.abilities.common.AsEntersBattlefieldAbility;
|
||||||
|
|
@ -10,11 +8,17 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.ChooseACardNameEffect;
|
import mage.abilities.effects.common.ChooseACardNameEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
|
|
@ -68,7 +72,7 @@ class SorcerousSpyglassActivationEffect extends ContinuousRuleModifyingEffectImp
|
||||||
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (ability.isPresent() && object != null) {
|
if (ability.isPresent() && object != null) {
|
||||||
return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
|
return game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId()) // controller in range
|
||||||
&& ability.get().getAbilityType() != AbilityType.MANA
|
&& !ability.get().isManaAbility()
|
||||||
&& CardUtil.haveSameNames(object, cardName, game);
|
&& CardUtil.haveSameNames(object, cardName, game);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ class StrictProctorTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Ability ability = stackObject.getStackAbility();
|
Ability ability = stackObject.getStackAbility();
|
||||||
if (!(ability instanceof TriggeredAbility)) {
|
if (!ability.isTriggeredAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
GameEvent triggerEvent = ((TriggeredAbility) ability).getTriggerEvent();
|
GameEvent triggerEvent = ((TriggeredAbility) ability).getTriggerEvent();
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,24 @@
|
||||||
|
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
import mage.constants.*;
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.CostModificationType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class SuppressionField extends CardImpl {
|
public final class SuppressionField extends CardImpl {
|
||||||
|
|
||||||
public SuppressionField(UUID ownerId, CardSetInfo setInfo) {
|
public SuppressionField(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
|
||||||
|
|
||||||
// Activated abilities cost {2} more to activate unless they're mana abilities.
|
// Activated abilities cost {2} more to activate unless they're mana abilities.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect()));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect()));
|
||||||
|
|
@ -58,7 +53,7 @@ class SuppressionFieldCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED;
|
return abilityToModify.isNonManaActivatedAbility();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,7 @@ class TazriStalwartSurvivorManaAbility extends ActivatedManaAbilityImpl {
|
||||||
&& permanent
|
&& permanent
|
||||||
.getAbilities(game)
|
.getAbilities(game)
|
||||||
.stream()
|
.stream()
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED
|
.filter(ability -> ability.isActivatedAbility())
|
||||||
|| ability.getAbilityType() == AbilityType.MANA)
|
|
||||||
.map(Ability::getOriginalId)
|
.map(Ability::getOriginalId)
|
||||||
.anyMatch(abilityId -> !source.getOriginalId().equals(abilityId));
|
.anyMatch(abilityId -> !source.getOriginalId().equals(abilityId));
|
||||||
}
|
}
|
||||||
|
|
@ -124,12 +123,8 @@ class TazriStalwartSurvivorManaEffect extends ManaEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
switch (source.getAbilityType()) {
|
if (!source.isActivatedAbility()) {
|
||||||
case ACTIVATED:
|
return false;
|
||||||
case MANA:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
MageObject object = game.getObject(source);
|
MageObject object = game.getObject(source);
|
||||||
return object != null && object.isCreature(game) && !source.isActivated();
|
return object != null && object.isCreature(game) && !source.isActivated();
|
||||||
|
|
@ -271,8 +266,7 @@ class TazriStalwartSurvivorMillEffect extends OneShotEffect {
|
||||||
.getCard(uuid)
|
.getCard(uuid)
|
||||||
.getAbilities(game)
|
.getAbilities(game)
|
||||||
.stream()
|
.stream()
|
||||||
.map(Ability::getAbilityType)
|
.noneMatch(Ability::isNonManaActivatedAbility));
|
||||||
.noneMatch(AbilityType.ACTIVATED::equals));
|
|
||||||
player.moveCards(cards, Zone.HAND, source, game);
|
player.moveCards(cards, Zone.HAND, source, game);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ class TerritoryForgeStaticEffect extends ContinuousEffectImpl {
|
||||||
}
|
}
|
||||||
for (Card card : exileZone.getCards(game)) {
|
for (Card card : exileZone.getCards(game)) {
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) {
|
if (ability.isActivatedAbility()){
|
||||||
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
|
||||||
permanent.addAbility(copyAbility, source.getSourceId(), game, true);
|
permanent.addAbility(copyAbility, source.getSourceId(), game, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.t;
|
package mage.cards.t;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.LoyaltyAbility;
|
import mage.abilities.LoyaltyAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.common.DiscardCardCost;
|
import mage.abilities.costs.common.DiscardCardCost;
|
||||||
|
|
@ -97,7 +96,7 @@ class TezzeretBetrayerOfFleshReductionEffect extends CostModificationEffectImpl
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return abilityToModify.isControlledBy(source.getControllerId())
|
return abilityToModify.isControlledBy(source.getControllerId())
|
||||||
&& abilityToModify instanceof ActivatedAbility
|
&& abilityToModify.isActivatedAbility()
|
||||||
&& TezzeretBetrayerOfFleshWatcher.checkPlayer(game, abilityToModify);
|
&& TezzeretBetrayerOfFleshWatcher.checkPlayer(game, abilityToModify);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.t;
|
||||||
|
|
||||||
import mage.MageObjectReference;
|
import mage.MageObjectReference;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbility;
|
|
||||||
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
|
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
|
|
@ -25,7 +24,6 @@ import mage.game.permanent.token.Token;
|
||||||
import mage.game.permanent.token.VecnaToken;
|
import mage.game.permanent.token.VecnaToken;
|
||||||
import mage.game.permanent.token.ZombieToken;
|
import mage.game.permanent.token.ZombieToken;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.common.TargetSacrifice;
|
import mage.target.common.TargetSacrifice;
|
||||||
import mage.watchers.common.PlayerLostLifeWatcher;
|
import mage.watchers.common.PlayerLostLifeWatcher;
|
||||||
|
|
||||||
|
|
@ -187,7 +185,7 @@ class TheBookOfVileDarknessEffect extends OneShotEffect {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (Ability ability : card.getAbilities(game)) {
|
for (Ability ability : card.getAbilities(game)) {
|
||||||
if (ability instanceof TriggeredAbility) {
|
if (ability.isTriggeredAbility()) {
|
||||||
Ability copyAbility = ability.copy();
|
Ability copyAbility = ability.copy();
|
||||||
copyAbility.newId();
|
copyAbility.newId();
|
||||||
copyAbility.setControllerId(source.getControllerId());
|
copyAbility.setControllerId(source.getControllerId());
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import mage.abilities.mana.conditional.ManaCondition;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.filter.predicate.Predicate;
|
import mage.filter.predicate.Predicate;
|
||||||
|
|
@ -66,7 +65,7 @@ enum TheEnigmaJewelPredicate implements Predicate<MageObject> {
|
||||||
&& input instanceof Card
|
&& input instanceof Card
|
||||||
&& ((Card) input).getAbilities(game)
|
&& ((Card) input).getAbilities(game)
|
||||||
.stream()
|
.stream()
|
||||||
.anyMatch(a -> (a.getAbilityType() == AbilityType.ACTIVATED || a.getAbilityType() == AbilityType.MANA));
|
.anyMatch(a -> (a.isActivatedAbility()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -98,8 +97,7 @@ class TheEnigmaJewelManaCondition extends ManaCondition implements Condition {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
if (source != null && !source.isActivated()) {
|
if (source != null && !source.isActivated()) {
|
||||||
return source.getAbilityType() == AbilityType.MANA
|
return source.isActivatedAbility();
|
||||||
|| source.getAbilityType() == AbilityType.ACTIVATED;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.t;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.ruleModifying.LegendRuleDoesntApplyEffect;
|
import mage.abilities.effects.common.ruleModifying.LegendRuleDoesntApplyEffect;
|
||||||
|
|
@ -109,7 +108,7 @@ class TheMasterMultipliedEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
|
|
||||||
return controller != null && permanent != null
|
return controller != null && permanent != null
|
||||||
&& filter.match(permanent, source.getControllerId(), source, game)
|
&& filter.match(permanent, source.getControllerId(), source, game)
|
||||||
&& stackAbility instanceof TriggeredAbility
|
&& stackAbility.isTriggeredAbility()
|
||||||
&& source.getControllerId().equals(eventSourceControllerId);
|
&& source.getControllerId().equals(eventSourceControllerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ class TitheTakerCostReductionEffect extends CostModificationEffectImpl {
|
||||||
SpellAbility spellAbility = (SpellAbility) abilityToModify;
|
SpellAbility spellAbility = (SpellAbility) abilityToModify;
|
||||||
CardUtil.adjustCost(spellAbility, -1);
|
CardUtil.adjustCost(spellAbility, -1);
|
||||||
}
|
}
|
||||||
if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED) {
|
if (abilityToModify.isNonManaActivatedAbility()) {
|
||||||
CardUtil.increaseCost(abilityToModify, 1);
|
CardUtil.increaseCost(abilityToModify, 1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -73,14 +73,9 @@ class TitheTakerCostReductionEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (!MyTurnCondition.instance.apply(game, source)) {
|
return MyTurnCondition.instance.apply(game, source)
|
||||||
return false;
|
&& (abilityToModify.getAbilityType() == AbilityType.SPELL || abilityToModify.isNonManaActivatedAbility())
|
||||||
}
|
&& game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId());
|
||||||
if (!(abilityToModify.getAbilityType() == AbilityType.SPELL)
|
|
||||||
&& !(abilityToModify.getAbilityType() == AbilityType.ACTIVATED)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
package mage.cards.t;
|
package mage.cards.t;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.CostModificationType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
@ -68,9 +70,7 @@ class TrainingGroundsEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
if (abilityToModify.getAbilityType() != AbilityType.ACTIVATED
|
if (!abilityToModify.isActivatedAbility()) {
|
||||||
&& (abilityToModify.getAbilityType() != AbilityType.MANA
|
|
||||||
|| !(abilityToModify instanceof ActivatedAbility))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//Activated abilities of creatures you control
|
//Activated abilities of creatures you control
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package mage.cards.t;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.keyword.DeathtouchAbility;
|
import mage.abilities.keyword.DeathtouchAbility;
|
||||||
|
|
@ -74,7 +73,7 @@ class TrazynTheInfiniteEffect extends ContinuousEffectImpl {
|
||||||
.stream()
|
.stream()
|
||||||
.map(card -> card.getAbilities(game))
|
.map(card -> card.getAbilities(game))
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.filter(ActivatedAbility.class::isInstance)
|
.filter(Ability::isActivatedAbility)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
for (Ability ability : abilities) {
|
for (Ability ability : abilities) {
|
||||||
permanent.addAbility(ability, source.getSourceId(), game, true);
|
permanent.addAbility(ability, source.getSourceId(), game, true);
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,27 @@
|
||||||
|
|
||||||
package mage.cards.t;
|
package mage.cards.t;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.ActivatedAbility;
|
|
||||||
import mage.abilities.PlayLandAbility;
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.PhaseStep;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class TsabosWeb extends CardImpl {
|
public final class TsabosWeb extends CardImpl {
|
||||||
|
|
||||||
public TsabosWeb(UUID ownerId, CardSetInfo setInfo) {
|
public TsabosWeb(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||||
|
|
||||||
// When Tsabo's Web enters the battlefield, draw a card.
|
// When Tsabo's Web enters the battlefield, draw a card.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
|
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
|
||||||
|
|
@ -66,16 +59,14 @@ class TsabosWebPreventUntapEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
public boolean checksEventType(GameEvent event, Game game) {
|
public boolean checksEventType(GameEvent event, Game game) {
|
||||||
return event.getType() == GameEvent.EventType.UNTAP;
|
return event.getType() == GameEvent.EventType.UNTAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
if (game.getTurnStepType() == PhaseStep.UNTAP) {
|
if (game.getTurnStepType() == PhaseStep.UNTAP) {
|
||||||
Permanent permanent = game.getPermanent(event.getTargetId());
|
Permanent permanent = game.getPermanent(event.getTargetId());
|
||||||
if (permanent != null && permanent.isLand(game)) {
|
if (permanent != null && permanent.isLand(game)) {
|
||||||
for (Ability ability :permanent.getAbilities()) {
|
for (Ability ability : permanent.getAbilities()) {
|
||||||
if (!(ability instanceof PlayLandAbility)
|
if (ability.isNonManaActivatedAbility()) {
|
||||||
&& !(ability instanceof ActivatedManaAbilityImpl)
|
|
||||||
&& ability instanceof ActivatedAbility) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.ReplacementEffectImpl;
|
import mage.abilities.effects.ReplacementEffectImpl;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -90,7 +89,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
|
||||||
UnboundFlourishingCopyAbility() {
|
UnboundFlourishingCopyAbility() {
|
||||||
super(Zone.BATTLEFIELD, new UnboundFlourishingCopyEffect(), false);
|
super(Zone.BATTLEFIELD, new UnboundFlourishingCopyEffect(), false);
|
||||||
setTriggerPhrase("Whenever you cast an instant or sorcery spell or activate an ability, " +
|
setTriggerPhrase("Whenever you cast an instant or sorcery spell or activate an ability, " +
|
||||||
"if that spell's mana cost or that ability's activation cost contains {X}" );
|
"if that spell's mana cost or that ability's activation cost contains {X}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private UnboundFlourishingCopyAbility(final UnboundFlourishingCopyAbility ability) {
|
private UnboundFlourishingCopyAbility(final UnboundFlourishingCopyAbility ability) {
|
||||||
|
|
@ -117,7 +116,7 @@ class UnboundFlourishingCopyAbility extends TriggeredAbilityImpl {
|
||||||
// activated ability
|
// activated ability
|
||||||
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
|
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility != null && !(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
|
if (stackAbility != null && !stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
if (stackAbility.getManaCostsToPay().containsX()) {
|
if (stackAbility.getManaCostsToPay().containsX()) {
|
||||||
game.getState().setValue(this.getSourceId() + UnboundFlourishing.needPrefix, stackAbility);
|
game.getState().setValue(this.getSourceId() + UnboundFlourishing.needPrefix, stackAbility);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.keyword.DeathtouchAbility;
|
import mage.abilities.keyword.DeathtouchAbility;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.keyword.LifelinkAbility;
|
import mage.abilities.keyword.LifelinkAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -84,7 +83,7 @@ class VerrakWarpedSengirTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
|
||||||
if (stackAbility == null || stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl) {
|
if (stackAbility == null || stackAbility.getStackAbility().isManaActivatedAbility()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int lifePaid = CardUtil.castStream(
|
int lifePaid = CardUtil.castStream(
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,7 @@ enum ZirdaTheDawnwakerCompanionCondition implements CompanionCondition {
|
||||||
.allMatch(card -> card
|
.allMatch(card -> card
|
||||||
.getAbilities()
|
.getAbilities()
|
||||||
.stream()
|
.stream()
|
||||||
.anyMatch(ability -> ability.getAbilityType() == AbilityType.ACTIVATED
|
.anyMatch(ability -> ability.isActivatedAbility())
|
||||||
|| ability.getAbilityType() == AbilityType.MANA
|
|
||||||
|| ability.getAbilityType() == AbilityType.LOYALTY)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -112,7 +110,7 @@ class ZirdaTheDawnwakerEffect extends CostModificationEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||||
return abilityToModify.getAbilityType() == AbilityType.ACTIVATED
|
return abilityToModify.isNonManaActivatedAbility()
|
||||||
&& abilityToModify.isControlledBy(source.getControllerId());
|
&& abilityToModify.isControlledBy(source.getControllerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
package org.mage.test.cards.continuous;
|
package org.mage.test.cards.continuous;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
@ -11,7 +10,6 @@ import org.junit.Test;
|
||||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public class DependentEffectsTest extends CardTestPlayerBase {
|
public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
|
|
@ -33,9 +31,9 @@ public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
|
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
|
||||||
|
|
||||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence",true);
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence", true);
|
||||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
|
||||||
|
|
||||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
|
|
@ -49,12 +47,12 @@ public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
/**
|
/**
|
||||||
* Opalescence is dependent on Enchanted Evening, so it will be applied
|
* Opalescence is dependent on Enchanted Evening, so it will be applied
|
||||||
* after it regardless of timestamp.
|
* after it regardless of timestamp.
|
||||||
*
|
* <p>
|
||||||
* Tokens can also have mana costs, and as a consequence of that, converted
|
* Tokens can also have mana costs, and as a consequence of that, converted
|
||||||
* mana costs. A token created with Rite of Replication would have the mana
|
* mana costs. A token created with Rite of Replication would have the mana
|
||||||
* cost of the creature it targeted. Most tokens do not have mana costs
|
* cost of the creature it targeted. Most tokens do not have mana costs
|
||||||
* though.
|
* though.
|
||||||
*
|
* <p>
|
||||||
* Tokens with no mana costs would be 0/0, as you said, and would indeed be
|
* Tokens with no mana costs would be 0/0, as you said, and would indeed be
|
||||||
* put into owner's graveyard next time State Based Actionas are performed.
|
* put into owner's graveyard next time State Based Actionas are performed.
|
||||||
* Tokens with mana costs would naturally have whatever power and toughness
|
* Tokens with mana costs would naturally have whatever power and toughness
|
||||||
|
|
@ -112,7 +110,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
|
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
|
||||||
int numberOfActivatedAbilities = 0;
|
int numberOfActivatedAbilities = 0;
|
||||||
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
|
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
|
||||||
if (ability.getAbilityType() == AbilityType.ACTIVATED) {
|
if (ability.isActivatedAbility()){
|
||||||
numberOfActivatedAbilities++;
|
numberOfActivatedAbilities++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -133,7 +131,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B}
|
addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B}
|
||||||
|
|
||||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer");
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer");
|
||||||
|
|
||||||
setStrictChooseMode(true);
|
setStrictChooseMode(true);
|
||||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
execute();
|
execute();
|
||||||
|
|
@ -143,7 +141,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
|
||||||
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
|
Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
|
||||||
int numberOfActivatedAbilities = 0;
|
int numberOfActivatedAbilities = 0;
|
||||||
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
|
for (Ability ability : necroticOoze.getAbilities(currentGame)) {
|
||||||
if (ability.getAbilityType() == AbilityType.ACTIVATED) {
|
if (ability.isActivatedAbility()){
|
||||||
numberOfActivatedAbilities++;
|
numberOfActivatedAbilities++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,6 @@ public class ConspicuousSnoopTest extends CardTestPlayerBase {
|
||||||
setStrictChooseMode(true);
|
setStrictChooseMode(true);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
assertAbilityCount(playerA, "Conspicuous Snoop", ActivatedAbility.class, 3); // (2 X casts + gains flying )
|
assertAbilityCount(playerA, "Conspicuous Snoop", ActivatedAbility.class, 2); // (own cast ability + gains flying )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.keyword.ProtectionAbility;
|
import mage.abilities.keyword.ProtectionAbility;
|
||||||
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
import mage.abilities.mana.ActivatedManaAbilityImpl;
|
||||||
import mage.abilities.mana.ManaAbility;
|
import mage.abilities.mana.ManaAbility;
|
||||||
import mage.constants.AbilityType;
|
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.util.ThreadLocalStringBuilder;
|
import mage.util.ThreadLocalStringBuilder;
|
||||||
|
|
@ -103,6 +102,11 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
|
||||||
return rules;
|
return rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activated Ability in the engine are broader than in the rules.
|
||||||
|
* Notably SpellAbility & PlayLandAbility are ActivatedAbility,
|
||||||
|
* as they can be activated by a player (the engine meaning).
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Abilities<ActivatedAbility> getActivatedAbilities(Zone zone) {
|
public Abilities<ActivatedAbility> getActivatedAbilities(Zone zone) {
|
||||||
return stream()
|
return stream()
|
||||||
|
|
@ -161,7 +165,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
|
||||||
public Abilities<TriggeredAbility> getTriggeredAbilities(Zone zone) {
|
public Abilities<TriggeredAbility> getTriggeredAbilities(Zone zone) {
|
||||||
Abilities<TriggeredAbility> zonedAbilities = new AbilitiesImpl<>();
|
Abilities<TriggeredAbility> zonedAbilities = new AbilitiesImpl<>();
|
||||||
for (T ability : this) {
|
for (T ability : this) {
|
||||||
if (ability instanceof TriggeredAbility && ability.getZone().match(zone)) {
|
if (ability.isTriggeredAbility() && ability.getZone().match(zone)) {
|
||||||
zonedAbilities.add((TriggeredAbility) ability);
|
zonedAbilities.add((TriggeredAbility) ability);
|
||||||
} else if (ability instanceof ZoneChangeTriggeredAbility) {
|
} else if (ability instanceof ZoneChangeTriggeredAbility) {
|
||||||
ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility) ability;
|
ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility) ability;
|
||||||
|
|
@ -176,7 +180,7 @@ public class AbilitiesImpl<T extends Ability> extends ArrayList<T> implements Ab
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPoolDependantAbilities() {
|
public boolean hasPoolDependantAbilities() {
|
||||||
return stream()
|
return stream()
|
||||||
.filter(ability -> ability.getAbilityType() == AbilityType.MANA)
|
.filter(Ability::isManaAbility)
|
||||||
.map(ManaAbility.class::cast)
|
.map(ManaAbility.class::cast)
|
||||||
.anyMatch(ManaAbility::isPoolDependant);
|
.anyMatch(ManaAbility::isPoolDependant);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,31 @@ public interface Ability extends Controllable, Serializable {
|
||||||
*/
|
*/
|
||||||
AbilityType getAbilityType();
|
AbilityType getAbilityType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this ability is an activated one (mana included).
|
||||||
|
*/
|
||||||
|
boolean isActivatedAbility();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this ability is a triggered one (mana included).
|
||||||
|
*/
|
||||||
|
boolean isTriggeredAbility();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this ability is an activated one, excluding mana.
|
||||||
|
*/
|
||||||
|
boolean isNonManaActivatedAbility();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this ability is a mana activated one.
|
||||||
|
*/
|
||||||
|
boolean isManaActivatedAbility();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this ability is a mana ability, (both triggered and activated can be mana abilities).
|
||||||
|
*/
|
||||||
|
boolean isManaAbility();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the id of the controller of this ability.
|
* Sets the id of the controller of this ability.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -162,6 +162,31 @@ public abstract class AbilityImpl implements Ability {
|
||||||
return this.abilityType;
|
return this.abilityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActivatedAbility() {
|
||||||
|
return this.abilityType.isActivatedAbility();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTriggeredAbility() {
|
||||||
|
return this.abilityType.isTriggeredAbility();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNonManaActivatedAbility() {
|
||||||
|
return this.abilityType.isNonManaActivatedAbility();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isManaActivatedAbility() {
|
||||||
|
return this.abilityType.isManaActivatedAbility();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isManaAbility() {
|
||||||
|
return this.abilityType.isManaAbility();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean resolve(Game game) {
|
public boolean resolve(Game game) {
|
||||||
boolean result = true;
|
boolean result = true;
|
||||||
|
|
@ -193,7 +218,7 @@ public abstract class AbilityImpl implements Ability {
|
||||||
boolean effectResult = effect.apply(game, this);
|
boolean effectResult = effect.apply(game, this);
|
||||||
result &= effectResult;
|
result &= effectResult;
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
if (this.getAbilityType() != AbilityType.MANA) {
|
if (!this.isManaAbility()) {
|
||||||
if (!effectResult) {
|
if (!effectResult) {
|
||||||
if (this.getSourceId() != null) {
|
if (this.getSourceId() != null) {
|
||||||
MageObject mageObject = game.getObject(this.getSourceId());
|
MageObject mageObject = game.getObject(this.getSourceId());
|
||||||
|
|
@ -351,7 +376,7 @@ public abstract class AbilityImpl implements Ability {
|
||||||
// and/or zones become the target of a spell trigger at this point; they'll wait to be put on
|
// and/or zones become the target of a spell trigger at this point; they'll wait to be put on
|
||||||
// the stack until the spell has finished being cast.)
|
// the stack until the spell has finished being cast.)
|
||||||
|
|
||||||
if (this.getAbilityType() != AbilityType.TRIGGERED) { // triggered abilities check this already in playerImpl.triggerAbility
|
if (!this.getAbilityType().isTriggeredAbility()) { // triggered abilities check this already in playerImpl.triggerAbility
|
||||||
adjustTargets(game);
|
adjustTargets(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -359,6 +384,7 @@ public abstract class AbilityImpl implements Ability {
|
||||||
Outcome outcome = getEffects().getOutcome(this);
|
Outcome outcome = getEffects().getOutcome(this);
|
||||||
|
|
||||||
// only activated abilities can be canceled by human user (not triggered)
|
// only activated abilities can be canceled by human user (not triggered)
|
||||||
|
// Note: ActivatedAbility does include SpellAbility & PlayLandAbility, but those should be able to be canceled too.
|
||||||
boolean canCancel = this instanceof ActivatedAbility && controller.isHuman();
|
boolean canCancel = this instanceof ActivatedAbility && controller.isHuman();
|
||||||
if (!getTargets().chooseTargets(outcome, this.controllerId, this, noMana, game, canCancel)) {
|
if (!getTargets().chooseTargets(outcome, this.controllerId, this, noMana, game, canCancel)) {
|
||||||
// was canceled during targer selection
|
// was canceled during targer selection
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ActivatedAbilityImpl(Zone zone, Effect effect, Cost cost) {
|
protected ActivatedAbilityImpl(Zone zone, Effect effect, Cost cost) {
|
||||||
super(AbilityType.ACTIVATED, zone);
|
super(AbilityType.ACTIVATED_NONMANA, zone);
|
||||||
this.addEffect(effect);
|
this.addEffect(effect);
|
||||||
this.addCost(cost);
|
this.addCost(cost);
|
||||||
}
|
}
|
||||||
|
|
@ -147,8 +147,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
|
||||||
|
|
||||||
if (approvingObjects.isEmpty()) {
|
if (approvingObjects.isEmpty()) {
|
||||||
return ActivationStatus.withoutApprovingObject(true);
|
return ActivationStatus.withoutApprovingObject(true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return new ActivationStatus(approvingObjects);
|
return new ActivationStatus(approvingObjects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TriggeredAbilityImpl(Zone zone, Effect effect, boolean optional) {
|
protected TriggeredAbilityImpl(Zone zone, Effect effect, boolean optional) {
|
||||||
super(AbilityType.TRIGGERED, zone);
|
super(AbilityType.TRIGGERED_NONMANA, zone);
|
||||||
setLeavesTheBattlefieldTrigger(false);
|
setLeavesTheBattlefieldTrigger(false);
|
||||||
if (effect != null) {
|
if (effect != null) {
|
||||||
addEffect(effect);
|
addEffect(effect);
|
||||||
|
|
@ -265,6 +265,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For use in generating trigger phrases with correct text
|
* For use in generating trigger phrases with correct text
|
||||||
|
*
|
||||||
* @return "When " for an effect that always removes the source from the battlefield, otherwise "Whenever "
|
* @return "When " for an effect that always removes the source from the battlefield, otherwise "Whenever "
|
||||||
*/
|
*/
|
||||||
protected final String getWhen() {
|
protected final String getWhen() {
|
||||||
|
|
|
||||||
|
|
@ -54,19 +54,22 @@ public class FinalChapterAbilityResolvesTriggeredAbility extends TriggeredAbilit
|
||||||
// the ID of the original ability (on the permanent) that the resolving ability
|
// the ID of the original ability (on the permanent) that the resolving ability
|
||||||
// came from.
|
// came from.
|
||||||
Optional<Ability> ability_opt = game.getAbility(event.getTargetId(), event.getSourceId());
|
Optional<Ability> ability_opt = game.getAbility(event.getTargetId(), event.getSourceId());
|
||||||
if (!ability_opt.isPresent())
|
if (!ability_opt.isPresent()) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure it was a triggered ability (needed for checking if it's a chapter
|
// Make sure it was a triggered ability (needed for checking if it's a chapter
|
||||||
// ability)
|
// ability)
|
||||||
Ability ability = ability_opt.get();
|
Ability ability = ability_opt.get();
|
||||||
if (!(ability instanceof TriggeredAbility))
|
if (!(ability.isTriggeredAbility())) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure it was a chapter ability
|
// Make sure it was a chapter ability
|
||||||
TriggeredAbility triggeredAbility = (TriggeredAbility) ability;
|
TriggeredAbility triggeredAbility = (TriggeredAbility) ability;
|
||||||
if (!SagaAbility.isChapterAbility(triggeredAbility))
|
if (!SagaAbility.isChapterAbility(triggeredAbility)) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// There's a chance that the permanent that this abiltiy came from no longer
|
// There's a chance that the permanent that this abiltiy came from no longer
|
||||||
// exists, so try and find it on the battlefield or check last known
|
// exists, so try and find it on the battlefield or check last known
|
||||||
|
|
@ -75,17 +78,17 @@ public class FinalChapterAbilityResolvesTriggeredAbility extends TriggeredAbilit
|
||||||
// chapter ability on that permanent.
|
// chapter ability on that permanent.
|
||||||
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
||||||
if (permanent == null
|
if (permanent == null
|
||||||
|| !permanent.isControlledBy(getControllerId())
|
|| !permanent.isControlledBy(getControllerId())
|
||||||
|| !permanent.hasSubtype(SubType.SAGA, game)) {
|
|| !permanent.hasSubtype(SubType.SAGA, game)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the max chapter number from that permanent
|
// Find the max chapter number from that permanent
|
||||||
int maxChapter = CardUtil
|
int maxChapter = CardUtil
|
||||||
.castStream(permanent.getAbilities(game).stream(), SagaAbility.class)
|
.castStream(permanent.getAbilities(game).stream(), SagaAbility.class)
|
||||||
.map(SagaAbility::getMaxChapter)
|
.map(SagaAbility::getMaxChapter)
|
||||||
.mapToInt(SagaChapter::getNumber)
|
.mapToInt(SagaChapter::getNumber)
|
||||||
.sum();
|
.sum();
|
||||||
|
|
||||||
// Check if the ability was the last one
|
// Check if the ability was the last one
|
||||||
if (!SagaAbility.isFinalAbility(triggeredAbility, maxChapter)) {
|
if (!SagaAbility.isFinalAbility(triggeredAbility, maxChapter)) {
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue