Some rework to framework classes. Used new framework classes in some cards.

This commit is contained in:
LevelX2 2014-12-09 16:14:06 +01:00
parent 28ed7f1b63
commit 79eabcbf12
62 changed files with 508 additions and 519 deletions

View file

@ -34,7 +34,7 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.CascadeAbility;
import mage.abilities.keyword.FlyingAbility;
@ -65,7 +65,7 @@ public class EnigmaSphinx extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Enigma Sphinx is put into your graveyard from the battlefield, put it into your library third from the top.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new EnigmaSphinxEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new EnigmaSphinxEffect()));
// Cascade
this.addAbility(new CascadeAbility());

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.abilities.common.PutIntoGraveFromAnywhereAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ExileTargetEffect;
@ -57,7 +57,7 @@ public class LegacyWeapon extends CardImpl {
ability.addTarget(new TargetPermanent());
this.addAbility(ability);
// If Legacy Weapon would be put into a graveyard from anywhere, reveal Legacy Weapon and shuffle it into its owner's library instead.
this.addAbility(new PutIntoGraveFromAnywhereAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
}
public LegacyWeapon(final LegacyWeapon card) {

View file

@ -27,38 +27,38 @@
*/
package mage.sets.avacynrestored;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.effects.common.SkipNextUntapTargetEffect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.common.continious.MaximumHandSizeControllerEffect;
import mage.abilities.effects.common.continious.MaximumHandSizeControllerEffect.HandSizeModification;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
import mage.game.command.Emblem;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
@ -130,65 +130,6 @@ class TappedCreaturesControlledByTargetCount implements DynamicValue {
}
}
class TamiyoTheMoonSageTriggeredAbility extends TriggeredAbilityImpl {
public TamiyoTheMoonSageTriggeredAbility() {
super(Zone.COMMAND, new TamiyoTheMoonSageEffect(), true);
}
public TamiyoTheMoonSageTriggeredAbility(final TamiyoTheMoonSageTriggeredAbility ability) {
super(ability);
}
@Override
public TamiyoTheMoonSageTriggeredAbility copy() {
return new TamiyoTheMoonSageTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && !card.isCopy() && card.getOwnerId().equals(this.getControllerId())) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(card.getId()));
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a card is put into your graveyard from anywhere, you may return it to your hand.";
}
}
class TamiyoTheMoonSageEffect extends OneShotEffect {
public TamiyoTheMoonSageEffect() {
super(Outcome.ReturnToHand);
this.staticText = "return it to your hand";
}
public TamiyoTheMoonSageEffect(final TamiyoTheMoonSageEffect effect) {
super(effect);
}
@Override
public TamiyoTheMoonSageEffect copy() {
return new TamiyoTheMoonSageEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Card card = game.getCard(this.targetPointer.getFirst(game, source));
if (card != null) {
return card.moveToZone(Zone.HAND, source.getSourceId(), game, true);
}
return false;
}
}
/**
* Emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand."
*/
@ -198,6 +139,9 @@ class TamiyoTheMoonSageEmblem extends Emblem {
this.setName("EMBLEM: Tamiyo, the Moon Sage");
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.EndOfGame, HandSizeModification.SET));
this.getAbilities().add(ability);
this.getAbilities().add(new TamiyoTheMoonSageTriggeredAbility());
Effect effect = new ReturnToHandTargetEffect();
effect.setText("return it to your hand");
this.getAbilities().add(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
Zone.COMMAND, effect, true, new FilterCard("a card"), TargetController.YOU, SetTargetPointer.CARD));
}
}

View file

@ -30,7 +30,7 @@ package mage.sets.betrayersofkamigawa;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
@ -49,7 +49,7 @@ public class GodsEyeGateToTheReikai extends CardImpl {
// {tap}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// When Gods' Eye, Gate to the Reikai is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new CreateTokenEffect(new SpiritToken(), 1), false));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new SpiritToken(), 1), false));
}
public GodsEyeGateToTheReikai(final GodsEyeGateToTheReikai card) {

View file

@ -30,7 +30,7 @@ package mage.sets.championsofkamigawa;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.EquippedMatchesFilterCondition;
@ -77,7 +77,7 @@ public class OathkeeperTakenosDaisho extends CardImpl {
new OathkeeperEquippedMatchesFilterCondition(filter),
""));
// When Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ExileEquippedEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ExileEquippedEffect()));
// Equip {2}
this.addAbility(new EquipAbility( Outcome.BoostCreature, new ManaCostsImpl("{2}")));
}

View file

