mirror of
https://github.com/magefree/mage.git
synced 2026-01-26 21:29:17 -08:00
[WHO] Time Reaper, Add target adjuster for "that player controls/owns" damage trigger targets (#12528)
* Implement Time Reaper, start rework * Create DamagedPlayerControlsTargetAdjuster, convert Aberrant to use it * Always add targets for EachOpponentPermanentTargetsAdjuster * Improve target name, finish Time Reaper * Convert some cards * Improve documentation, more cards * More cards, fix cards that needed to use owner instead of controller * Fix unfinished AlelaCunningConqueror changes * more cards * All remaining cards * Fix target type * Remove outdated attempt at TargetController.SOURCE_EFFECT_TARGET_POINTER * Finish removal of SOURCE_EFFECT_TARGET_POINTER * Change targetAdjuster blueprint target to be set inside setTargetAdjuster, add error checking * Always add Target Adjuster after Target * Add comment * Fix TolarianContemptTest to skip opponent with no valid targets * Forgot to git add the new abstract GenericTargetAdjuster * Test now possible after merge, fix missed ChangeOfPlans adjuster order * Text and optional-ness fixes * Always set target pointer
This commit is contained in:
parent
bccf323c0f
commit
7cb669603f
172 changed files with 891 additions and 2219 deletions
|
|
@ -1,7 +1,8 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.keyword.RavenousAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
|
|
@ -9,15 +10,9 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
|
|
@ -26,6 +21,9 @@ import java.util.UUID;
|
|||
*/
|
||||
public final class Aberrant extends CardImpl {
|
||||
|
||||
private static final FilterArtifactOrEnchantmentPermanent filter
|
||||
= new FilterArtifactOrEnchantmentPermanent("artifact or enchantment that player controls");
|
||||
|
||||
public Aberrant(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{1}{G}");
|
||||
|
||||
|
|
@ -41,7 +39,11 @@ public final class Aberrant extends CardImpl {
|
|||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Heavy Power Hammer -- Whenever Aberrant deals combat damage to a player, destroy target artifact or enchantment that player controls.
|
||||
this.addAbility(new AberrantTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true);
|
||||
ability.withFlavorWord("Heavy Power Hammer");
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private Aberrant(final Aberrant card) {
|
||||
|
|
@ -53,45 +55,3 @@ public final class Aberrant extends CardImpl {
|
|||
return new Aberrant(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AberrantTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
AberrantTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect()
|
||||
.setText("destroy target artifact or enchantment that player controls"), false
|
||||
);
|
||||
this.withFlavorWord("Heavy Power Hammer");
|
||||
this.setTriggerPhrase("Whenever {this} deals combat damage to a player, ");
|
||||
}
|
||||
|
||||
private AberrantTriggeredAbility(final AberrantTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AberrantTriggeredAbility copy() {
|
||||
return new AberrantTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Player player = game.getPlayer(event.getPlayerId());
|
||||
if (player == null
|
||||
|| !event.getSourceId().equals(this.getSourceId())
|
||||
|| !((DamagedEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
FilterPermanent filter = new FilterArtifactOrEnchantmentPermanent(
|
||||
"artifact or enchantment " + player.getLogName() + " controls"
|
||||
);
|
||||
filter.add(new ControllerIdPredicate(player.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,32 +1,32 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealCombatDamageControlledTriggeredAbility;
|
||||
import mage.abilities.common.FirstSpellOpponentsTurnTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.combat.GoadTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.*;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.token.FaerieRogueToken;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class AlelaCunningConqueror extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent faerieFilter = new FilterCreaturePermanent(SubType.FAERIE, "Faeries");
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public AlelaCunningConqueror(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
|
||||
|
||||
|
|
@ -45,8 +45,12 @@ public final class AlelaCunningConqueror extends CardImpl {
|
|||
));
|
||||
|
||||
// Whenever one or more Faeries you control deal combat damage to a player, goad target creature that player controls.
|
||||
TriggeredAbility trigger = new AlelaCunningConquerorTriggeredAbility();
|
||||
this.addAbility(trigger);
|
||||
Effect effect = new GoadTargetEffect().setText("goad target creature that player controls");
|
||||
Ability ability = new DealCombatDamageControlledTriggeredAbility(Zone.BATTLEFIELD, effect, faerieFilter, SetTargetPointer.PLAYER, false);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AlelaCunningConqueror(final AlelaCunningConqueror card) {
|
||||
|
|
@ -58,38 +62,3 @@ public final class AlelaCunningConqueror extends CardImpl {
|
|||
return new AlelaCunningConqueror(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AlelaCunningConquerorTriggeredAbility extends DealCombatDamageControlledTriggeredAbility {
|
||||
|
||||
private static final FilterCreaturePermanent faerieFilter = new FilterCreaturePermanent(SubType.FAERIE, "Faeries");
|
||||
|
||||
AlelaCunningConquerorTriggeredAbility() {
|
||||
super(new GoadTargetEffect().setText("goad target creature that player controls"), faerieFilter);
|
||||
}
|
||||
|
||||
private AlelaCunningConquerorTriggeredAbility(final AlelaCunningConquerorTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlelaCunningConquerorTriggeredAbility copy() {
|
||||
return new AlelaCunningConquerorTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!super.checkTrigger(event, game)) {
|
||||
return false;
|
||||
}
|
||||
Player opponent = game.getPlayer(event.getTargetId());
|
||||
if (opponent == null) {
|
||||
return false;
|
||||
}
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ public final class Archipelagore extends CardImpl {
|
|||
"tap up to X target creatures, where X is the number of times this creature has mutated."
|
||||
));
|
||||
ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("Those creatures"));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(SourceMutatedCount.instance));
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(SourceMutatedCount.instance));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
|
|
@ -10,27 +10,29 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author North
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class ArmWithAether extends CardImpl {
|
||||
|
||||
public ArmWithAether(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}");
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public ArmWithAether(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}");
|
||||
|
||||
// Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand."
|
||||
Effect effect = new GainAbilityControlledEffect(new ArmWithAetherTriggeredAbility(), Duration.EndOfTurn, new FilterCreaturePermanent());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandTargetEffect(), false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
Effect effect = new GainAbilityControlledEffect(ability, Duration.EndOfTurn, new FilterCreaturePermanent());
|
||||
effect.setText("Until end of turn, creatures you control gain \"Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand.\"");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
}
|
||||
|
|
@ -44,43 +46,3 @@ public final class ArmWithAether extends CardImpl {
|
|||
return new ArmWithAether(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArmWithAetherTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public ArmWithAetherTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), true);
|
||||
}
|
||||
|
||||
private ArmWithAetherTriggeredAbility(final ArmWithAetherTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArmWithAetherTriggeredAbility copy() {
|
||||
return new ArmWithAetherTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent != null && event.getSourceId().equals(this.sourceId)) {
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@ public final class AryelKnightOfWindgrace extends CardImpl {
|
|||
.setText("Destroy target creature with power X or less"), new ManaCostsImpl<>("{B}"));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new TapVariableTargetCost(filter));
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,27 +1,22 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.SacrificeTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Loki
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class AshlingTheExtinguisher extends CardImpl {
|
||||
|
||||
|
|
@ -34,7 +29,11 @@ public final class AshlingTheExtinguisher extends CardImpl {
|
|||
// Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. they sacrifice that creature.
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.addAbility(new AshlingTheExtinguisherTriggeredAbility());
|
||||
Effect effect = new SacrificeTargetEffect().setText("choose target creature that player controls. The player sacrifices that creature");
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AshlingTheExtinguisher(final AshlingTheExtinguisher card) {
|
||||
|
|
@ -47,47 +46,3 @@ public final class AshlingTheExtinguisher extends CardImpl {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
class AshlingTheExtinguisherTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public AshlingTheExtinguisherTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new SacrificeTargetEffect());
|
||||
this.addTarget(new TargetCreaturePermanent());
|
||||
}
|
||||
|
||||
private AshlingTheExtinguisherTriggeredAbility(final AshlingTheExtinguisherTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AshlingTheExtinguisherTriggeredAbility copy() {
|
||||
return new AshlingTheExtinguisherTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent != null) {
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, choose target creature that player controls. The player sacrifices that creature.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,10 +50,10 @@ public final class AureliasVindicator extends CardImpl {
|
|||
// When Aurelia's Vindicator is turned face up, exile up to X other target creatures from the battlefield and/or creature cards from graveyards.
|
||||
Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ExileTargetForSourceEffect()
|
||||
.setText("exile up to X other target creatures from the battlefield and/or creature cards from graveyards"));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(MorphManacostVariableValue.instance));
|
||||
ability.addTarget(new TargetCardInGraveyardBattlefieldOrStack(
|
||||
0, 1, StaticFilters.FILTER_CARD_CREATURE, StaticFilters.FILTER_PERMANENT_CREATURES
|
||||
));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(MorphManacostVariableValue.instance));
|
||||
this.addAbility(ability);
|
||||
|
||||
// When Aurelia's Vindicator leaves the battlefield, return the exiled cards to their owners' hands.
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ public final class Avalanche extends CardImpl {
|
|||
|
||||
// Destroy X target snow lands.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target snow lands"));
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR));
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(1, 1, filter, false));
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ public final class BackInTown extends CardImpl {
|
|||
// Return X target outlaw creature cards from your graveyard to the battlefield.
|
||||
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
||||
.setText("return X target outlaw creature cards from your graveyard to the battlefield"));
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR));
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR));
|
||||
}
|
||||
|
||||
private BackInTown(final BackInTown card) {
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ public final class BlatantThievery extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true)
|
||||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, gain control of target permanent that player controls"));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
}
|
||||
|
||||
private BlatantThievery(final BlatantThievery card) {
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@ package mage.cards.b;
|
|||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.keyword.IntimidateAbility;
|
||||
|
|
@ -11,22 +12,18 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author North
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class BlindZealot extends CardImpl {
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public BlindZealot(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
|
||||
|
|
@ -39,7 +36,10 @@ public final class BlindZealot extends CardImpl {
|
|||
this.addAbility(IntimidateAbility.getInstance());
|
||||
|
||||
// Whenever Blind Zealot deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls.
|
||||
Ability ability = new BlindZealotTriggeredAbility();
|
||||
OneShotEffect effect = new DoIfCostPaid(new DestroyTargetEffect(), new SacrificeSourceCost());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
@ -52,45 +52,3 @@ public final class BlindZealot extends CardImpl {
|
|||
return new BlindZealot(this);
|
||||
}
|
||||
}
|
||||
|
||||
class BlindZealotTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
BlindZealotTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DoIfCostPaid(new DestroyTargetEffect(), new SacrificeSourceCost()), false);
|
||||
}
|
||||
|
||||
private BlindZealotTriggeredAbility(final BlindZealotTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlindZealotTriggeredAbility copy() {
|
||||
return new BlindZealotTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent == null
|
||||
|| !event.getSourceId().equals(this.sourceId)
|
||||
|| !((DamagedEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may sacrifice it. "
|
||||
+ "If you do, destroy target creature that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public final class BlueSunsTwilight extends CardImpl {
|
|||
new CreateTokenCopyTargetEffect(), BlueSunsTwilightCondition.instance,
|
||||
"If X is 5 or more, create a token that's a copy of that creature"
|
||||
));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS));
|
||||
}
|
||||
|
||||
private BlueSunsTwilight(final BlueSunsTwilight card) {
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@ public final class BronzebeakForagers extends CardImpl {
|
|||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield")
|
||||
);
|
||||
etbAbility.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
etbAbility.addTarget(new TargetNonlandPermanent(0, 1));
|
||||
etbAbility.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(etbAbility);
|
||||
|
||||
// {X}{W}: Put target card with mana value X exiled with Bronzebeak Foragers into its owner's graveyard.
|
||||
|
|
|
|||
|
|
@ -1,33 +1,31 @@
|
|||
|
||||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Mitchel Stein
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class CausticWasps extends CardImpl {
|
||||
|
||||
private static final FilterArtifactPermanent filter
|
||||
= new FilterArtifactPermanent("artifact that player controls");
|
||||
|
||||
public CausticWasps(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
|
||||
this.subtype.add(SubType.INSECT);
|
||||
|
||||
this.power = new MageInt(1);
|
||||
|
|
@ -35,8 +33,12 @@ public final class CausticWasps extends CardImpl {
|
|||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Whenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls.
|
||||
this.addAbility(new CausticWaspsTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private CausticWasps(final CausticWasps card) {
|
||||
|
|
@ -48,46 +50,3 @@ public final class CausticWasps extends CardImpl {
|
|||
return new CausticWasps(this);
|
||||
}
|
||||
}
|
||||
|
||||
class CausticWaspsTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public CausticWaspsTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private CausticWaspsTriggeredAbility(final CausticWaspsTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CausticWaspsTriggeredAbility copy() {
|
||||
return new CausticWaspsTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getSourceId().equals(this.sourceId) && ((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
Player player = game.getPlayer(event.getTargetId());
|
||||
if (player != null) {
|
||||
FilterPermanent filter = new FilterPermanent("an artifact controlled by " + player.getLogName());
|
||||
filter.add(CardType.ARTIFACT.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(event.getTargetId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may destroy target artifact that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ public final class ChangeOfPlans extends CardImpl {
|
|||
|
||||
// Each of X target creatures you control connive. You may have any number of them phase out.
|
||||
this.getSpellAbility().addEffect(new ChangeOfPlansEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private ChangeOfPlans(final ChangeOfPlans card) {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class ChokingVines extends CardImpl {
|
|||
.setText("X target attacking creatures become blocked."));
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(1)
|
||||
.setText("{this} deals 1 damage to each of those creatures"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_ATTACKING_CREATURES));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private ChokingVines(final ChokingVines card) {
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public final class CometStorm extends CardImpl {
|
|||
// Choose any target, then choose another any target for each time Comet Storm was kicked. Comet Storm deals X damage to each of them.
|
||||
this.getSpellAbility().addEffect(new CometStormEffect());
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget(1));
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(new IntPlusDynamicValue(1, MultikickerCount.instance)));
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget());
|
||||
this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(new IntPlusDynamicValue(1, MultikickerCount.instance)));
|
||||
}
|
||||
|
||||
private CometStorm(final CometStorm card) {
|
||||
|
|
|
|||
|
|
@ -1,31 +1,23 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TheElk801
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class CommandoRaid extends CardImpl {
|
||||
|
||||
|
|
@ -33,12 +25,18 @@ public final class CommandoRaid extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
|
||||
|
||||
// Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls."
|
||||
Effect effect = new DamageTargetEffect(new SourcePermanentPowerCount());
|
||||
effect.setText("have it deal damage equal to its power to target creature that player controls.");
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, true, true);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
|
||||
new CommandoRaidTriggeredAbility(), Duration.EndOfTurn,
|
||||
ability, Duration.EndOfTurn,
|
||||
"Until end of turn, target creature you control gains "
|
||||
+ "\"When this creature deals combat damage to a player, "
|
||||
+ "you may have it deal damage equal to its power "
|
||||
+ "to target creature that player controls.\""
|
||||
+ "\"When this creature deals combat damage to a player, "
|
||||
+ "you may have it deal damage equal to its power "
|
||||
+ "to target creature that player controls.\""
|
||||
));
|
||||
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
|
||||
}
|
||||
|
|
@ -52,72 +50,3 @@ public final class CommandoRaid extends CardImpl {
|
|||
return new CommandoRaid(this);
|
||||
}
|
||||
}
|
||||
|
||||
class CommandoRaidTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public CommandoRaidTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new CommandoRaidEffect(), true);
|
||||
}
|
||||
|
||||
private CommandoRaidTriggeredAbility(final CommandoRaidTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandoRaidTriggeredAbility copy() {
|
||||
return new CommandoRaidTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (!damageEvent.isCombatDamage()
|
||||
|| !event.getSourceId().equals(this.getSourceId())
|
||||
|| opponent == null) {
|
||||
return false;
|
||||
}
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
for (Effect effect : this.getAllEffects()) {
|
||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||
effect.setValue("damage", event.getAmount());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "When this creature deals combat damage to a player, "
|
||||
+ "you may have it deal that much damage to target creature that player controls";
|
||||
}
|
||||
}
|
||||
|
||||
class CommandoRaidEffect extends OneShotEffect {
|
||||
|
||||
CommandoRaidEffect() {
|
||||
super(Outcome.Damage);
|
||||
staticText = "it deals that much damage to target creature that player controls";
|
||||
}
|
||||
|
||||
private CommandoRaidEffect(final CommandoRaidEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return new DamageTargetEffect((Integer) getValue("damage")).apply(game, source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandoRaidEffect copy() {
|
||||
return new CommandoRaidEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ public final class CrackleWithPower extends CardImpl {
|
|||
this.getSpellAbility().addEffect(
|
||||
new DamageTargetEffect(value).setText("{this} deals five times X damage to each of up to X targets")
|
||||
);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget(0, 1));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private CrackleWithPower(final CrackleWithPower card) {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class CurseOfTheSwine extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new CurseOfTheSwineEffect());
|
||||
|
||||
// Correct number of targets will be set in adjustTargets
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ public final class CustodiSoulcaller extends CardImpl {
|
|||
// Whenever Custodi Soulcaller attacks, return target creature card with converted mana cost X or less from your graveyard to the battlefield, where X is the number of players you attacked with a creature this combat.
|
||||
Ability ability = new AttacksTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return target creature card with mana value X or less from your graveyard to the battlefield, where X is the number of players you attacked this combat"), false);
|
||||
ability.addWatcher(new CustodiSoulcallerWatcher());
|
||||
ability.setTargetAdjuster(new ManaValueTargetAdjuster(CustodiSoulcallerValue.instance, ComparisonType.OR_LESS));
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new ManaValueTargetAdjuster(CustodiSoulcallerValue.instance, ComparisonType.OR_LESS));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
package mage.cards.d;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.keyword.MorphAbility;
|
||||
|
|
@ -11,30 +11,33 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterEnchantmentPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author djbrez
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class DawningPurist extends CardImpl {
|
||||
|
||||
private static final FilterEnchantmentPermanent filter
|
||||
= new FilterEnchantmentPermanent("enchantment that player controls");
|
||||
|
||||
public DawningPurist(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
|
||||
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls.
|
||||
this.addAbility(new DawningPuristTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Morph {1}{W}
|
||||
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}")));
|
||||
|
|
@ -49,44 +52,3 @@ public final class DawningPurist extends CardImpl {
|
|||
return new DawningPurist(this);
|
||||
}
|
||||
}
|
||||
|
||||
class DawningPuristTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
DawningPuristTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private DawningPuristTriggeredAbility(final DawningPuristTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DawningPuristTriggeredAbility copy() {
|
||||
return new DawningPuristTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) {
|
||||
FilterEnchantmentPermanent filter = new FilterEnchantmentPermanent("enchantment that player controls");
|
||||
filter.add(new ControllerIdPredicate(event.getPlayerId()));
|
||||
filter.setMessage("enchantment controlled by " + game.getPlayer(event.getTargetId()).getLogName());
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may destroy target enchantment that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ public final class DeathDenied extends CardImpl {
|
|||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||
effect.setText("Return X target creature cards from your graveyard to your hand");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private DeathDenied(final DeathDenied card) {
|
||||
|
|
|
|||
|
|
@ -48,8 +48,8 @@ public final class DeathKiss extends CardImpl {
|
|||
Ability ability = new BecomesMonstrousSourceTriggeredAbility(
|
||||
new GoadTargetEffect().setText("goad up to X target creatures your opponents control")
|
||||
);
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(GetMonstrosityXValue.instance));
|
||||
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(GetMonstrosityXValue.instance));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ public final class DecoyGambit extends CardImpl {
|
|||
// For each opponent, choose up to one target creature that player controls,
|
||||
// then return that creature to its owner's hand unless its controller has you draw a card.
|
||||
this.getSpellAbility().addEffect(new DecoyGambitEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
}
|
||||
|
||||
private DecoyGambit(final DecoyGambit card) {
|
||||
|
|
|
|||
|
|
@ -1,34 +1,36 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.common.SimpleEvasionAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.MayCastTargetCardEffect;
|
||||
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
|
||||
import mage.abilities.effects.common.replacement.ThatSpellGraveyardExileReplacementEffect;
|
||||
import mage.abilities.keyword.CrewAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.CastManaAdjustment;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.common.FilterInstantOrSorceryCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.card.OwnerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.target.Target;
|
||||
import mage.target.common.TargetCardInGraveyard;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801, Grath, xenohedron
|
||||
* @author TheElk801, Grath, xenohedron, notgreat
|
||||
*/
|
||||
public final class DeluxeDragster extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by Vehicles");
|
||||
private static final FilterCard filterCard = new FilterInstantOrSorceryCard("instant or sorcery card from that player's graveyard");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.not(SubType.VEHICLE.getPredicate()));
|
||||
|
|
@ -46,7 +48,14 @@ public final class DeluxeDragster extends CardImpl {
|
|||
|
||||
// Whenever Deluxe Dragster deals combat damage to a player, you may cast target instant or sorcery card from
|
||||
// that player’s graveyard without paying its mana cost. If that spell would be put into a graveyard, exile it instead.
|
||||
this.addAbility(new DeluxeDragsterTriggeredAbility());
|
||||
OneShotEffect effect = new MayCastTargetCardEffect(CastManaAdjustment.WITHOUT_PAYING_MANA_COST, true);
|
||||
effect.setText("you may cast target instant or sorcery card from "
|
||||
+ "that player's graveyard without paying its mana cost. "
|
||||
+ ThatSpellGraveyardExileReplacementEffect.RULE_A);
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true);
|
||||
ability.addTarget(new TargetCardInGraveyard(filterCard));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Crew 2
|
||||
this.addAbility(new CrewAbility(2));
|
||||
|
|
@ -61,49 +70,3 @@ public final class DeluxeDragster extends CardImpl {
|
|||
return new DeluxeDragster(this);
|
||||
}
|
||||
}
|
||||
|
||||
class DeluxeDragsterTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
DeluxeDragsterTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new MayCastTargetCardEffect(CastManaAdjustment.WITHOUT_PAYING_MANA_COST, true)
|
||||
.setText("you may cast target instant or sorcery card from "
|
||||
+ "that player's graveyard without paying its mana cost. "
|
||||
+ ThatSpellGraveyardExileReplacementEffect.RULE_A), false);
|
||||
setTriggerPhrase("Whenever {this} deals combat damage to a player, ");
|
||||
}
|
||||
|
||||
private DeluxeDragsterTriggeredAbility(final DeluxeDragsterTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeluxeDragsterTriggeredAbility copy() {
|
||||
return new DeluxeDragsterTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!event.getSourceId().equals(this.sourceId) || !((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
Player damagedPlayer = game.getPlayer(event.getTargetId());
|
||||
if (damagedPlayer == null) {
|
||||
return false;
|
||||
}
|
||||
FilterCard filter = new FilterCard("instant or sorcery card from that player's graveyard");
|
||||
filter.add(new OwnerIdPredicate(damagedPlayer.getId()));
|
||||
filter.add(Predicates.or(
|
||||
CardType.INSTANT.getPredicate(),
|
||||
CardType.SORCERY.getPredicate()
|
||||
));
|
||||
Target target = new TargetCardInGraveyard(filter);
|
||||
this.getTargets().clear();
|
||||
this.addTarget(target);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public final class DesecrateReality extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new ExileTargetEffect()
|
||||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, exile up to one target permanent that player controls with an even mana value."));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, evenFilter));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
|
||||
// Adamant -- If at least three colorless mana was spent to cast this spell, return a permanent card with an odd mana value from your graveyard to the battlefield.
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ public final class Detonate extends CardImpl {
|
|||
Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.REGULAR);
|
||||
effect.setText("{this} deals X damage to that artifact's controller");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
}
|
||||
|
||||
private Detonate(final Detonate card) {
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ public final class Disembowel extends CardImpl {
|
|||
|
||||
// Destroy target creature with converted mana cost X.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with mana value X"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
}
|
||||
|
||||
private Disembowel(final Disembowel card) {
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ public final class DismantlingWave extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new DestroyTargetEffect()
|
||||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("For each opponent, destroy up to one target artifact or enchantment that player controls."));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
|
||||
// Cycling {6}{W}{W}
|
||||
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{6}{W}{W}")));
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ public final class DisorderInTheCourt extends CardImpl {
|
|||
|
||||
// Exile X target creatures, then investigate X times. Return the exiled cards to the battlefield tapped under their owners' control at the beginning of the next end step.
|
||||
this.getSpellAbility().addEffect(new DisorderInTheCourtEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private DisorderInTheCourt(final DisorderInTheCourt card) {
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ public final class DistortingWake extends CardImpl {
|
|||
Effect effect = new ReturnToHandTargetEffect();
|
||||
effect.setText("Return X target nonland permanents to their owners' hands");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private DistortingWake(final DistortingWake card) {
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public final class DokuchiSilencer extends CardImpl {
|
|||
this.addAbility(new NinjutsuAbility("{1}{B}"));
|
||||
|
||||
// Whenever Dokuchi Silencer deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls.
|
||||
this.addAbility(new BlindZealotTriggeredAbility());
|
||||
this.addAbility(new DokuchiSilencerTriggeredAbility());
|
||||
}
|
||||
|
||||
private DokuchiSilencer(final DokuchiSilencer card) {
|
||||
|
|
@ -55,19 +55,19 @@ public final class DokuchiSilencer extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class BlindZealotTriggeredAbility extends TriggeredAbilityImpl {
|
||||
class DokuchiSilencerTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
BlindZealotTriggeredAbility() {
|
||||
DokuchiSilencerTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, null, false);
|
||||
}
|
||||
|
||||
private BlindZealotTriggeredAbility(final BlindZealotTriggeredAbility ability) {
|
||||
private DokuchiSilencerTriggeredAbility(final DokuchiSilencerTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlindZealotTriggeredAbility copy() {
|
||||
return new BlindZealotTriggeredAbility(this);
|
||||
public DokuchiSilencerTriggeredAbility copy() {
|
||||
return new DokuchiSilencerTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ public final class Doppelgang extends CardImpl {
|
|||
|
||||
// For each of X target permanents, create X tokens that are copies of that permanent.
|
||||
this.getSpellAbility().addEffect(new DoppelgangEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private Doppelgang(final Doppelgang card) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
|
|
@ -8,24 +12,21 @@ import mage.abilities.keyword.TrampleAbility;
|
|||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetAttackingCreature;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class DreadmawsIre extends CardImpl {
|
||||
|
||||
private static final FilterArtifactPermanent filter
|
||||
= new FilterArtifactPermanent("artifact that player controls");
|
||||
|
||||
public DreadmawsIre(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}");
|
||||
|
||||
|
|
@ -36,9 +37,14 @@ public final class DreadmawsIre extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance())
|
||||
.setText("and gains trample"));
|
||||
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
|
||||
new DreadmawsIreTriggeredAbility()
|
||||
).setText("and \"Whenever this creature deals combat damage to a player, destroy target artifact that player controls.\""));
|
||||
Effect effect = new DamageTargetEffect(new SourcePermanentPowerCount());
|
||||
effect.setText("have it deal damage equal to its power to target creature that player controls.");
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(ability)
|
||||
.setText("and \"Whenever this creature deals combat damage to a player, destroy target artifact that player controls.\""));
|
||||
}
|
||||
|
||||
private DreadmawsIre(final DreadmawsIre card) {
|
||||
|
|
@ -50,51 +56,3 @@ public final class DreadmawsIre extends CardImpl {
|
|||
return new DreadmawsIre(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inspired by {@link mage.cards.t.TrygonPredator}
|
||||
*/
|
||||
class DreadmawsIreTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public DreadmawsIreTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), false);
|
||||
}
|
||||
|
||||
private DreadmawsIreTriggeredAbility(final DreadmawsIreTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DreadmawsIreTriggeredAbility copy() {
|
||||
return new DreadmawsIreTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!event.getSourceId().equals(this.sourceId) || !((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player player = game.getPlayer(event.getTargetId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FilterPermanent filter = new FilterArtifactPermanent("an artifact controlled by " + player.getLogName());
|
||||
filter.add(new ControllerIdPredicate(event.getTargetId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, destroy target artifact that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ public final class DregsOfSorrow extends CardImpl {
|
|||
// Destroy X target nonblack creatures. Draw X cards.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures"));
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private DregsOfSorrow(final DregsOfSorrow card) {
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ public final class ElminstersSimulacrum extends CardImpl {
|
|||
|
||||
// For each opponent, you create a token that's a copy of up to one target creature that player controls.
|
||||
this.getSpellAbility().addEffect(new ElminstersSimulacrumAdjusterEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
}
|
||||
|
||||
private ElminstersSimulacrum(final ElminstersSimulacrum card) {
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ public final class EnigmaThief extends CardImpl {
|
|||
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()
|
||||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, return up to one target nonland permanent that player controls to its owner's hand"));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetNonlandPermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class EntDraughtBasin extends CardImpl {
|
|||
new ManaCostsImpl<>("{X}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.EQUAL_TO));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.EQUAL_TO));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ public final class EntrancingLyre extends CardImpl {
|
|||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addEffect(new DontUntapAsLongAsSourceTappedEffect());
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ public final class EntreatTheDead extends CardImpl {
|
|||
|
||||
// Return X target creature cards from your graveyard to the battlefield.
|
||||
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return X target creature cards from your graveyard to the battlefield"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
|
||||
// Miracle {X}{B}{B}
|
||||
this.addAbility(new MiracleAbility("{X}{B}{B}"));
|
||||
|
|
|
|||
|
|
@ -1,36 +1,33 @@
|
|||
package mage.cards.e;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
|
||||
import mage.abilities.keyword.CantBeBlockedSourceAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TheElk801
|
||||
* @author TheElk801. notgreat
|
||||
*/
|
||||
public final class EtrataTheSilencer extends CardImpl {
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public EtrataTheSilencer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
|
||||
|
|
@ -45,7 +42,11 @@ public final class EtrataTheSilencer extends CardImpl {
|
|||
this.addAbility(new CantBeBlockedSourceAbility());
|
||||
|
||||
// Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with hit counters on them. Etrata's owner shuffles Etrata into their library.
|
||||
this.addAbility(new EtrataTheSilencerTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new EtrataTheSilencerEffect(), false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private EtrataTheSilencer(final EtrataTheSilencer card) {
|
||||
|
|
@ -58,53 +59,6 @@ public final class EtrataTheSilencer extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class EtrataTheSilencerTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public EtrataTheSilencerTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new EtrataTheSilencerEffect());
|
||||
}
|
||||
|
||||
private EtrataTheSilencerTriggeredAbility(final EtrataTheSilencerTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EtrataTheSilencerTriggeredAbility copy() {
|
||||
return new EtrataTheSilencerTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent != null) {
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, "
|
||||
+ "exile target creature that player controls "
|
||||
+ "and put a hit counter on that card. "
|
||||
+ "That player loses the game if they own three or more "
|
||||
+ "exiled cards with hit counters on them. "
|
||||
+ "{this}'s owner shuffles {this} into their library.";
|
||||
}
|
||||
}
|
||||
|
||||
class EtrataTheSilencerEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterCard filter = new FilterCard();
|
||||
|
|
@ -157,4 +111,13 @@ class EtrataTheSilencerEffect extends OneShotEffect {
|
|||
controller.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
return "exile target creature that player controls "
|
||||
+ "and put a hit counter on that card. "
|
||||
+ "That player loses the game if they own three or more "
|
||||
+ "exiled cards with hit counters on them. "
|
||||
+ "{this}'s owner shuffles {this} into their library";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,8 +43,8 @@ public final class ExtraordinaryJourney extends CardImpl {
|
|||
|
||||
// When Extraordinary Journey enters the battlefield, exile up to X target creatures. For each of those cards, its owner may play it for as long as it remains exiled.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ExtraordinaryJourneyEffect());
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever one or more nontoken creatures enter the battlefield, if one or more of them entered from exile or was cast from exile, you draw a card. This ability triggers only once each turn.
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ public final class FinaleOfEternity extends CardImpl {
|
|||
// Destroy up to three target creatures with toughness X or less. If X is 10 or more, return all creature cards from your graveyard to the battlefield.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect().setText("destroy up to three target creatures with toughness X or less"));
|
||||
this.getSpellAbility().addEffect(new FinaleOfEternityEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new ToughnessTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(0, 3, StaticFilters.FILTER_PERMANENT_CREATURES));
|
||||
this.getSpellAbility().setTargetAdjuster(new ToughnessTargetAdjuster(ComparisonType.OR_LESS));
|
||||
}
|
||||
|
||||
private FinaleOfEternity(final FinaleOfEternity card) {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class Firestorm extends CardImpl {
|
|||
|
||||
// Firestorm deals X damage to each of X target creatures and/or players.
|
||||
this.getSpellAbility().addEffect(new FirestormEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private Firestorm(final Firestorm card) {
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ public final class GangUp extends CardImpl {
|
|||
|
||||
// Destroy target creature with power X or less.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less"));
|
||||
this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE));
|
||||
this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
}
|
||||
|
||||
private GangUp(final GangUp card) {
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ public final class GethLordOfTheVault extends CardImpl {
|
|||
// {X}{B}: Put target artifact or creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control tapped.
|
||||
// Then that player puts the top X cards of their library into their graveyard.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GethLordOfTheVaultEffect(), new ManaCostsImpl<>("{X}{B}"));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
ability.addTarget(new TargetCardInGraveyard(filter));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ public final class GhostLitDrifter extends CardImpl {
|
|||
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
||||
"X target creatures gain flying until end of turn"
|
||||
));
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ public final class GlimpseTheSunGod extends CardImpl {
|
|||
// Tap X target creatures. Scry 1.
|
||||
this.getSpellAbility().addEffect(new TapTargetEffect("tap X target creatures"));
|
||||
this.getSpellAbility().addEffect(new ScryEffect(1));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private GlimpseTheSunGod(final GlimpseTheSunGod card) {
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ public final class GraspOfFate extends CardImpl {
|
|||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield")
|
||||
);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetNonlandPermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ public final class Gridlock extends CardImpl {
|
|||
|
||||
// Tap X target nonland permanents.
|
||||
this.getSpellAbility().addEffect(new TapTargetEffect("tap X target nonland permanents"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private Gridlock(final Gridlock card) {
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
package mage.cards.h;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
|
|
@ -15,29 +15,33 @@ import mage.constants.CardType;
|
|||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.filter.common.FilterEquipmentPermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Loki
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class HammerOfRuin extends CardImpl {
|
||||
|
||||
public HammerOfRuin (UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
|
||||
private static final FilterEquipmentPermanent filter
|
||||
= new FilterEquipmentPermanent("Equipment that player controls");
|
||||
|
||||
public HammerOfRuin(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
this.subtype.add(SubType.EQUIPMENT);
|
||||
|
||||
// Equipped creature gets +2/+0.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(2, 0)));
|
||||
|
||||
// Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls.
|
||||
this.addAbility(new HammerOfRuinTriggeredAbility());
|
||||
Ability ability = new DealsDamageToAPlayerAttachedTriggeredAbility(new DestroyTargetEffect(), "equipped creature", false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Equip {2}
|
||||
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2), false));
|
||||
}
|
||||
|
|
@ -52,46 +56,3 @@ public final class HammerOfRuin extends CardImpl {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
class HammerOfRuinTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
HammerOfRuinTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private HammerOfRuinTriggeredAbility(final HammerOfRuinTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HammerOfRuinTriggeredAbility copy() {
|
||||
return new HammerOfRuinTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event;
|
||||
Permanent p = game.getPermanent(event.getSourceId());
|
||||
if (damageEvent.isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) {
|
||||
FilterPermanent filter = new FilterPermanent("Equipment that player controls");
|
||||
filter.add(SubType.EQUIPMENT.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(event.getPlayerId()));
|
||||
filter.setMessage("creature controlled by " + game.getPlayer(event.getTargetId()).getLogName());
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ public final class HammersOfMoradin extends CardImpl {
|
|||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("for each opponent, tap up to one target creature that player controls")
|
||||
);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ public final class HideousTaskmaster extends CardImpl {
|
|||
Ability ability = new CastSourceTriggeredAbility(
|
||||
new GainControlTargetEffect(Duration.EndOfTurn).setTargetPointer(new EachTargetPointer()).setText(
|
||||
"for each opponent, gain control of up to one target creature that player controls until end of turn"));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addEffect(
|
||||
new UntapTargetEffect().setTargetPointer(new EachTargetPointer()).setText("Untap those creatures"));
|
||||
ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ public final class HourOfEternity extends CardImpl {
|
|||
|
||||
// Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie.
|
||||
this.getSpellAbility().addEffect(new HourOfEternityEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private HourOfEternity(final HourOfEternity card) {
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ public final class IcyBlast extends CardImpl {
|
|||
new LockedInCondition(FerociousCondition.instance));
|
||||
effect.setText("<br/><i>Ferocious</i> — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addHint(FerociousHint.instance);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ public final class InTheDarknessBindThem extends CardImpl {
|
|||
ability.addEffect(new TheRingTemptsYouEffect());
|
||||
|
||||
ability.getEffects().setTargetPointer(new EachTargetPointer());
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
}
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class IndomitableCreativity extends CardImpl {
|
|||
|
||||
// Destroy X target artifacts and/or creatures. For each permanent destroyed this way, its controller reveals cards from the top of their library until an artifact or creature card is revealed and exiles that card. Those players put the exiled card onto the battlefield, then shuffle their libraries.
|
||||
this.getSpellAbility().addEffect(new IndomitableCreativityEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private IndomitableCreativity(final IndomitableCreativity card) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
package mage.cards.i;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.RegenerateSourceEffect;
|
||||
|
|
@ -14,20 +14,20 @@ import mage.constants.CardType;
|
|||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.card.OwnerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.target.common.TargetCardInGraveyard;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class InkEyesServantOfOni extends CardImpl {
|
||||
|
||||
private static final FilterCreatureCard filter
|
||||
= new FilterCreatureCard("creature card from that player's graveyard");
|
||||
|
||||
public InkEyesServantOfOni(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
|
||||
this.subtype.add(SubType.RAT);
|
||||
|
|
@ -41,7 +41,10 @@ public final class InkEyesServantOfOni extends CardImpl {
|
|||
this.addAbility(new NinjutsuAbility("{3}{B}{B}"));
|
||||
|
||||
// Whenever Ink-Eyes, Servant of Oni deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control.
|
||||
this.addAbility(new InkEyesServantOfOniTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetCardInGraveyard(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster(true));
|
||||
this.addAbility(ability);
|
||||
|
||||
// {1}{B}: Regenerate Ink-Eyes.
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl<>("{1}{B}")));
|
||||
|
|
@ -56,49 +59,3 @@ public final class InkEyesServantOfOni extends CardImpl {
|
|||
return new InkEyesServantOfOni(this);
|
||||
}
|
||||
}
|
||||
|
||||
class InkEyesServantOfOniTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public InkEyesServantOfOniTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new ReturnFromGraveyardToBattlefieldTargetEffect(), true);
|
||||
}
|
||||
|
||||
private InkEyesServantOfOniTriggeredAbility(final InkEyesServantOfOniTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InkEyesServantOfOniTriggeredAbility copy() {
|
||||
return new InkEyesServantOfOniTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!event.getSourceId().equals(this.sourceId) || !((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
Player damagedPlayer = game.getPlayer(event.getTargetId());
|
||||
if (damagedPlayer == null) {
|
||||
return false;
|
||||
}
|
||||
FilterCard filter = new FilterCard("creature in " + damagedPlayer.getName() + "'s graveyard");
|
||||
filter.add(CardType.CREATURE.getPredicate());
|
||||
filter.add(new OwnerIdPredicate(damagedPlayer.getId()));
|
||||
TargetCardInGraveyard target = new TargetCardInGraveyard(filter);
|
||||
this.getTargets().clear();
|
||||
this.addTarget(target);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, "
|
||||
+ "you may put target creature card from that player's "
|
||||
+ "graveyard onto the battlefield under your control.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ public final class JuvenileMistDragon extends CardImpl {
|
|||
.setTargetPointer(new EachTargetPointer())
|
||||
.setText("Each of those creatures doesn't untap during its controller's next untap step")
|
||||
);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability.withFlavorWord("Confounding Clouds"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ public final class KaerveksPurge extends CardImpl {
|
|||
|
||||
// Destroy target creature with converted mana cost X. If that creature dies this way, Kaervek's Purge deals damage equal to the creature's power to the creature's controller.
|
||||
this.getSpellAbility().addEffect(new KaerveksPurgeEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
}
|
||||
|
||||
private KaerveksPurge(final KaerveksPurge card) {
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ public final class KillingGlare extends CardImpl {
|
|||
|
||||
// Destroy target creature with power X or less.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less"));
|
||||
this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
}
|
||||
|
||||
private KillingGlare(final KillingGlare card) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
|
||||
package mage.cards.l;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
|
|
@ -10,28 +10,25 @@ import mage.abilities.keyword.FlashAbility;
|
|||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author L_J
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class LatullasOrders extends CardImpl {
|
||||
|
||||
private static final FilterArtifactPermanent filter
|
||||
= new FilterArtifactPermanent("artifact that player controls");
|
||||
|
||||
public LatullasOrders(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
|
||||
this.subtype.add(SubType.AURA);
|
||||
|
||||
// Flash
|
||||
|
|
@ -44,7 +41,10 @@ public final class LatullasOrders extends CardImpl {
|
|||
this.addAbility(new EnchantAbility(auraTarget));
|
||||
|
||||
// Whenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls.
|
||||
this.addAbility(new LatullasOrdersTriggeredAbility());
|
||||
Ability ability = new DealsDamageToAPlayerAttachedTriggeredAbility(new DestroyTargetEffect(), "enchanted creature", true, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private LatullasOrders(final LatullasOrders card) {
|
||||
|
|
@ -56,47 +56,3 @@ public final class LatullasOrders extends CardImpl {
|
|||
return new LatullasOrders(this);
|
||||
}
|
||||
}
|
||||
|
||||
class LatullasOrdersTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public LatullasOrdersTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private LatullasOrdersTriggeredAbility(final LatullasOrdersTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LatullasOrdersTriggeredAbility copy() {
|
||||
return new LatullasOrdersTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Permanent enchantment = game.getPermanentOrLKIBattlefield(this.getSourceId());
|
||||
if (event.getSourceId().equals(enchantment.getAttachedTo()) && ((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
Player player = game.getPlayer(event.getTargetId());
|
||||
if (player != null) {
|
||||
FilterPermanent filter = new FilterPermanent("an artifact controlled by " + player.getLogName());
|
||||
filter.add(CardType.ARTIFACT.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(event.getTargetId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ public final class LazavTheMultifarious extends CardImpl {
|
|||
new LazavTheMultifariousEffect(),
|
||||
new ManaCostsImpl<>("{X}")
|
||||
);
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
@ -115,8 +115,8 @@ class LazavTheMultifariousCopyApplier extends CopyApplier {
|
|||
new LazavTheMultifariousEffect(),
|
||||
new ManaCostsImpl<>("{X}")
|
||||
);
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
blueprint.getAbilities().add(ability);
|
||||
blueprint.setName("Lazav, the Multifarious");
|
||||
blueprint.addSuperType(SuperType.LEGENDARY);
|
||||
|
|
|
|||
|
|
@ -1,44 +1,53 @@
|
|||
|
||||
package mage.cards.l;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.abilities.keyword.FirstStrikeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author North
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class LightwielderPaladin extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("black or red permanent that player controls");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
new ColorPredicate(ObjectColor.BLACK),
|
||||
new ColorPredicate(ObjectColor.RED)));
|
||||
}
|
||||
|
||||
public LightwielderPaladin(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.KNIGHT);
|
||||
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
//First strike
|
||||
this.addAbility(FirstStrikeAbility.getInstance());
|
||||
this.addAbility(new LightwielderPaladinTriggeredAbility());
|
||||
|
||||
// Whenever Lightwielder Paladin deals combat damage to a player, you may exile target black or red permanent that player controls.
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ExileTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private LightwielderPaladin(final LightwielderPaladin card) {
|
||||
|
|
@ -50,48 +59,3 @@ public final class LightwielderPaladin extends CardImpl {
|
|||
return new LightwielderPaladin(this);
|
||||
}
|
||||
}
|
||||
|
||||
class LightwielderPaladinTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public LightwielderPaladinTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new ExileTargetEffect(), true);
|
||||
}
|
||||
|
||||
private LightwielderPaladinTriggeredAbility(final LightwielderPaladinTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LightwielderPaladinTriggeredAbility copy() {
|
||||
return new LightwielderPaladinTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getSourceId().equals(this.sourceId) && ((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
Player player = game.getPlayer(event.getTargetId());
|
||||
if (player != null) {
|
||||
FilterPermanent filter = new FilterPermanent("black or red permanent controlled by " + player.getLogName());
|
||||
filter.add(Predicates.or(
|
||||
new ColorPredicate(ObjectColor.BLACK),
|
||||
new ColorPredicate(ObjectColor.RED)));
|
||||
filter.add(new ControllerIdPredicate(event.getTargetId()));
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may exile target black or red permanent that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ public final class LikenessLooter extends CardImpl {
|
|||
new LikenessLooterEffect(),
|
||||
new ManaCostsImpl<>("{X}")
|
||||
);
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
@ -116,8 +116,8 @@ class LikenessLooterCopyApplier extends CopyApplier {
|
|||
new LikenessLooterEffect(),
|
||||
new ManaCostsImpl<>("{X}")
|
||||
);
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
blueprint.getAbilities().add(ability);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public final class LostInTheMaze extends CardImpl {
|
|||
// When Lost in the Maze enters the battlefield, tap X target creatures. Put a stun counter on each of those creatures you don't control.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect("tap X target creatures"));
|
||||
ability.addEffect(new LostInTheMazeEffect());
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Tapped creatures you control have hexproof.
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ public final class LullmagesDomination extends CardImpl {
|
|||
// Gain control of target creature with converted mana cost X.
|
||||
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom)
|
||||
.setText("gain control of target creature with mana value X"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
}
|
||||
|
||||
private LullmagesDomination(final LullmagesDomination card) {
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ public final class LuminatePrimordial extends CardImpl {
|
|||
// When Luminate Primordial enters the battlefield, for each opponent, exile up to one target creature
|
||||
// that player controls and that player gains life equal to its power.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(), false);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ public final class MaliciousAdvice extends CardImpl {
|
|||
effect.setText("Tap X target artifacts, creatures, and/or lands");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(filter));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private MaliciousAdvice(final MaliciousAdvice card) {
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public final class MarchOfBurgeoningLife extends CardImpl {
|
|||
|
||||
// Choose target creature with mana value less than X. Search your library for a creature card with the same name as that creature, put it onto the battlefield tapped, then shuffle.
|
||||
this.getSpellAbility().addEffect(new MarchOfBurgeoningLifeEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.FEWER_THAN));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.FEWER_THAN));
|
||||
}
|
||||
|
||||
private MarchOfBurgeoningLife(final MarchOfBurgeoningLife card) {
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public final class MarchOfOtherworldlyLight extends CardImpl {
|
|||
this.getSpellAbility().addEffect(new ExileTargetEffect(
|
||||
"exile target artifact, creature, or enchantment with mana value X or less"
|
||||
));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS));
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(filter2));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS));
|
||||
}
|
||||
|
||||
private MarchOfOtherworldlyLight(final MarchOfOtherworldlyLight card) {
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ public final class MarchOfSwirlingMist extends CardImpl {
|
|||
|
||||
// Up to X target creatures phase out.
|
||||
this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("up to X target creatures phase out"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private MarchOfSwirlingMist(final MarchOfSwirlingMist card) {
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ public final class MarshalsAnthem extends CardImpl {
|
|||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||
new ReturnFromGraveyardToBattlefieldTargetEffect().setText(rule), false
|
||||
);
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance));
|
||||
ability.addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public final class MassMutiny extends CardImpl {
|
|||
|
||||
// For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn.
|
||||
this.getSpellAbility().addEffect(new MassMutinyEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
|
||||
this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
}
|
||||
|
||||
private MassMutiny(final MassMutiny card) {
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ public final class MeteorBlast extends CardImpl {
|
|||
this.getSpellAbility().addEffect(
|
||||
new DamageTargetEffect(4).setText("{this} deals 4 damage to each of X targets")
|
||||
);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private MeteorBlast(final MeteorBlast card) {
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public final class MidnightArsonist extends CardImpl {
|
|||
// When Midnight Arsonist enters the battlefield, destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()
|
||||
.setText("destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control"));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(new PermanentsOnBattlefieldCount(filter)));
|
||||
ability.addTarget(new TargetPermanent(0, 1, filter2));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(new PermanentsOnBattlefieldCount(filter)));
|
||||
ability.addHint(new ValueHint("Vampires you control", new PermanentsOnBattlefieldCount(filter)));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ public final class MinamoSightbender extends CardImpl {
|
|||
|
||||
// {X}, {T}: Target creature with power X or less can't be blocked this turn.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new ManaCostsImpl<>("{X}"));
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
ability.addTarget(new TargetCreaturePermanent(filter));
|
||||
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,34 +1,31 @@
|
|||
|
||||
package mage.cards.m;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||
import mage.abilities.keyword.NinjutsuAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class MistbladeShinobi extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public MistbladeShinobi(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.HUMAN);
|
||||
this.subtype.add(SubType.NINJA);
|
||||
|
||||
|
|
@ -39,7 +36,10 @@ public final class MistbladeShinobi extends CardImpl {
|
|||
this.addAbility(new NinjutsuAbility("{U}"));
|
||||
|
||||
// Whenever Mistblade Shinobi deals combat damage to a player, you may return target creature that player controls to its owner's hand.
|
||||
this.addAbility(new MistbladeShinobiTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetCreaturePermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private MistbladeShinobi(final MistbladeShinobi card) {
|
||||
|
|
@ -51,45 +51,3 @@ public final class MistbladeShinobi extends CardImpl {
|
|||
return new MistbladeShinobi(this);
|
||||
}
|
||||
}
|
||||
|
||||
class MistbladeShinobiTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
MistbladeShinobiTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), true);
|
||||
}
|
||||
|
||||
private MistbladeShinobiTriggeredAbility(final MistbladeShinobiTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MistbladeShinobiTriggeredAbility copy() {
|
||||
return new MistbladeShinobiTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (((DamagedPlayerEvent) event).isCombatDamage()
|
||||
&& event.getSourceId().equals(sourceId)) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent != null) {
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may return target creature that player controls to its owner's hand.";
|
||||
}
|
||||
}
|
||||
|
|
@ -41,8 +41,8 @@ public final class MogissMarauder extends CardImpl {
|
|||
HasteAbility.getInstance(), Duration.EndOfTurn,
|
||||
"and haste until end of turn, where X is your devotion to black"
|
||||
));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(DevotionCount.B));
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(DevotionCount.B));
|
||||
ability.addHint(DevotionCount.B.getHint());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ public final class Molder extends CardImpl {
|
|||
// Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target artifact or enchantment with mana value X. It can't be regenerated", true));
|
||||
this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
|
||||
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||
}
|
||||
|
||||
private Molder(final Molder card) {
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ public final class MoltenPrimordial extends CardImpl {
|
|||
|
||||
// When Molten Primordial enters the battlefield, for each opponent, take control of up to one target creature that player controls until end of turn. Untap those creatures. They have haste until end of turn.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(), false);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent(0,1));
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,31 +1,29 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jeffwadsworth
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class MordantDragon extends CardImpl {
|
||||
|
||||
|
|
@ -43,7 +41,12 @@ public final class MordantDragon extends CardImpl {
|
|||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{1}{R}")));
|
||||
|
||||
// Whenever Mordant Dragon deals combat damage to a player, you may have it deal that much damage to target creature that player controls.
|
||||
this.addAbility(new MordantDragonTriggeredAbility());
|
||||
Effect effect = new DamageTargetEffect(SavedDamageValue.MUCH);
|
||||
effect.setText("have it deal that much damage to target creature that player controls.");
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, true, true);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private MordantDragon(final MordantDragon card) {
|
||||
|
|
@ -55,72 +58,3 @@ public final class MordantDragon extends CardImpl {
|
|||
return new MordantDragon(this);
|
||||
}
|
||||
}
|
||||
|
||||
class MordantDragonTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public MordantDragonTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new MordantDragonEffect(), true);
|
||||
}
|
||||
|
||||
private MordantDragonTriggeredAbility(final MordantDragonTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MordantDragonTriggeredAbility copy() {
|
||||
return new MordantDragonTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (!damageEvent.isCombatDamage()
|
||||
|| !event.getSourceId().equals(this.getSourceId())
|
||||
|| opponent == null) {
|
||||
return false;
|
||||
}
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
for (Effect effect : this.getAllEffects()) {
|
||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||
effect.setValue("damage", event.getAmount());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, "
|
||||
+ "you may have it deal that much damage to target creature that player controls.";
|
||||
}
|
||||
}
|
||||
|
||||
class MordantDragonEffect extends OneShotEffect {
|
||||
|
||||
MordantDragonEffect() {
|
||||
super(Outcome.Damage);
|
||||
staticText = "it deals that much damage to target creature that player controls";
|
||||
}
|
||||
|
||||
private MordantDragonEffect(final MordantDragonEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return new DamageTargetEffect((Integer) getValue("damage")).apply(game, source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MordantDragonEffect copy() {
|
||||
return new MordantDragonEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ public final class NahirisWrath extends CardImpl {
|
|||
Effect effect = new DamageTargetEffect(DiscardCostCardManaValue.instance);
|
||||
effect.setText("{this} deals damage equal to the total mana value of the discarded cards to each of up to X target creatures and/or planeswalkers");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker(0, 1));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private NahirisWrath(final NahirisWrath card) {
|
||||
|
|
|
|||
|
|
@ -1,22 +1,19 @@
|
|||
package mage.cards.n;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.Cards;
|
||||
import mage.constants.*;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInGraveyard;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.Cards;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -38,7 +35,7 @@ public final class NeyamShaiMurad extends CardImpl {
|
|||
|
||||
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new NeyamShaiMuradEffect(), true, true)
|
||||
.withFlavorWord("Rogue Trader")
|
||||
);
|
||||
); //TODO: The first should target when triggered, not on resolution
|
||||
}
|
||||
|
||||
private NeyamShaiMurad(final NeyamShaiMurad card) {
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ public final class NostalgicDreams extends CardImpl {
|
|||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||
effect.setText("Return X target cards from your graveyard to your hand");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
|
||||
// Exile Nostalgic Dreams.
|
||||
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public final class OpenIntoWonder extends CardImpl {
|
|||
Ability abilityToGain = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(abilityToGain, Duration.EndOfTurn,
|
||||
"Until end of turn, those creatures gain \"Whenever this creature deals combat damage to a player, draw a card.\""));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private OpenIntoWonder(final OpenIntoWonder card) {
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ public final class OpenSeason extends CardImpl {
|
|||
Effect effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance());
|
||||
effect.setText("for each opponent, put a bounty counter on target creature that player controls");
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Creatures your opponent control with bounty counters on them can't activate abilities
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public final class Outmaneuver extends CardImpl {
|
|||
|
||||
// X target blocked creatures assign their combat damage this turn as though they weren't blocked.
|
||||
this.getSpellAbility().addEffect(new OutmaneuverEffect());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private Outmaneuver(final Outmaneuver card) {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ public final class PestInfestation extends CardImpl {
|
|||
.setText("destroy up to X target artifacts and/or enchantments."));
|
||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new Pest11GainLifeToken(), xValue)
|
||||
.setText("Create twice X 1/1 black and green Pest creature tokens with \"When this creature dies, you gain 1 life.\""));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private PestInfestation(final PestInfestation card) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
package mage.cards.p;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.condition.common.MonstrousCondition;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.keyword.MonstrosityAbility;
|
||||
import mage.abilities.keyword.ProtectionAbility;
|
||||
|
|
@ -12,26 +13,24 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.filter.common.FilterEnchantmentCard;
|
||||
import mage.filter.common.FilterEnchantmentPermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
* @author LevelX2, notgreat
|
||||
*/
|
||||
public final class PolisCrusher extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("enchantments");
|
||||
private static final FilterCard filterCard = new FilterEnchantmentCard("enchantments");
|
||||
private static final FilterEnchantmentPermanent filterPermanent = new FilterEnchantmentPermanent("enchantment that player controls");
|
||||
|
||||
static {
|
||||
filter.add(CardType.ENCHANTMENT.getPredicate());
|
||||
filterCard.add(CardType.ENCHANTMENT.getPredicate());
|
||||
}
|
||||
|
||||
public PolisCrusher(UUID ownerId, CardSetInfo setInfo) {
|
||||
|
|
@ -45,13 +44,18 @@ public final class PolisCrusher extends CardImpl {
|
|||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// protection from enchantments
|
||||
this.addAbility(new ProtectionAbility(filter));
|
||||
this.addAbility(new ProtectionAbility(filterCard));
|
||||
|
||||
// {4}{R}{G}: Monstrosity 3.
|
||||
this.addAbility(new MonstrosityAbility("{4}{R}{G}", 3));
|
||||
|
||||
// Whenever Polis Crusher deals combat damage to a player, if Polis Crusher is monstrous, destroy target enchantment that player controls.
|
||||
this.addAbility(new PolisCrusherTriggeredAbility());
|
||||
TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true);
|
||||
ability.addTarget(new TargetPermanent(filterPermanent));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, MonstrousCondition.instance,
|
||||
"Whenever {this} deals combat damage to a player, if {this} is monstrous, destroy target enchantment that player controls."));
|
||||
}
|
||||
|
||||
private PolisCrusher(final PolisCrusher card) {
|
||||
|
|
@ -63,51 +67,3 @@ public final class PolisCrusher extends CardImpl {
|
|||
return new PolisCrusher(this);
|
||||
}
|
||||
}
|
||||
|
||||
class PolisCrusherTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public PolisCrusherTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private PolisCrusherTriggeredAbility(final PolisCrusherTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PolisCrusherTriggeredAbility copy() {
|
||||
return new PolisCrusherTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkInterveningIfClause(Game game) {
|
||||
return MonstrousCondition.instance.apply(game, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getSourceId().equals(this.sourceId) && ((DamagedPlayerEvent) event).isCombatDamage()) {
|
||||
Player player = game.getPlayer(event.getTargetId());
|
||||
if (player != null) {
|
||||
FilterPermanent filter = new FilterPermanent("an enchantment controlled by " + player.getLogName());
|
||||
filter.add(CardType.ENCHANTMENT.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(event.getTargetId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player,"
|
||||
+ " if {this} is monstrous, destroy target enchantment that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ public final class QuarantineField extends CardImpl {
|
|||
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect()
|
||||
.setText("for each isolation counter on it, exile up to one target nonland permanent an opponent controls until {this} leaves the battlefield")
|
||||
);
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.ISOLATION)));
|
||||
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_NON_LAND));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.ISOLATION)));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@ package mage.cards.q;
|
|||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.DealsDamageToOpponentTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.keyword.DauntAbility;
|
||||
|
|
@ -13,23 +14,21 @@ import mage.abilities.keyword.VigilanceAbility;
|
|||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterPlaneswalkerPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.PreventDamageEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetPlaneswalkerPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
* @author TheElk801, notgreat
|
||||
*/
|
||||
public final class QuestingBeast extends CardImpl {
|
||||
private static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("planeswalker that player controls");
|
||||
|
||||
public QuestingBeast(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
|
||||
|
|
@ -55,7 +54,10 @@ public final class QuestingBeast extends CardImpl {
|
|||
this.addAbility(new SimpleStaticAbility(new QuestingBeastPreventionEffect()));
|
||||
|
||||
// Whenever Questing Beast deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls.
|
||||
this.addAbility(new QuestingBeastTriggeredAbility());
|
||||
Ability ability = new DealsDamageToOpponentTriggeredAbility(new DamageTargetEffect(SavedDamageValue.MUCH), false, true, true);
|
||||
ability.addTarget(new TargetPlaneswalkerPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private QuestingBeast(final QuestingBeast card) {
|
||||
|
|
@ -100,48 +102,3 @@ class QuestingBeastPreventionEffect extends ContinuousRuleModifyingEffectImpl {
|
|||
&& permanent.isControlledBy(source.getControllerId());
|
||||
}
|
||||
}
|
||||
|
||||
class QuestingBeastTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
QuestingBeastTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, null, true);
|
||||
}
|
||||
|
||||
private QuestingBeastTriggeredAbility(final QuestingBeastTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public QuestingBeastTriggeredAbility copy() {
|
||||
return new QuestingBeastTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent == null
|
||||
|| !event.getSourceId().equals(this.getSourceId())
|
||||
|| !opponent.hasOpponent(this.getControllerId(), game)
|
||||
|| !((DamagedEvent) event).isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
this.getEffects().clear();
|
||||
this.addEffect(new DamageTargetEffect(event.getAmount()));
|
||||
FilterPermanent filter = new FilterPlaneswalkerPermanent("planeswalker " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to an opponent, " +
|
||||
"it deals that much damage to target planeswalker that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ public final class RatsFeast extends CardImpl {
|
|||
|
||||
// Exile X target cards from a single graveyard.
|
||||
this.getSpellAbility().addEffect(new ExileTargetEffect("Exile X target cards from a single graveyard"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInASingleGraveyard(1, 1, StaticFilters.FILTER_CARD_CARDS));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private RatsFeast(final RatsFeast card) {
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ public final class ReleaseTheGremlins extends CardImpl {
|
|||
|
||||
// Destroy X target artifacts.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
|
||||
// Create X 2/2 red Gremlin creature tokens.
|
||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.REGULAR));
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ public final class RestlessDreams extends CardImpl {
|
|||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||
effect.setText("Return X target creature cards from your graveyard to your hand");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private RestlessDreams(final RestlessDreams card) {
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ public final class ReturnToTheRanks extends CardImpl {
|
|||
Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
|
||||
effect.setText("Return X target creature cards with mana value 2 or less from your graveyard to the battlefield");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
|
||||
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||
}
|
||||
|
||||
private ReturnToTheRanks(final ReturnToTheRanks card) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
package mage.cards.r;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
||||
import mage.abilities.keyword.MorphAbility;
|
||||
|
|
@ -12,20 +14,18 @@ import mage.cards.CardSetInfo;
|
|||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class RiptideEntrancer extends CardImpl {
|
||||
private static final FilterCreaturePermanent filter
|
||||
= new FilterCreaturePermanent("creature that player controls");
|
||||
|
||||
public RiptideEntrancer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}");
|
||||
|
|
@ -36,7 +36,11 @@ public final class RiptideEntrancer extends CardImpl {
|
|||
this.toughness = new MageInt(1);
|
||||
|
||||
// Whenever Riptide Entrancer deals combat damage to a player, you may sacrifice it. If you do, gain control of target creature that player controls.
|
||||
this.addAbility(new RiptideEntrancerTriggeredAbility());
|
||||
Effect effect = new DoIfCostPaid(new GainControlTargetEffect(Duration.WhileOnBattlefield), new SacrificeSourceCost());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Morph {U}{U}
|
||||
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}{U}")));
|
||||
|
|
@ -51,46 +55,3 @@ public final class RiptideEntrancer extends CardImpl {
|
|||
return new RiptideEntrancer(this);
|
||||
}
|
||||
}
|
||||
|
||||
class RiptideEntrancerTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public RiptideEntrancerTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DoIfCostPaid(
|
||||
new GainControlTargetEffect(Duration.Custom),
|
||||
new SacrificeSourceCost()
|
||||
), false);
|
||||
}
|
||||
|
||||
private RiptideEntrancerTriggeredAbility(final RiptideEntrancerTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RiptideEntrancerTriggeredAbility copy() {
|
||||
return new RiptideEntrancerTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Player opponent = game.getPlayer(event.getPlayerId());
|
||||
if (opponent != null && event.getSourceId().equals(this.sourceId)) {
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls");
|
||||
filter.add(new ControllerIdPredicate(opponent.getId()));
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetCreaturePermanent(filter));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may sacrifice it. "
|
||||
+ "If you do, gain control of target creature that player controls.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ public final class RotHulk extends CardImpl {
|
|||
// When Rot Hulk enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
||||
.setText("return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have."));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(OpponentsCount.instance));
|
||||
ability.addTarget(new TargetCardInYourGraveyard(0, 1, filterZombie));
|
||||
ability.setTargetAdjuster(new TargetsCountAdjuster(OpponentsCount.instance));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,38 +1,40 @@
|
|||
|
||||
package mage.cards.r;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.targetadjustment.DamagedPlayerControlsTargetAdjuster;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author dustinconrad
|
||||
* @author notgreat
|
||||
*/
|
||||
public final class RustmouthOgre extends CardImpl {
|
||||
|
||||
private static final FilterArtifactPermanent filter
|
||||
= new FilterArtifactPermanent("artifact that player controls");
|
||||
|
||||
public RustmouthOgre(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{R}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}");
|
||||
this.subtype.add(SubType.OGRE);
|
||||
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Whenever Rustmouth Ogre deals combat damage to a player, you may destroy target artifact that player controls.
|
||||
this.addAbility(new RustmouthOgreTriggeredAbility());
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), true, true);
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.setTargetAdjuster(new DamagedPlayerControlsTargetAdjuster());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private RustmouthOgre(final RustmouthOgre card) {
|
||||
|
|
@ -44,44 +46,3 @@ public final class RustmouthOgre extends CardImpl {
|
|||
return new RustmouthOgre(this);
|
||||
}
|
||||
}
|
||||
|
||||
class RustmouthOgreTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
RustmouthOgreTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new DestroyTargetEffect(), true);
|
||||
}
|
||||
|
||||
private RustmouthOgreTriggeredAbility(final RustmouthOgreTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RustmouthOgreTriggeredAbility copy() {
|
||||
return new RustmouthOgreTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
|
||||
if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) {
|
||||
FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact that player controls");
|
||||
filter.add(new ControllerIdPredicate(event.getPlayerId()));
|
||||
filter.setMessage("artifact controlled by " + game.getPlayer(event.getTargetId()).getLogName());
|
||||
|
||||
this.getTargets().clear();
|
||||
this.addTarget(new TargetPermanent(filter));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever {this} deals combat damage to a player, you may destroy target artifact that player controls.";
|
||||
}
|
||||
}
|
||||
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