@ -29,18 +29,14 @@ package mage.sets.commander;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
/**
*
@ -64,8 +60,8 @@ public class VulturousZombie extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on Vulturous Zombie.
this.addAbility(new VulturousZombieTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, TargetController.OPPONENT));
}
public VulturousZombie(final VulturousZombie card) {
@ -77,36 +73,3 @@ public class VulturousZombie extends CardImpl {
return new VulturousZombie(this);
}
}
class VulturousZombieTriggeredAbility extends TriggeredAbilityImpl {
public VulturousZombieTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false);
}
public VulturousZombieTriggeredAbility(final VulturousZombieTriggeredAbility ability) {
super(ability);
}
@Override
public VulturousZombieTriggeredAbility copy() {
return new VulturousZombieTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && !card.isCopy()
&& game.getOpponents(controllerId).contains(card.getOwnerId())) {
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on {this}.";
}
}

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldOrDiesSourceTriggeredAbility;
import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.VanishingSacrificeAbility;
@ -42,7 +42,6 @@ import mage.constants.Rarity;
import mage.counters.CounterType;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.AnotherCardPredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
@ -73,7 +72,7 @@ public class DeadwoodTreefolk extends CardImpl {
this.addAbility(new VanishingUpkeepAbility(3));
this.addAbility(new VanishingSacrificeAbility());
// When Deadwood Treefolk enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand.
ability = new EntersBattlefieldOrDiesSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false);
ability = new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false);
Target target = new TargetCardInYourGraveyard(filter);
ability.addTarget(target);
this.addAbility(ability);

View file

@ -74,7 +74,7 @@ public class CrownOfDoom extends CardImpl {
// Whenever a creature attacks you or a planeswalker you control, it gets +2/+0 until end of turn.
Effect effect = new BoostTargetEffect(2,0,Duration.EndOfTurn);
effect.setText("it gets +2/+0 until end of turn");
this.addAbility(new AttacksAllTriggeredAbility(effect, false, new FilterCreaturePermanent(), SetTargetPointer.CREATURE, true));
this.addAbility(new AttacksAllTriggeredAbility(effect, false, new FilterCreaturePermanent(), SetTargetPointer.PERMANENT, true));
// {2}: Target player other than Crown of Doom's owner gains control of it. Activate this ability only during your turn.
Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, new CrownOfDoomEffect(), new ManaCostsImpl("{2}"), MyTurnCondition.getInstance());

View file

@ -30,7 +30,7 @@ package mage.sets.commander2014;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlAttachedEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
@ -66,7 +66,7 @@ public class FoolsDemise extends CardImpl {
this.addAbility(new DiesAttachedTriggeredAbility(new ReturnToBattlefieldUnderYourControlAttachedEffect(), "enchanted creature"));
// When Fool's Demise is put into a graveyard from the battlefield, return Fool's Demise to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public FoolsDemise(final FoolsDemise card) {

View file

@ -30,7 +30,7 @@ package mage.sets.conflux;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.common.PutIntoGraveFromAnywhereAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility;
import mage.abilities.effects.common.RevealAndShuffleIntoLibrarySourceEffect;
import mage.abilities.keyword.ProtectionAbility;
import mage.cards.CardImpl;
@ -69,7 +69,7 @@ public class Progenitus extends CardImpl {
// Protection from everything
this.addAbility(new ProgenitusProtectionAbility());
// If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead.
this.addAbility(new PutIntoGraveFromAnywhereAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
}
public Progenitus(final Progenitus card) {

View file

@ -59,7 +59,7 @@ public class LostInTheWoods extends CardImpl {
this.color.setGreen(true);
// Whenever a creature attacks you or a planeswalker you control, reveal the top card of your library. If it's a Forest card, remove that creature from combat. Then put the revealed card on the bottom of your library.
this.addAbility(new AttacksAllTriggeredAbility(new LostInTheWoodsEffect(), true, new FilterCreaturePermanent(), SetTargetPointer.CREATURE, true));
this.addAbility(new AttacksAllTriggeredAbility(new LostInTheWoodsEffect(), true, new FilterCreaturePermanent(), SetTargetPointer.PERMANENT, true));
}
public LostInTheWoods(final LostInTheWoods card) {

View file

@ -33,7 +33,7 @@ import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.common.PutIntoGraveFromAnywhereAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility;
import mage.abilities.effects.common.RevealAndShuffleIntoLibrarySourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.TrampleAbility;
@ -58,7 +58,7 @@ public class DarksteelColossus extends CardImpl {
this.addAbility(IndestructibleAbility.getInstance());
// If Darksteel Colossus would be put into a graveyard from anywhere, reveal Darksteel Colossus and shuffle it into its owner's library instead.
this.addAbility(new PutIntoGraveFromAnywhereAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
}
public DarksteelColossus(final DarksteelColossus card) {

View file

@ -33,6 +33,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
@ -62,8 +63,7 @@ public class SunderingTitan extends CardImpl {
this.toughness = new MageInt(10);
// When Sundering Titan enters the battlefield or leaves the battlefield, choose a land of each basic land type, then destroy those lands.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SunderingTitanDestroyLandEffect(), false));
this.addAbility(new LeavesBattlefieldTriggeredAbility(new SunderingTitanDestroyLandEffect(), false));
this.addAbility(new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new SunderingTitanDestroyLandEffect(), false));
}
public SunderingTitan(final SunderingTitan card) {

View file

@ -28,25 +28,23 @@
package mage.sets.gatecrash;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.constants.SubLayer;
import mage.constants.TargetController;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
/**
@ -70,7 +68,10 @@ public class LazavDimirMastermind extends CardImpl {
this.addAbility(HexproofAbility.getInstance());
// Whenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card except its name is still Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it gains hexproof and this ability.
this.addAbility(new CreatureCardPutOpponentGraveyardTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new LazavDimirEffect(), true,
new FilterCreatureCard("a creature card"),
TargetController.OPPONENT, SetTargetPointer.CARD));
}
public LazavDimirMastermind(final LazavDimirMastermind card) {
@ -83,45 +84,6 @@ public class LazavDimirMastermind extends CardImpl {
}
}
class CreatureCardPutOpponentGraveyardTriggeredAbility extends TriggeredAbilityImpl {
public CreatureCardPutOpponentGraveyardTriggeredAbility() {
super(Zone.BATTLEFIELD, new LazavDimirEffect(), true);
}
public CreatureCardPutOpponentGraveyardTriggeredAbility(final CreatureCardPutOpponentGraveyardTriggeredAbility ability) {
super(ability);
}
@Override
public CreatureCardPutOpponentGraveyardTriggeredAbility copy() {
return new CreatureCardPutOpponentGraveyardTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ZONE_CHANGE
&& ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card == null) {
return false;
}
if (game.getOpponents(controllerId).contains(event.getPlayerId())
&& card.getCardType().contains(CardType.CREATURE)) {
// store the card id to copy
game.getState().setValue(new StringBuilder("CardToCopy").append(getSourceId().toString()).toString(), card.getId());
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a creature card is put into an opponent's graveyard from anywhere, you may have {this} become a copy of that card except its name is still {this}, it's legendary in addition to its other types, and it gains hexproof and this ability.";
}
}
class LazavDimirEffect extends ContinuousEffectImpl {
protected UUID IdOfCopiedCard;
@ -129,6 +91,7 @@ class LazavDimirEffect extends ContinuousEffectImpl {
public LazavDimirEffect() {
super(Duration.WhileOnBattlefield, Layer.CopyEffects_1, SubLayer.NA, Outcome.BecomeCreature);
staticText = "have {this} become a copy of that card except its name is still {this}, it's legendary in addition to its other types, and it gains hexproof and this ability";
}
public LazavDimirEffect(final LazavDimirEffect effect) {
@ -144,17 +107,13 @@ class LazavDimirEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
Object object = game.getState().getValue(new StringBuilder("CardToCopy").append(source.getSourceId().toString()).toString());
Card card = null;
if (object instanceof UUID) {
card = game.getCard((UUID) object);
}
Card card = game.getCard(getTargetPointer().getFirst(game, source));
Permanent permanent = game.getPermanent(source.getSourceId());
if (card == null || permanent == null) {
return false;
}
if (IdOfCopiedCard == null || !IdOfCopiedCard.equals((UUID) object)) {
IdOfCopiedCard = (UUID) object;
if (IdOfCopiedCard == null || !IdOfCopiedCard.equals(card.getId())) {
IdOfCopiedCard = card.getId();
cardToCopy = card.copy();
cardToCopy.assignNewId();
}
@ -184,7 +143,10 @@ class LazavDimirEffect extends ContinuousEffectImpl {
}
permanent.removeAllAbilities(source.getSourceId(), game);
permanent.addAbility(HexproofAbility.getInstance(), source.getSourceId(), game);
permanent.addAbility(new CreatureCardPutOpponentGraveyardTriggeredAbility(), source.getSourceId(), game);
permanent.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new LazavDimirEffect(), true,
new FilterCreatureCard("a creature card"),
TargetController.OPPONENT, SetTargetPointer.CARD), source.getSourceId(), game);
for (Ability ability : cardToCopy.getAbilities()) {
if (!permanent.getAbilities().contains(ability)) {

View file

@ -31,7 +31,7 @@ package mage.sets.guildpact;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
@ -45,7 +45,7 @@ public class HatchingPlans extends CardImpl {
super(ownerId, 27, "Hatching Plans", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
this.expansionSetCode = "GPT";
this.color.setBlue(true);
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(3)));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DrawCardSourceControllerEffect(3)));
}
public HatchingPlans (final HatchingPlans card) {

View file

@ -29,7 +29,7 @@ package mage.sets.heroesvsmonsters;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
@ -75,7 +75,7 @@ public class UndyingRage extends CardImpl {
this.addAbility(ability);
// When Undying Rage is put into a graveyard from the battlefield, return Undying Rage to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public UndyingRage(final UndyingRage card) {

View file

@ -30,7 +30,7 @@ package mage.sets.lorwyn;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
@ -68,7 +68,7 @@ public class Dread extends CardImpl {
this.addAbility(new DreadTriggeredAbility());
// When Dread is put into a graveyard from anywhere, shuffle it into its owner's library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
}
public Dread(final Dread card) {

View file

@ -30,7 +30,7 @@ package mage.sets.lorwyn;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
@ -69,7 +69,7 @@ public class Vigor extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VigorReplacementEffect()));
// When Vigor is put into a graveyard from anywhere, shuffle it into its owner's library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
}
public Vigor(final Vigor card) {

View file

@ -68,7 +68,7 @@ public class IllicitAuction extends CardImpl {
}
}
// effect is based on ExchangeControlTargetEffect
// effect is based on GainControlTargetEffect
class IllicitAuctionEffect extends GainControlTargetEffect {
public IllicitAuctionEffect() {
@ -87,20 +87,20 @@ class IllicitAuctionEffect extends GainControlTargetEffect {
@Override
public void init(Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
Permanent targetCreature = game.getPermanent(source.getFirstTarget());
if (targetCreature != null) {
if (controller != null && targetCreature != null) {
PlayerList playerList = game.getPlayerList().copy();
playerList.setCurrent(game.getActivePlayerId());
Player winner = game.getPlayer(game.getActivePlayerId());
int highBid = 0;
game.informPlayers(new StringBuilder(winner.getName()).append(" bet 0 lifes").toString());
game.informPlayers(new StringBuilder(winner.getName()).append(" has bet 0 lifes").toString());
Player currentPlayer = playerList.getNext(game);
Player currentPlayer = playerList.getNextInRange(controller, game);
while (currentPlayer != winner) {
String text = new StringBuilder(winner.getName()).append(" bet ").append(highBid).append(" life")
.append(highBid > 1 ? "s" : "").append(". Top the bid?").toString();
if (currentPlayer.chooseUse(Outcome.GainControl, text, game)) {
String text = winner.getName() + " has bet " + highBid + " life" + (highBid > 1 ? "s" : "") + ". Top the bid?";
if (currentPlayer.chooseUse(Outcome.Detriment, text, game)) {
int newBid = currentPlayer.getAmount(highBid + 1, Integer.MAX_VALUE, "Choose bid", game);
if (newBid > highBid) {
highBid = newBid;
@ -109,15 +109,13 @@ class IllicitAuctionEffect extends GainControlTargetEffect {
.append(newBid).append(" life").append(newBid > 1 ? "s" : "").toString());
}
}
currentPlayer = playerList.getNext(game);
currentPlayer = playerList.getNextInRange(controller, game);
}
game.informPlayers(new StringBuilder(winner.getName()).append(" won auction with a bid of ").append(highBid).append(" life")
.append(highBid > 1 ? "s" : "").toString());
game.informPlayers(winner.getName() + " won the auction with a bid of " + highBid + " life" + (highBid > 1 ? "s" : ""));
winner.loseLife(highBid, game);
super.controllingPlayerId = winner.getId();
}
super.init(source, game);
}

View file

@ -33,7 +33,7 @@ import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.common.PutIntoGraveFromAnywhereAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility;
import mage.abilities.effects.common.RevealAndShuffleIntoLibrarySourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.InfectAbility;
@ -60,7 +60,7 @@ public class BlightsteelColossus extends CardImpl {
this.addAbility(IndestructibleAbility.getInstance());
// If Blightsteel Colossus would be put into a graveyard from anywhere, reveal Blightsteel Colossus and shuffle it into its owner's library instead.
this.addAbility(new PutIntoGraveFromAnywhereAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new RevealAndShuffleIntoLibrarySourceEffect()));
}
public BlightsteelColossus(final BlightsteelColossus card) {

View file

@ -31,7 +31,7 @@ package mage.sets.mirrodinbesieged;
import java.util.UUID;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
@ -48,7 +48,7 @@ public class IchorWellspring extends CardImpl {
// When Ichor Wellspring enters the battlefield or is put into a graveyard from the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)));
}
public IchorWellspring(final IchorWellspring card) {

View file

@ -32,7 +32,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.cards.CardImpl;
@ -54,7 +54,7 @@ public class SpineOfIshSah extends CardImpl {
this.addAbility(ability);
// When Spine of Ish Sah is put into a graveyard from the battlefield, return Spine of Ish Sah to its owner's hand
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public SpineOfIshSah(final SpineOfIshSah card) {

View file

@ -34,8 +34,8 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
@ -45,9 +45,8 @@ import mage.cards.CardsImpl;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.common.FilterLandCard;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -70,7 +69,11 @@ public class CountrysideCrusher extends CardImpl {
// At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CountrysideCrusherEffect(), TargetController.YOU, false));
// Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher.
this.addAbility(new CountrysideCrusherTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
false, new FilterLandCard("a land card"),TargetController.YOU
));
}
public CountrysideCrusher(final CountrysideCrusher card) {
@ -123,36 +126,3 @@ class CountrysideCrusherEffect extends OneShotEffect {
return false;
}
}
class CountrysideCrusherTriggeredAbility extends TriggeredAbilityImpl {
public CountrysideCrusherTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false);
}
public CountrysideCrusherTriggeredAbility(final CountrysideCrusherTriggeredAbility ability) {
super(ability);
}
@Override
public CountrysideCrusherTriggeredAbility copy() {
return new CountrysideCrusherTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && card.getOwnerId().equals(this.getControllerId()) && card.getCardType().contains(CardType.LAND)) {
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on {this}";
}
}

View file

@ -32,7 +32,7 @@ import java.util.UUID;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
@ -73,7 +73,7 @@ public class GlisteningOil extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GlisteningOilEffect(), TargetController.YOU, false));
// When Glistening Oil is put into a graveyard from the battlefield, return Glistening Oil to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public GlisteningOil(final GlisteningOil card) {

View file

@ -32,6 +32,7 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.GainLifeEffect;
@ -68,11 +69,9 @@ public class AvenRiftwatcher extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))));
this.addAbility(new VanishingUpkeepAbility(2));
this.addAbility(new VanishingSacrificeAbility());
// When Aven Riftwatcher enters the battlefield or leaves the battlefield, you gain 2 life.
Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(2), false);
this.addAbility(ability);
Ability ability2 = new LeavesBattlefieldTriggeredAbility(new GainLifeEffect(2), false);
this.addAbility(ability2);
this.addAbility(new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new GainLifeEffect(2), false));
}
public AvenRiftwatcher(final AvenRiftwatcher card) {

View file

@ -33,7 +33,7 @@ import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
@ -63,15 +63,11 @@ public class KeldonMarauders extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))));
this.addAbility(new VanishingUpkeepAbility(2));
this.addAbility(new VanishingSacrificeAbility());
// When Keldon Marauders enters the battlefield or leaves the battlefield, it deals 1 damage to target player.
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(1), false);
Ability ability = new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new DamageTargetEffect(1), false);
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
Ability ability2 = new LeavesBattlefieldTriggeredAbility(new DamageTargetEffect(1), false);
ability2.addTarget(new TargetPlayer());
this.addAbility(ability2);
}
public KeldonMarauders(final KeldonMarauders card) {

View file

@ -30,7 +30,7 @@ package mage.sets.ravnika;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
@ -60,7 +60,7 @@ public class Terrarion extends CardImpl {
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
// When Terrarion is put into a graveyard from the battlefield, draw a card.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)));
}
public Terrarion(final Terrarion card) {

View file

@ -30,7 +30,7 @@ package mage.sets.returntoravnica;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
import mage.abilities.keyword.TrampleAbility;
@ -61,7 +61,7 @@ public class WorldspineWurm extends CardImpl {
this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new WorldspineWurmToken(), 3)));
// When Worldspine Wurm is put into a graveyard from anywhere, shuffle it into its owner's library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
}
public WorldspineWurm(final WorldspineWurm card) {

View file

@ -37,7 +37,7 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.CantCounterAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.AnnihilatorAbility;
import mage.abilities.keyword.FlyingAbility;
@ -81,7 +81,7 @@ public class EmrakulTheAeonsTorn extends CardImpl {
this.addAbility(new ProtectionAbility(filter));
this.addAbility(new AnnihilatorAbility(6));
// When Emrakul is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new EmrakulTheAeonsTornEffect(), false));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new EmrakulTheAeonsTornEffect(), false));
}
public EmrakulTheAeonsTorn(final EmrakulTheAeonsTorn card) {

View file

@ -37,7 +37,7 @@ import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.AnnihilatorAbility;
@ -62,7 +62,7 @@ public class KozilekButcherOfTruth extends CardImpl {
this.toughness = new MageInt(12);
this.addAbility(new KozilekButcherOfTruthOnCastAbility());
this.addAbility(new AnnihilatorAbility(4));
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new KozilekButcherOfTruthEffect(), false));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new KozilekButcherOfTruthEffect(), false));
}
public KozilekButcherOfTruth (final KozilekButcherOfTruth card) {

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.keyword.AnnihilatorAbility;
@ -72,7 +72,7 @@ public class UlamogTheInfiniteGyre extends CardImpl {
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
// When Ulamog is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new UlamogTheInfiniteGyreEnterGraveyardEffect(), false));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new UlamogTheInfiniteGyreEnterGraveyardEffect(), false));
}
public UlamogTheInfiniteGyre(final UlamogTheInfiniteGyre card) {

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenTargetEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;

View file

@ -34,7 +34,7 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -62,7 +62,7 @@ public class PanicSpellbomb extends CardImpl {
this.addAbility(ability);
// When Panic Spellbomb is put into a graveyard from the battlefield, you may pay Red. If you do, draw a card.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{R}")), false));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{R}")), false));
}
public PanicSpellbomb(final PanicSpellbomb card) {

View file

@ -28,17 +28,15 @@
package mage.sets.seventhedition;
import java.util.UUID;
import mage.abilities.TriggeredAbilityImpl;
import mage.ObjectColor;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent;
import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.ColorPredicate;
/**
*
@ -46,6 +44,12 @@ import mage.game.events.ZoneChangeEvent;
*/
public class Compost extends CardImpl {
private static final FilterCard filter = new FilterCard("a black card");
static {
filter.add(new ColorPredicate(ObjectColor.BLACK));
}
public Compost(UUID ownerId) {
super(ownerId, 235, "Compost", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
this.expansionSetCode = "7ED";
@ -53,7 +57,8 @@ public class Compost extends CardImpl {
this.color.setGreen(true);
// Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card.
this.addAbility(new CompostTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new DrawCardSourceControllerEffect(1), true, TargetController.OPPONENT));
}
public Compost(final Compost card) {
@ -65,35 +70,3 @@ public class Compost extends CardImpl {
return new Compost(this);
}
}
class CompostTriggeredAbility extends TriggeredAbilityImpl {
CompostTriggeredAbility() {
super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), true);
}
CompostTriggeredAbility(final CompostTriggeredAbility ability) {
super(ability);
}
@Override
public CompostTriggeredAbility copy() {
return new CompostTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && card.getColor().isBlack() && game.getOpponents(controllerId).contains(card.getOwnerId())) {
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card";
}
}

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
@ -52,7 +52,7 @@ public class ChromaticStar extends CardImpl {
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)));
}
public ChromaticStar(final ChromaticStar card) {

View file

@ -29,7 +29,7 @@ package mage.sets.timespiral;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
@ -70,7 +70,7 @@ public class AspectOfMongoose extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ShroudAbility.getInstance(), AttachmentType.AURA)));
// When Aspect of Mongoose is put into a graveyard from the battlefield, return Aspect of Mongoose to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}

View file

@ -28,7 +28,7 @@
package mage.sets.timespiral;
import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
@ -59,7 +59,7 @@ public class FlagstonesOfTrokair extends CardImpl {
this.addAbility(new WhiteManaAbility());
// When Flagstones of Trokair is put into a graveyard from the battlefield, you may search your library for a Plains card and put it onto the battlefield tapped. If you do, shuffle your library.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true, true), true));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true, true), true));
}
public FlagstonesOfTrokair(final FlagstonesOfTrokair card) {

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.AttachEffect;
@ -65,7 +65,7 @@ public class Cessation extends CardImpl {
//Enchanted creature can't attack.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAttachedEffect(AttachmentType.AURA)));
//When Cessation is put into a graveyard from the battlefield, return Cessation to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public Cessation(final Cessation card) {

View file

@ -29,7 +29,7 @@ package mage.sets.urzaslegacy;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
@ -71,7 +71,7 @@ public class Rancor extends CardImpl {
this.addAbility(ability);
// When Rancor is put into a graveyard from the battlefield, return Rancor to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public Rancor(final Rancor card) {

View file

@ -34,7 +34,7 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
@ -69,7 +69,7 @@ public class SleepersGuile extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FearAbility.getInstance(), AttachmentType.AURA)));
// When Sleeper's Guile is put into a graveyard from the battlefield, return Sleeper's Guile to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public SleepersGuile(final SleepersGuile card) {

View file

@ -33,7 +33,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.costs.Cost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
@ -73,7 +73,7 @@ public class SlowMotion extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeEquipedUnlessPaysEffect(new GenericManaCost(2)), TargetController.CONTROLLER_ATTACHED_TO, false ));
// When Slow Motion is put into a graveyard from the battlefield, return Slow Motion to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public SlowMotion(final SlowMotion card) {

View file

@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.CantBlockAttachedEffect;
@ -69,7 +69,7 @@ public class Sluggishness extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttachedEffect(AttachmentType.AURA)));
// When Sluggishness is put into a graveyard from the battlefield, return Sluggishness to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public Sluggishness(final Sluggishness card) {

View file

@ -31,7 +31,7 @@ import java.util.UUID;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
@ -63,7 +63,7 @@ public class BrilliantHalo extends CardImpl {
// Enchanted creature gets +1/+2.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 2, Duration.WhileOnBattlefield)));
// When Brilliant Halo is put into a graveyard from the battlefield, return Brilliant Halo to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
public BrilliantHalo(final BrilliantHalo card) {

View file

@ -29,19 +29,18 @@ package mage.sets.urzassaga;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.PreventionEffectImpl;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
/**
*
@ -58,7 +57,9 @@ public class EnergyField extends CardImpl {
// Prevent all damage that would be dealt to you by sources you don't control.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new EnergyFieldEffect()));
// When a card is put into your graveyard from anywhere, sacrifice Energy Field.
this.addAbility(new PutIntoYourGraveyardTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new SacrificeSourceEffect(), false, TargetController.YOU));
}
public EnergyField(final EnergyField card) {
@ -114,38 +115,3 @@ class EnergyFieldEffect extends PreventionEffectImpl {
return new EnergyFieldEffect(this);
}
}
class PutIntoYourGraveyardTriggeredAbility extends TriggeredAbilityImpl {
public PutIntoYourGraveyardTriggeredAbility() {
super(Zone.BATTLEFIELD, new SacrificeSourceEffect(), false);
}
public PutIntoYourGraveyardTriggeredAbility(PutIntoYourGraveyardTriggeredAbility ability) {
super(ability);
}
@Override
public PutIntoYourGraveyardTriggeredAbility copy() {
return new PutIntoYourGraveyardTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && card.getOwnerId().equals(getControllerId())) {
return true;
}
}
}
return false;
}
@Override
public String getRule() {
return "When a card is put into your graveyard from anywhere, " + super.getRule();
}
}

View file

@ -29,7 +29,7 @@ package mage.sets.urzassaga;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.PutIntoGraveFromAnywhereTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
@ -59,7 +59,7 @@ public class SerraAvatar extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new ControllerLifeCount(), Duration.EndOfGame)));
// When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library.
this.addAbility(new PutIntoGraveFromAnywhereTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect()));
}
public SerraAvatar(final SerraAvatar card) {

View file

@ -33,7 +33,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutIntoGraveFromBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
@ -79,7 +79,7 @@ public class SpreadingAlgae extends CardImpl {
this.addAbility(new SpreadingAlgaeTriggeredAbility(new DestroyTargetEffect()));
// When Spreading Algae is put into a graveyard from the battlefield, return Spreading Algae to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldTriggeredAbility(new ReturnToHandSourceEffect()));
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}

View file

@ -28,21 +28,26 @@
package mage.sets.zendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.condition.common.OpponentLostLifeCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.SetTargetPointer;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
@ -68,7 +73,13 @@ public class BloodchiefAscension extends CardImpl {
true));
// Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life.
this.addAbility(new BloodchiefAscensionTriggeredAbility());
Ability ability = new ConditionalTriggeredAbility(
new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new LoseLifeTargetEffect(2), true, new FilterCard("a card"), TargetController.OPPONENT, SetTargetPointer.PLAYER),
new SourceHasCounterCondition(CounterType.QUEST, 3),
"Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life", true);
ability.addEffect(new GainLifeEffect(2));
this.addAbility(ability);
}
@ -81,47 +92,3 @@ public class BloodchiefAscension extends CardImpl {
return new BloodchiefAscension(this);
}
}
class BloodchiefAscensionTriggeredAbility extends TriggeredAbilityImpl {
private Condition condition;
public BloodchiefAscensionTriggeredAbility() {
super(Zone.BATTLEFIELD, new LoseLifeTargetEffect(2), true);
this.addEffect(new GainLifeEffect(2));
condition = new SourceHasCounterCondition(CounterType.QUEST, 3);
}
public BloodchiefAscensionTriggeredAbility(final BloodchiefAscensionTriggeredAbility ability) {
super(ability);
this.condition = ability.condition;
}
@Override
public BloodchiefAscensionTriggeredAbility copy() {
return new BloodchiefAscensionTriggeredAbility(this);
}
@Override
public boolean checkInterveningIfClause(Game game) {
return condition.apply(game, this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && !card.isCopy() && game.getOpponents(controllerId).contains(card.getOwnerId())) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(card.getOwnerId()));
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a card is put into an opponent's graveyard from anywhere, if {this} has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life.";
}
}

View file

@ -28,23 +28,21 @@
package mage.sets.zendikar;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import mage.target.TargetPlayer;
@ -61,7 +59,9 @@ public class QuestForAncientSecrets extends CardImpl {
this.color.setBlue(true);
// Whenever a card is put into your graveyard from anywhere, you may put a quest counter on Quest for Ancient Secrets.
this.addAbility(new QuestForAncientSecretsTriggeredAbility());
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true, TargetController.YOU));
// Remove five quest counters from Quest for Ancient Secrets and sacrifice it: Target player shuffles his or her graveyard into his or her library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new QuestForAncientSecretsEffect(),
@ -81,38 +81,6 @@ public class QuestForAncientSecrets extends CardImpl {
}
}
class QuestForAncientSecretsTriggeredAbility extends TriggeredAbilityImpl {
public QuestForAncientSecretsTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true);
}
public QuestForAncientSecretsTriggeredAbility(final QuestForAncientSecretsTriggeredAbility ability) {
super(ability);
}
@Override
public QuestForAncientSecretsTriggeredAbility copy() {
return new QuestForAncientSecretsTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && !card.isCopy() && card.getOwnerId().equals(this.getControllerId())) {
return true;
}
}
return false;
}
@Override
public String getRule() {
return "Whenever a card is put into your graveyard from anywhere, you may put a quest counter on {this}";
}
}
class QuestForAncientSecretsEffect extends OneShotEffect {
public QuestForAncientSecretsEffect() {

View file

@ -90,7 +90,7 @@ public class AttacksAllTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
}
if (SetTargetPointer.CREATURE.equals(setTargetPointer)) {
if (SetTargetPointer.PERMANENT.equals(setTargetPointer)) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(permanent.getId()));
}

View file

@ -0,0 +1,77 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent;
/**
*
* @author LevelX2
*/
public class EntersOrLeavesTheBattlefieldSourceTriggeredAbility extends TriggeredAbilityImpl {
public EntersOrLeavesTheBattlefieldSourceTriggeredAbility(Effect effect, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
}
public EntersOrLeavesTheBattlefieldSourceTriggeredAbility(final EntersOrLeavesTheBattlefieldSourceTriggeredAbility ability) {
super(ability);
}
@Override
public EntersOrLeavesTheBattlefieldSourceTriggeredAbility copy() {
return new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD
&& event.getTargetId().equals(getSourceId())) {
return true;
}
if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent)event;
if (zEvent.getFromZone().equals(Zone.BATTLEFIELD)) {
return true;
}
}
return false;
}
@Override
public String getRule() {
return "When {this} enters the battlefield or leaves the battlefield, " + super.getRule();
}
}

View file

@ -0,0 +1,129 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.cards.Card;
import mage.constants.SetTargetPointer;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.other.OwnerPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.target.targetpointer.FixedTarget;
/**
*
* @author LevelX2
*/
public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAbilityImpl {
private final FilterCard filter;
private final String ruleText;
private final SetTargetPointer setTargetPointer;
public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Effect effect, boolean optional, TargetController targetController) {
this(effect, optional, new FilterCard("a card"), targetController);
}
public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Effect effect, boolean optional, FilterCard filter, TargetController targetController) {
this(effect, optional, filter, targetController, SetTargetPointer.NONE);
}
public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Effect effect, boolean optional, FilterCard filter, TargetController targetController, SetTargetPointer setTargetPointer) {
this(Zone.BATTLEFIELD, effect, optional, filter, targetController, setTargetPointer);
}
public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Zone zone, Effect effect, boolean optional, FilterCard filter, TargetController targetController, SetTargetPointer setTargetPointer) {
super(zone, effect, optional);
this.filter = filter.copy();
this.setTargetPointer = setTargetPointer;
this.filter.add(new OwnerPredicate(targetController));
StringBuilder sb = new StringBuilder("Whenever ");
sb.append(filter.getMessage());
sb.append(" is put into ");
switch (targetController) {
case OPPONENT:
sb.append("an opponent's");
break;
case YOU:
sb.append("your");
break;
default:
sb.append("a");
}
sb.append(" graveyard, ");
ruleText = sb.toString();
}
public PutCardIntoGraveFromAnywhereAllTriggeredAbility(final PutCardIntoGraveFromAnywhereAllTriggeredAbility ability) {
super(ability);
this.filter = ability.filter;
this.ruleText = ability.ruleText;
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public PutCardIntoGraveFromAnywhereAllTriggeredAbility copy() {
return new PutCardIntoGraveFromAnywhereAllTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && filter.match(card, getSourceId(), getControllerId(), game)) {
switch (setTargetPointer) {
case CARD:
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(card.getId()));
}
break;
case PLAYER:
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(card.getOwnerId()));
}
break;
}
return true;
}
}
return false;
}
@Override
public String getRule() {
return ruleText + super.getRule();
}
}

View file

@ -48,23 +48,23 @@ import mage.players.Player;
*
* @author LevelX2
*/
public class PutIntoGraveFromAnywhereAbility extends SimpleStaticAbility {
public class PutIntoGraveFromAnywhereSourceAbility extends SimpleStaticAbility {
public PutIntoGraveFromAnywhereAbility(Effect baseEffect) {
public PutIntoGraveFromAnywhereSourceAbility(Effect baseEffect) {
this(baseEffect, null, "", true, false);
}
public PutIntoGraveFromAnywhereAbility(Effect baseEffect, Condition condition, String text, boolean selfScope, boolean optional) {
public PutIntoGraveFromAnywhereSourceAbility(Effect baseEffect, Condition condition, String text, boolean selfScope, boolean optional) {
super(Zone.ALL, new PutIntoGraveFromAnywhereEffect(baseEffect, condition, text, selfScope, optional));
}
public PutIntoGraveFromAnywhereAbility(final PutIntoGraveFromAnywhereAbility ability) {
public PutIntoGraveFromAnywhereSourceAbility(final PutIntoGraveFromAnywhereSourceAbility ability) {
super(ability);
}
@Override
public SimpleStaticAbility copy() {
return new PutIntoGraveFromAnywhereAbility(this);
return new PutIntoGraveFromAnywhereSourceAbility(this);
}
@Override

View file

@ -0,0 +1,26 @@
package mage.abilities.common;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
/**
* @author Loki
*/
public class PutIntoGraveFromAnywhereSourceTriggeredAbility extends ZoneChangeTriggeredAbility {
public PutIntoGraveFromAnywhereSourceTriggeredAbility(Effect effect, boolean optional) {
super(Zone.GRAVEYARD, effect, "When {this} is put into a graveyard from anywhere, ", optional);
}
public PutIntoGraveFromAnywhereSourceTriggeredAbility(Effect effect) {
this(effect, false);
}
public PutIntoGraveFromAnywhereSourceTriggeredAbility(final PutIntoGraveFromAnywhereSourceTriggeredAbility ability) {
super(ability);
}
@Override
public PutIntoGraveFromAnywhereSourceTriggeredAbility copy() {
return new PutIntoGraveFromAnywhereSourceTriggeredAbility(this);
}
}

View file

@ -1,26 +0,0 @@
package mage.abilities.common;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
/**
* @author Loki
*/
public class PutIntoGraveFromAnywhereTriggeredAbility extends ZoneChangeTriggeredAbility {
public PutIntoGraveFromAnywhereTriggeredAbility(Effect effect, boolean optional) {
super(Zone.GRAVEYARD, effect, "When {this} is put into a graveyard from anywhere, ", optional);
}
public PutIntoGraveFromAnywhereTriggeredAbility(Effect effect) {
this(effect, false);
}
public PutIntoGraveFromAnywhereTriggeredAbility(final PutIntoGraveFromAnywhereTriggeredAbility ability) {
super(ability);
}
@Override
public PutIntoGraveFromAnywhereTriggeredAbility copy() {
return new PutIntoGraveFromAnywhereTriggeredAbility(this);
}
}

View file

@ -11,23 +11,23 @@ import mage.game.permanent.Permanent;
/**
* @author nantuko, loki
*/
public class PutIntoGraveFromBattlefieldTriggeredAbility extends TriggeredAbilityImpl {
public class PutIntoGraveFromBattlefieldSourceTriggeredAbility extends TriggeredAbilityImpl {
public PutIntoGraveFromBattlefieldTriggeredAbility(Effect effect) {
public PutIntoGraveFromBattlefieldSourceTriggeredAbility(Effect effect) {
this(effect, false);
}
public PutIntoGraveFromBattlefieldTriggeredAbility(Effect effect, boolean optional) {
public PutIntoGraveFromBattlefieldSourceTriggeredAbility(Effect effect, boolean optional) {
super(Zone.ALL, effect, optional);
}
PutIntoGraveFromBattlefieldTriggeredAbility(PutIntoGraveFromBattlefieldTriggeredAbility ability) {
PutIntoGraveFromBattlefieldSourceTriggeredAbility(PutIntoGraveFromBattlefieldSourceTriggeredAbility ability) {
super(ability);
}
@Override
public PutIntoGraveFromBattlefieldTriggeredAbility copy() {
return new PutIntoGraveFromBattlefieldTriggeredAbility(this);
public PutIntoGraveFromBattlefieldSourceTriggeredAbility copy() {
return new PutIntoGraveFromBattlefieldSourceTriggeredAbility(this);
}
@Override

View file

@ -28,11 +28,11 @@
package mage.abilities.effects.common;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@ -44,7 +44,7 @@ public class ReturnSourceFromGraveyardToHandEffect extends OneShotEffect {
public ReturnSourceFromGraveyardToHandEffect() {
super(Outcome.PutCreatureInPlay);
staticText = "Return {this} from your graveyard to your hand";
staticText = "return {this} from your graveyard to your hand";
}
public ReturnSourceFromGraveyardToHandEffect(final ReturnSourceFromGraveyardToHandEffect effect) {
@ -58,12 +58,10 @@ public class ReturnSourceFromGraveyardToHandEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Card card = player.getGraveyard().get(source.getSourceId(), game);
Player controller = game.getPlayer(source.getControllerId());
Card card = controller.getGraveyard().get(source.getSourceId(), game);
if (card != null) {
player.removeFromGraveyard(card, game);
card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
return true;
return controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD);
}
return false;
}

View file

@ -109,7 +109,7 @@ public class ReturnToHandTargetEffect extends OneShotEffect {
return "";
}
Target target = mode.getTargets().get(0);
StringBuilder sb = new StringBuilder("Return ");
StringBuilder sb = new StringBuilder("return ");
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(" target ").append(target.getTargetName()).append(" to their owners' hand");
return sb.toString();

View file

@ -28,9 +28,9 @@
package mage.abilities.effects.common;
import mage.constants.Outcome;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -58,8 +58,12 @@ public class SacrificeSourceEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
// you can only sacrifice a permanent you control
if (source.getControllerId().equals(permanent.getControllerId())) {
return permanent.sacrifice(source.getSourceId(), game);
}
return true;
}
return false;
}

View file

@ -95,6 +95,7 @@ public class GainControlTargetEffect extends ContinuousEffectImpl {
if (this.controllingPlayerId == null && fixedControl) {
this.controllingPlayerId = source.getControllerId();
}
super.init(source, game);
}
@Override

View file

@ -33,5 +33,5 @@ package mage.constants;
* @author LevelX2
*/
public enum SetTargetPointer {
NONE, PLAYER, SPELL, CREATURE, PERMANENT;
NONE, PLAYER, SPELL, CARD, PERMANENT;
}

View file

@ -49,8 +49,8 @@ import mage.watchers.Watcher;
*/
public class CardsPutIntoGraveyardWatcher extends Watcher {
private final Map<UUID, Integer> amountOfCardsThisTurn = new HashMap<UUID, Integer>();
private final Set<UUID> cardsPutToGraveyardFromBattlefield = new HashSet<UUID>();
private final Map<UUID, Integer> amountOfCardsThisTurn = new HashMap<>();
private final Set<UUID> cardsPutToGraveyardFromBattlefield = new HashSet<>();
public CardsPutIntoGraveyardWatcher() {
@ -75,7 +75,7 @@ public class CardsPutIntoGraveyardWatcher extends Watcher {
if (playerId != null && game.getCard(event.getTargetId()) != null) {
Integer amount = amountOfCardsThisTurn.get(playerId);
if (amount == null) {
amount = new Integer(1);
amount = 1;
} else {
++amount;
}
@ -90,13 +90,13 @@ public class CardsPutIntoGraveyardWatcher extends Watcher {
public int getAmountCardsPutToGraveyard(UUID playerId) {
Integer amount = amountOfCardsThisTurn.get(playerId);
if (amount != null) {
return amount.intValue();
return amount;
}
return 0;
}
public Set<UUID> getCardsPutToGraveyardFromBattlefield() {
Set<UUID> cards = new HashSet<UUID>();
Set<UUID> cards = new HashSet<>();
cards.addAll(cardsPutToGraveyardFromBattlefield);
return cards;
}

View file

@ -0,0 +1,75 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.watchers.common;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.watchers.Watcher;
/**
*
* @author LevelX2
*/
public class CreaturesDiedWatcher extends Watcher {
private int amountOfCreaturesThatDied;
public CreaturesDiedWatcher() {
super("CreaturesDiedWatcher", WatcherScope.GAME);
}
public CreaturesDiedWatcher(final CreaturesDiedWatcher watcher) {
super(watcher);
this.amountOfCreaturesThatDied = watcher.amountOfCreaturesThatDied;
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) {
amountOfCreaturesThatDied++;
}
}
@Override
public void reset() {
amountOfCreaturesThatDied = 0;
}
public int getAmountOfCreaturesDiesThisTurn() {
return amountOfCreaturesThatDied;
}
@Override
public CreaturesDiedWatcher copy() {
return new CreaturesDiedWatcher(this);
}
}