From b28bf51c02531dfb058be2552f0abc863b0725ad Mon Sep 17 00:00:00 2001 From: LevelX2 <ludwig.hirth@online.de> Date: Sat, 26 May 2018 22:39:20 +0200 Subject: [PATCH] * Reworked some more card movement handling (#4866). --- .../src/mage/cards/a/AtarkasCommand.java | 29 +++--- Mage.Sets/src/mage/cards/b/BelbesPortal.java | 4 +- .../src/mage/cards/b/BraidsConjurerAdept.java | 4 +- .../src/mage/cards/b/BriarbridgePatrol.java | 13 ++- Mage.Sets/src/mage/cards/b/BrokenBond.java | 4 +- .../src/mage/cards/b/BudokaGardener.java | 7 +- Mage.Sets/src/mage/cards/b/Burgeoning.java | 9 +- .../src/mage/cards/c/ChampionOfRhonas.java | 6 +- Mage.Sets/src/mage/cards/c/CopperGnomes.java | 4 +- .../src/mage/cards/c/CrypticGateway.java | 4 +- .../src/mage/cards/d/DearlyDeparted.java | 5 +- Mage.Sets/src/mage/cards/d/Dermoplasm.java | 4 +- Mage.Sets/src/mage/cards/d/Didgeridoo.java | 4 +- Mage.Sets/src/mage/cards/d/DragonArch.java | 4 +- .../src/mage/cards/d/DramaticEntrance.java | 4 +- Mage.Sets/src/mage/cards/e/ElvishPioneer.java | 8 +- Mage.Sets/src/mage/cards/e/ElvishPiper.java | 9 +- .../src/mage/cards/f/FirebrandRanger.java | 61 +----------- Mage.Sets/src/mage/cards/f/Flickerform.java | 25 +++-- Mage.Sets/src/mage/cards/g/GaeasTouch.java | 61 ++---------- .../mage/cards/g/GarrukCallerOfBeasts.java | 4 +- .../src/mage/cards/g/GemstoneCaverns.java | 14 ++- .../src/mage/cards/g/GiftOfImmortality.java | 4 +- Mage.Sets/src/mage/cards/g/GoblinLackey.java | 4 +- Mage.Sets/src/mage/cards/g/GoblinWizard.java | 4 +- .../src/mage/cards/g/GracefulReprieve.java | 39 ++++---- Mage.Sets/src/mage/cards/g/GraveUpheaval.java | 18 +++- .../src/mage/cards/g/GruesomeEncore.java | 32 ++++--- Mage.Sets/src/mage/cards/g/GryffsBoon.java | 8 +- Mage.Sets/src/mage/cards/g/GuildFeud.java | 14 +-- Mage.Sets/src/mage/cards/h/HuntedWumpus.java | 27 ++---- .../src/mage/cards/h/HuntingGrounds.java | 4 +- Mage.Sets/src/mage/cards/i/Incoming.java | 10 +- Mage.Sets/src/mage/cards/i/IntoTheWilds.java | 25 ++--- .../src/mage/cards/k/KrosanWayfarer.java | 8 +- Mage.Sets/src/mage/cards/k/Kudzu.java | 15 +-- .../src/mage/cards/l/LilianaDeathWielder.java | 11 +-- Mage.Sets/src/mage/cards/l/LlanowarScout.java | 6 +- Mage.Sets/src/mage/cards/l/LoamDweller.java | 8 +- Mage.Sets/src/mage/cards/l/LoyalCathar.java | 39 ++++---- .../src/mage/cards/m/MasterTransmuter.java | 4 +- .../src/mage/cards/m/MatterReshaper.java | 27 +++--- .../src/mage/cards/m/MindwrackLiege.java | 4 +- .../src/mage/cards/m/MoldgrafMonstrosity.java | 41 +++----- .../src/mage/cards/n/NettlevineBlight.java | 6 +- Mage.Sets/src/mage/cards/n/NewFrontiers.java | 12 +-- .../mage/cards/n/NissaStewardOfElements.java | 17 ++-- .../src/mage/cards/n/NissasPilgrimage.java | 8 +- .../src/mage/cards/n/NomadMythmaker.java | 5 +- .../src/mage/cards/n/NorwoodPriestess.java | 4 +- .../src/mage/cards/p/PreeminentCaptain.java | 18 ++-- .../cards/p/PrimevalsGloriousRebirth.java | 13 +-- .../src/mage/cards/p/PyrrhicRevival.java | 41 ++++---- .../src/mage/cards/q/QuestForUlasTemple.java | 63 +++--------- .../src/mage/cards/q/QuicksilverAmulet.java | 10 +- Mage.Sets/src/mage/cards/r/Reincarnation.java | 8 +- .../src/mage/cards/r/ReinsOfTheVinesteed.java | 11 +-- Mage.Sets/src/mage/cards/r/Restore.java | 6 +- Mage.Sets/src/mage/cards/r/Retether.java | 16 ++-- .../cards/r/ReturnOfTheNightstalkers.java | 14 ++- .../src/mage/cards/r/RoarOfReclamation.java | 25 ++--- Mage.Sets/src/mage/cards/r/RootElemental.java | 8 +- .../src/mage/cards/s/SakuraTribeScout.java | 8 +- .../src/mage/cards/s/ScionOfDarkness.java | 20 ++-- .../src/mage/cards/s/SettleTheWreckage.java | 46 ++++----- .../src/mage/cards/s/SkyshroudRanger.java | 10 +- .../src/mage/cards/s/StoneforgeMystic.java | 4 +- Mage.Sets/src/mage/cards/s/SwellOfGrowth.java | 7 +- .../src/mage/cards/t/TerrainGenerator.java | 13 +-- Mage.Sets/src/mage/cards/t/TheUrDragon.java | 16 ++-- .../mage/cards/t/ThranTemporalGateway.java | 4 +- .../src/mage/cards/t/TimmyPowerGamer.java | 8 +- Mage.Sets/src/mage/cards/t/TriassicEgg.java | 5 +- Mage.Sets/src/mage/cards/w/WalkingAtlas.java | 13 +-- .../src/mage/cards/w/WarrenInstigator.java | 4 +- .../src/mage/cards/w/WillowPriestess.java | 4 +- .../mana/VorinclexVoiceOfHungerTest.java | 1 + .../abilities/effects/ContinuousEffects.java | 3 + ...PutCardFromHandOntoBattlefieldEffect.java} | 25 +++-- .../PutLandFromHandOntoBattlefieldEffect.java | 96 ------------------- ...efieldUnderOwnerControlAttachedEffect.java | 24 ++--- ...ttlefieldUnderYourControlSourceEffect.java | 23 +++-- .../abilities/keyword/AuraSwapAbility.java | 4 +- .../abilities/keyword/NinjutsuAbility.java | 7 +- .../main/java/mage/filter/StaticFilters.java | 19 ++++ .../mage/game/permanent/PermanentImpl.java | 4 +- 86 files changed, 534 insertions(+), 758 deletions(-) rename Mage/src/main/java/mage/abilities/effects/common/{PutPermanentOnBattlefieldEffect.java => PutCardFromHandOntoBattlefieldEffect.java} (70%) delete mode 100644 Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java diff --git a/Mage.Sets/src/mage/cards/a/AtarkasCommand.java b/Mage.Sets/src/mage/cards/a/AtarkasCommand.java index c9e04b5576..ab4ee2e30e 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkasCommand.java +++ b/Mage.Sets/src/mage/cards/a/AtarkasCommand.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Mode; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamagePlayersEffect; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.CantGainLifeAllEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -41,6 +41,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; +import mage.filter.StaticFilters; /** * @@ -49,35 +50,35 @@ import mage.constants.TargetController; public class AtarkasCommand extends CardImpl { public AtarkasCommand(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}{G}"); - // Choose two - + // Choose two - this.getSpellAbility().getModes().setMinModes(2); this.getSpellAbility().getModes().setMaxModes(2); - - // Your opponents can't gain life this turn; + + // Your opponents can't gain life this turn; this.getSpellAbility().addEffect(new CantGainLifeAllEffect(Duration.EndOfTurn, TargetController.OPPONENT)); - - // or Atarka's Command deals 3 damage to each opponent; + + // or Atarka's Command deals 3 damage to each opponent; Mode mode = new Mode(); mode.getEffects().add(new DamagePlayersEffect(3, TargetController.OPPONENT)); this.getSpellAbility().addMode(mode); - - // or You may put a land card from your hand onto the battlefield; + + // or You may put a land card from your hand onto the battlefield; mode = new Mode(); - mode.getEffects().add(new PutLandFromHandOntoBattlefieldEffect()); + mode.getEffects().add(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A)); this.getSpellAbility().addMode(mode); // or Creatures you control get +1/+1 and gain reach until the end of turn. mode = new Mode(); - Effect effect = new BoostControlledEffect(1,1, Duration.EndOfTurn); - effect.setText("Creatures you control get +1/+1"); + Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn); + effect.setText("Creatures you control get +1/+1"); mode.getEffects().add(effect); effect = new GainAbilityControlledEffect(ReachAbility.getInstance(), Duration.EndOfTurn); - effect.setText("and gain reach until the end of turn"); + effect.setText("and gain reach until the end of turn"); mode.getEffects().add(effect); this.getSpellAbility().addMode(mode); - + } public AtarkasCommand(final AtarkasCommand card) { diff --git a/Mage.Sets/src/mage/cards/b/BelbesPortal.java b/Mage.Sets/src/mage/cards/b/BelbesPortal.java index c061bf88c8..0e357f1985 100644 --- a/Mage.Sets/src/mage/cards/b/BelbesPortal.java +++ b/Mage.Sets/src/mage/cards/b/BelbesPortal.java @@ -34,7 +34,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.ChooseCreatureTypeEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -58,7 +58,7 @@ public class BelbesPortal extends CardImpl { FilterCreatureCard filter = new FilterCreatureCard("a creature card of the chosen type"); filter.add(new ChosenSubtypePredicate(this.getId())); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(filter), + new PutCardFromHandOntoBattlefieldEffect(filter), new ManaCostsImpl("{3}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/BraidsConjurerAdept.java b/Mage.Sets/src/mage/cards/b/BraidsConjurerAdept.java index ef3276fb41..9a46a43ec9 100644 --- a/Mage.Sets/src/mage/cards/b/BraidsConjurerAdept.java +++ b/Mage.Sets/src/mage/cards/b/BraidsConjurerAdept.java @@ -30,7 +30,7 @@ package mage.cards.b; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -64,7 +64,7 @@ public class BraidsConjurerAdept extends CardImpl { this.toughness = new MageInt(2); // At the beginning of each player's upkeep, that player may put an artifact, creature, or land card from their hand onto the battlefield. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter, true), TargetController.ANY, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter, true), TargetController.ANY, false)); } public BraidsConjurerAdept(final BraidsConjurerAdept card) { diff --git a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java index 9cbfc70cc3..3cd17f3d3c 100644 --- a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java +++ b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java @@ -27,12 +27,14 @@ */ package mage.cards.b; +import java.util.List; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.DealsDamageToOneOrMoreCreaturesTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.keyword.InvestigateEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -40,14 +42,11 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.watchers.common.PermanentsSacrificedWatcher; -import java.util.List; -import java.util.UUID; - /** * @author LevelX2 */ @@ -62,7 +61,7 @@ public class BriarbridgePatrol extends CardImpl { // Whenever Briarbridge Patrol deals damage to one or more creatures, investigate (Create a colorless Clue artifact token with "2, Sacrifice this artifact: Draw a card."). this.addAbility(new DealsDamageToOneOrMoreCreaturesTriggeredAbility(new InvestigateEffect(), false, false, false)); // At the beginning of each end step, if you sacrificed three or more Clues this turn, you may put a creature card from your hand onto the battlefield. - this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), TargetController.ANY, + this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), TargetController.ANY, BriarbridgePatrolCondition.instance, true), new PermanentsSacrificedWatcher()); } @@ -104,4 +103,4 @@ enum BriarbridgePatrolCondition implements Condition { return "if you sacrificed three or more Clues this turn"; } - } +} diff --git a/Mage.Sets/src/mage/cards/b/BrokenBond.java b/Mage.Sets/src/mage/cards/b/BrokenBond.java index edd5b097aa..5f4241c5a5 100644 --- a/Mage.Sets/src/mage/cards/b/BrokenBond.java +++ b/Mage.Sets/src/mage/cards/b/BrokenBond.java @@ -30,7 +30,7 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -49,7 +49,7 @@ public class BrokenBond extends CardImpl { // Destroy target artifact or enchantment. You may put a land card from your hand onto the battlefield. this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); this.getSpellAbility().addEffect(new DestroyTargetEffect()); - this.getSpellAbility().addEffect(new PutLandFromHandOntoBattlefieldEffect()); + this.getSpellAbility().addEffect(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A)); } public BrokenBond(final BrokenBond card) { diff --git a/Mage.Sets/src/mage/cards/b/BudokaGardener.java b/Mage.Sets/src/mage/cards/b/BudokaGardener.java index a9463b13f2..d76d6ef12a 100644 --- a/Mage.Sets/src/mage/cards/b/BudokaGardener.java +++ b/Mage.Sets/src/mage/cards/b/BudokaGardener.java @@ -35,7 +35,6 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.FlipSourceEffect; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -44,10 +43,11 @@ import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.permanent.token.DokaiWeaverofLifeToken; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.players.Player; import java.util.UUID; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; +import mage.filter.StaticFilters; /** * @author Loki @@ -64,7 +64,7 @@ public class BudokaGardener extends CardImpl { this.flipCardName = "Dokai, Weaver of Life"; // {T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new TapSourceCost()); ability.addEffect(new BudokaGardenerEffect()); this.addAbility(ability); } @@ -128,6 +128,7 @@ class DokaiWeaverofLife extends TokenImpl { ability.addCost(new TapSourceCost()); this.addAbility(ability); } + public DokaiWeaverofLife(final DokaiWeaverofLife token) { super(token); } diff --git a/Mage.Sets/src/mage/cards/b/Burgeoning.java b/Mage.Sets/src/mage/cards/b/Burgeoning.java index aeb7593fbc..11cfd535ec 100644 --- a/Mage.Sets/src/mage/cards/b/Burgeoning.java +++ b/Mage.Sets/src/mage/cards/b/Burgeoning.java @@ -29,11 +29,12 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -45,7 +46,7 @@ import mage.game.permanent.Permanent; public class Burgeoning extends CardImpl { public Burgeoning(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}"); // Whenever an opponent plays a land, you may put a land card from your hand onto the battlefield. this.addAbility(new BurgeoningTriggeredAbility()); @@ -61,10 +62,10 @@ public class Burgeoning extends CardImpl { } } - class BurgeoningTriggeredAbility extends TriggeredAbilityImpl { + BurgeoningTriggeredAbility() { - super(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect()); + super(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A)); } BurgeoningTriggeredAbility(BurgeoningTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java b/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java index 4d65190d27..83578e985f 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java @@ -30,13 +30,13 @@ package mage.cards.c; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BecomesExertSourceTriggeredAbility; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.ExertAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; /** * @@ -53,7 +53,7 @@ public class ChampionOfRhonas extends CardImpl { this.toughness = new MageInt(3); // You may exert Champion of Rhonas as it attacks. When you do, you may put a creature card from your hand onto the battlefield. - BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card"))); + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A)); this.addAbility(new ExertAbility(ability)); } diff --git a/Mage.Sets/src/mage/cards/c/CopperGnomes.java b/Mage.Sets/src/mage/cards/c/CopperGnomes.java index d926d333a8..29254ffc22 100644 --- a/Mage.Sets/src/mage/cards/c/CopperGnomes.java +++ b/Mage.Sets/src/mage/cards/c/CopperGnomes.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -54,7 +54,7 @@ public class CopperGnomes extends CardImpl { this.toughness = new MageInt(1); // {4}, Sacrifice Copper Gnomes: You may put an artifact card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(new FilterArtifactCard()), new ManaCostsImpl("{4}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(new FilterArtifactCard()), new ManaCostsImpl("{4}")); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CrypticGateway.java b/Mage.Sets/src/mage/cards/c/CrypticGateway.java index 9821618bf7..1437f484bb 100644 --- a/Mage.Sets/src/mage/cards/c/CrypticGateway.java +++ b/Mage.Sets/src/mage/cards/c/CrypticGateway.java @@ -33,7 +33,7 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.CostImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.ChangelingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -223,7 +223,7 @@ class CrypticGatewayEffect extends OneShotEffect { } if (commonSubType) { - PutPermanentOnBattlefieldEffect putIntoPlay = new PutPermanentOnBattlefieldEffect(filter); + PutCardFromHandOntoBattlefieldEffect putIntoPlay = new PutCardFromHandOntoBattlefieldEffect(filter); putIntoPlay.apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/d/DearlyDeparted.java b/Mage.Sets/src/mage/cards/d/DearlyDeparted.java index 74b092938b..c469f16f24 100644 --- a/Mage.Sets/src/mage/cards/d/DearlyDeparted.java +++ b/Mage.Sets/src/mage/cards/d/DearlyDeparted.java @@ -27,6 +27,7 @@ */ package mage.cards.d; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -42,8 +43,6 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; -import java.util.UUID; - /** * @author nantuko */ @@ -75,7 +74,7 @@ public class DearlyDeparted extends CardImpl { class DearlyDepartedEntersBattlefieldEffect extends ReplacementEffectImpl { public DearlyDepartedEntersBattlefieldEffect() { - super(Duration.OneUse, Outcome.BoostCreature); + super(Duration.WhileInGraveyard, Outcome.BoostCreature); staticText = "As long as {this} is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it"; } diff --git a/Mage.Sets/src/mage/cards/d/Dermoplasm.java b/Mage.Sets/src/mage/cards/d/Dermoplasm.java index 3fe7abef13..441aeac1c0 100644 --- a/Mage.Sets/src/mage/cards/d/Dermoplasm.java +++ b/Mage.Sets/src/mage/cards/d/Dermoplasm.java @@ -35,7 +35,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; @@ -103,7 +103,7 @@ class DermoplasmEffect extends OneShotEffect { Permanent thisCreature = game.getPermanent(source.getId()); FilterCreatureCard filter = new FilterCreatureCard("a creature card with a morph ability"); filter.add(new AbilityPredicate(MorphAbility.class)); - Effect effect = new PutPermanentOnBattlefieldEffect(new FilterCreatureCard(filter)); + Effect effect = new PutCardFromHandOntoBattlefieldEffect(new FilterCreatureCard(filter)); if (effect.apply(game, source)) { if (thisCreature != null) { effect = new ReturnToHandTargetEffect(); diff --git a/Mage.Sets/src/mage/cards/d/Didgeridoo.java b/Mage.Sets/src/mage/cards/d/Didgeridoo.java index ec0870fceb..75fc8b297d 100644 --- a/Mage.Sets/src/mage/cards/d/Didgeridoo.java +++ b/Mage.Sets/src/mage/cards/d/Didgeridoo.java @@ -30,7 +30,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -55,7 +55,7 @@ public class Didgeridoo extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {3}: You may put a Minotaur permanent card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{3}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter), new ManaCostsImpl("{3}"))); } public Didgeridoo(final Didgeridoo card) { diff --git a/Mage.Sets/src/mage/cards/d/DragonArch.java b/Mage.Sets/src/mage/cards/d/DragonArch.java index 66441fa4ab..e76357850b 100644 --- a/Mage.Sets/src/mage/cards/d/DragonArch.java +++ b/Mage.Sets/src/mage/cards/d/DragonArch.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -57,7 +57,7 @@ public class DragonArch extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); // {2}, {T}: You may put a multicolored creature card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/DramaticEntrance.java b/Mage.Sets/src/mage/cards/d/DramaticEntrance.java index 610c17b2be..28659fe973 100644 --- a/Mage.Sets/src/mage/cards/d/DramaticEntrance.java +++ b/Mage.Sets/src/mage/cards/d/DramaticEntrance.java @@ -29,7 +29,7 @@ package mage.cards.d; import java.util.UUID; import mage.ObjectColor; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -52,7 +52,7 @@ public class DramaticEntrance extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{G}{G}"); // You may put a green creature card from your hand onto the battlefield. - this.getSpellAbility().addEffect(new PutPermanentOnBattlefieldEffect(filter)); + this.getSpellAbility().addEffect(new PutCardFromHandOntoBattlefieldEffect(filter)); } diff --git a/Mage.Sets/src/mage/cards/e/ElvishPioneer.java b/Mage.Sets/src/mage/cards/e/ElvishPioneer.java index 8062bdbacf..f9bbb4e051 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishPioneer.java +++ b/Mage.Sets/src/mage/cards/e/ElvishPioneer.java @@ -30,12 +30,12 @@ package mage.cards.e; import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterLandCard; +import mage.filter.StaticFilters; /** * @@ -44,7 +44,7 @@ import mage.filter.common.FilterLandCard; public class ElvishPioneer extends CardImpl { public ElvishPioneer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.DRUID); @@ -52,7 +52,7 @@ public class ElvishPioneer extends CardImpl { this.toughness = new MageInt(1); // When Elvish Pioneer enters the battlefield, you may put a basic land card from your hand onto the battlefield tapped. - this.addAbility(new EntersBattlefieldTriggeredAbility(new PutLandFromHandOntoBattlefieldEffect(true, FilterLandCard.basicLandCard()), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A, false, true), false)); } public ElvishPioneer(final ElvishPioneer card) { diff --git a/Mage.Sets/src/mage/cards/e/ElvishPiper.java b/Mage.Sets/src/mage/cards/e/ElvishPiper.java index 77b8a475ba..26013d4dea 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishPiper.java +++ b/Mage.Sets/src/mage/cards/e/ElvishPiper.java @@ -27,19 +27,18 @@ */ package mage.cards.e; - import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; /** * @@ -48,7 +47,7 @@ import mage.filter.common.FilterCreatureCard; public class ElvishPiper extends CardImpl { public ElvishPiper(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.SHAMAN); @@ -57,7 +56,7 @@ public class ElvishPiper extends CardImpl { // {G}, {tap}: You may put a creature card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), new ManaCostsImpl("{G}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/f/FirebrandRanger.java b/Mage.Sets/src/mage/cards/f/FirebrandRanger.java index 3c335a7fd5..c46cbf97cc 100644 --- a/Mage.Sets/src/mage/cards/f/FirebrandRanger.java +++ b/Mage.Sets/src/mage/cards/f/FirebrandRanger.java @@ -33,22 +33,13 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.mageobject.SupertypePredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.common.TargetCardInHand; +import mage.filter.StaticFilters; /** * @@ -63,8 +54,9 @@ public class FirebrandRanger extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // {G}, {tap}: You may put a basic land card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandOnBattlefieldEffect(), new ManaCostsImpl("{G}")); + // {G}, {T}: You may put a basic land card from your hand onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new ManaCostsImpl("{G}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } @@ -78,46 +70,3 @@ public class FirebrandRanger extends CardImpl { return new FirebrandRanger(this); } } - -class PutLandOnBattlefieldEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("basic land card"); - - static { - filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate(SuperType.BASIC))); - } - - private static final String choiceText = "Put a basic land card from your hand onto the battlefield?"; - - public PutLandOnBattlefieldEffect() { - super(Outcome.PutLandInPlay); - this.staticText = "you may put a basic land card from your hand onto the battlefield"; - } - - public PutLandOnBattlefieldEffect(final PutLandOnBattlefieldEffect effect) { - super(effect); - } - - @Override - public PutLandOnBattlefieldEffect copy() { - return new PutLandOnBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null || !player.chooseUse(Outcome.PutLandInPlay, choiceText, source, game)) { - return false; - } - - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutLandInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/f/Flickerform.java b/Mage.Sets/src/mage/cards/f/Flickerform.java index f1bbbbba8b..3898d93bfb 100644 --- a/Mage.Sets/src/mage/cards/f/Flickerform.java +++ b/Mage.Sets/src/mage/cards/f/Flickerform.java @@ -27,6 +27,8 @@ */ package mage.cards.f; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -50,8 +52,8 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.ExileZone; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -63,7 +65,7 @@ import mage.target.common.TargetCreaturePermanent; public class Flickerform extends CardImpl { public Flickerform(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.subtype.add(SubType.AURA); // Enchant creature @@ -128,7 +130,7 @@ class FlickerformEffect extends OneShotEffect { } } if (!(enchantedCreature instanceof Token)) { - // At the beginning of the next end step, return that card to the battlefield under its owner's control. + // At the beginning of the next end step, return that card to the battlefield under its owner's control. // If you do, return the other cards exiled this way to the battlefield under their owners' control attached to that creature AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility( new FlickerformReturnEffect(enchantedCreature.getId(), exileZoneId)); @@ -174,12 +176,17 @@ class FlickerformReturnEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } ExileZone exileZone = game.getExile().getExileZone(exileZoneId); Card enchantedCard = exileZone.get(enchantedCardId, game); if (enchantedCard != null) { - enchantedCard.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), enchantedCard.getOwnerId()); + controller.moveCards(enchantedCard, Zone.BATTLEFIELD, source, game); Permanent newPermanent = game.getPermanent(enchantedCardId); if (newPermanent != null) { + Set<Card> toBattlefieldAttached = new HashSet<Card>(); for (Card enchantment : exileZone.getCards(game)) { if (filterAura.match(enchantment, game)) { boolean canTarget = false; @@ -196,9 +203,13 @@ class FlickerformReturnEffect extends OneShotEffect { } game.getState().setValue("attachTo:" + enchantment.getId(), newPermanent); } - if (enchantment.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), enchantment.getOwnerId())) { - if (filterAura.match(enchantment, game)) { - newPermanent.addAttachment(enchantment.getId(), game); + toBattlefieldAttached.add(enchantment); + } + if (!toBattlefieldAttached.isEmpty()) { + controller.moveCards(toBattlefieldAttached, Zone.BATTLEFIELD, source, game); + for (Card card : toBattlefieldAttached) { + if (game.getState().getZone(card.getId()).equals(Zone.BATTLEFIELD)) { + newPermanent.addAttachment(card.getId(), game); } } } diff --git a/Mage.Sets/src/mage/cards/g/GaeasTouch.java b/Mage.Sets/src/mage/cards/g/GaeasTouch.java index f95fc48d67..459c36392b 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasTouch.java +++ b/Mage.Sets/src/mage/cards/g/GaeasTouch.java @@ -29,24 +29,17 @@ package mage.cards.g; import java.util.UUID; import mage.Mana; -import mage.abilities.Ability; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.mana.SimpleManaAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.common.TargetCardInHand; /** * @@ -55,10 +48,14 @@ import mage.target.common.TargetCardInHand; public class GaeasTouch extends CardImpl { public GaeasTouch(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}{G}"); // You may put a basic Forest card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery and only once each turn. - LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new PutBasicForestOnBattlefieldEffect(), new GenericManaCost(0), 1); + FilterCard filter = new FilterCard("basic Forest card"); + filter.add(new SupertypePredicate(SuperType.BASIC)); + filter.add(new SubtypePredicate(SubType.FOREST)); + LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(filter), new GenericManaCost(0), 1); ability.setTiming(TimingRule.SORCERY); addAbility(ability); @@ -75,47 +72,3 @@ public class GaeasTouch extends CardImpl { return new GaeasTouch(this); } } - -class PutBasicForestOnBattlefieldEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("basic Forest card"); - - static { - filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate(SuperType.BASIC))); - filter.add(new SubtypePredicate(SubType.FOREST)); - } - - private static final String choiceText = "Put a basic Forest card from your hand onto the battlefield?"; - - public PutBasicForestOnBattlefieldEffect() { - super(Outcome.PutLandInPlay); - this.staticText = "put a basic Forest card from your hand onto the battlefield"; - } - - public PutBasicForestOnBattlefieldEffect(final PutBasicForestOnBattlefieldEffect effect) { - super(effect); - } - - @Override - public PutBasicForestOnBattlefieldEffect copy() { - return new PutBasicForestOnBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null || !player.chooseUse(Outcome.PutLandInPlay, choiceText, source, game)) { - return false; - } - - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutLandInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java index 23fbd9a95d..1bf0676fb7 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java +++ b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java @@ -32,7 +32,7 @@ import mage.ObjectColor; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -67,7 +67,7 @@ public class GarrukCallerOfBeasts extends CardImpl { this.addAbility(new LoyaltyAbility(new RevealLibraryPutIntoHandEffect(5, new FilterCreatureCard("creature cards"), Zone.LIBRARY), 1)); // -3: You may put a green creature card from your hand onto the battlefield. - this.addAbility(new LoyaltyAbility(new PutPermanentOnBattlefieldEffect(filterGreenCreature), -3)); + this.addAbility(new LoyaltyAbility(new PutCardFromHandOntoBattlefieldEffect(filterGreenCreature), -3)); // -7: You get an emblem with "Whenever you cast a creature spell, you may search your library for a creature card, put it onto the battlefield, then shuffle your library."); this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new GarrukCallerOfBeastsEmblem()), -7)); diff --git a/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java b/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java index ef6a00309f..ddd88c5a27 100644 --- a/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java +++ b/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java @@ -37,7 +37,10 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileFromHandCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalManaEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.EntersBattlefieldEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ConditionalManaAbility; @@ -45,6 +48,7 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; @@ -143,14 +147,16 @@ class GemstoneCavernsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { Card card = game.getCard(source.getSourceId()); if (card != null) { - if (card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId())) { + ContinuousEffect effect = new EntersBattlefieldEffect(new AddCountersSourceEffect(CounterType.LUCK.createInstance()), ""); + effect.setDuration(Duration.OneUse); + game.addEffect(effect, source); + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { - permanent.addCounters(CounterType.LUCK.createInstance(), source, game); Cost cost = new ExileFromHandCost(new TargetCardInHand()); if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game)) { cost.pay(source, game, source.getSourceId(), source.getControllerId(), true, null); diff --git a/Mage.Sets/src/mage/cards/g/GiftOfImmortality.java b/Mage.Sets/src/mage/cards/g/GiftOfImmortality.java index 3360917aea..69f4f574c7 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfImmortality.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfImmortality.java @@ -39,8 +39,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; @@ -142,7 +142,7 @@ class GiftOfImmortalityReturnEnchantmentEffect extends OneShotEffect { Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); if (controller != null && creature != null) { game.getState().setValue("attachTo:" + aura.getId(), creature); - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return creature.addAttachment(aura.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/g/GoblinLackey.java b/Mage.Sets/src/mage/cards/g/GoblinLackey.java index f937117f0a..31bcb46f7c 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinLackey.java +++ b/Mage.Sets/src/mage/cards/g/GoblinLackey.java @@ -30,7 +30,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -58,7 +58,7 @@ public class GoblinLackey extends CardImpl { this.toughness = new MageInt(1); // Whenever Goblin Lackey deals damage to a player, you may put a Goblin permanent card from your hand onto the battlefield. - this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter), false)); + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter), false)); } public GoblinLackey(final GoblinLackey card) { diff --git a/Mage.Sets/src/mage/cards/g/GoblinWizard.java b/Mage.Sets/src/mage/cards/g/GoblinWizard.java index 755c51e88b..c9baf7ecbf 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinWizard.java +++ b/Mage.Sets/src/mage/cards/g/GoblinWizard.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; @@ -72,7 +72,7 @@ public class GoblinWizard extends CardImpl { // {tap}: You may put a Goblin permanent card from your hand onto the battlefield. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(filter), + new PutCardFromHandOntoBattlefieldEffect(filter), new TapSourceCost())); // {R}: Target Goblin gains protection from white until end of turn. diff --git a/Mage.Sets/src/mage/cards/g/GracefulReprieve.java b/Mage.Sets/src/mage/cards/g/GracefulReprieve.java index f727f6d91b..45309c83ae 100644 --- a/Mage.Sets/src/mage/cards/g/GracefulReprieve.java +++ b/Mage.Sets/src/mage/cards/g/GracefulReprieve.java @@ -28,6 +28,7 @@ package mage.cards.g; import java.util.UUID; +import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -42,9 +43,9 @@ 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; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -53,12 +54,12 @@ import mage.target.common.TargetCreaturePermanent; public class GracefulReprieve extends CardImpl { public GracefulReprieve(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); // When target creature dies this turn, return that card to the battlefield under its owner's control. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new GracefulReprieveEffect()); - + } public GracefulReprieve(final GracefulReprieve card) { @@ -89,7 +90,7 @@ class GracefulReprieveEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - DelayedTriggeredAbility delayedAbility = new GracefulReprieveDelayedTriggeredAbility(targetPointer.getFirst(game, source)); + DelayedTriggeredAbility delayedAbility = new GracefulReprieveDelayedTriggeredAbility(new MageObjectReference(targetPointer.getFirst(game, source), game)); game.addDelayedTriggeredAbility(delayedAbility, source); return true; } @@ -97,10 +98,10 @@ class GracefulReprieveEffect extends OneShotEffect { class GracefulReprieveDelayedTriggeredAbility extends DelayedTriggeredAbility { - private UUID target; + private MageObjectReference target; - public GracefulReprieveDelayedTriggeredAbility(UUID target) { - super(new GracefulReprieveDelayedEffect(target), Duration.EndOfTurn); + public GracefulReprieveDelayedTriggeredAbility(MageObjectReference target) { + super(new GracefulReprieveDelayedEffect(), Duration.EndOfTurn); this.target = target; } @@ -116,9 +117,10 @@ class GracefulReprieveDelayedTriggeredAbility extends DelayedTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(target)) { + if (target.refersTo(((ZoneChangeEvent) event).getTarget(), game)) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { + getEffects().setTargetPointer(new FixedTarget(target.getSourceId())); return true; } } @@ -138,17 +140,13 @@ class GracefulReprieveDelayedTriggeredAbility extends DelayedTriggeredAbility { class GracefulReprieveDelayedEffect extends OneShotEffect { - private final UUID target; - - public GracefulReprieveDelayedEffect(UUID target) { + public GracefulReprieveDelayedEffect() { super(Outcome.PutCreatureInPlay); - this.target = target; this.staticText = "return that card to the battlefield under its owner's control"; } public GracefulReprieveDelayedEffect(final GracefulReprieveDelayedEffect effect) { super(effect); - this.target = effect.target; } @Override @@ -159,17 +157,12 @@ class GracefulReprieveDelayedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent permanent = (Permanent) game.getLastKnownInformation(target, Zone.BATTLEFIELD); - if (controller != null - && permanent != null) { - Player player = game.getPlayer(permanent.getOwnerId()); - if (player != null) { - Card card = game.getCard(target); - if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { - return card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); - } - return true; + if (controller != null) { + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null); } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/g/GraveUpheaval.java b/Mage.Sets/src/mage/cards/g/GraveUpheaval.java index 60ccfd4700..3cd069f880 100644 --- a/Mage.Sets/src/mage/cards/g/GraveUpheaval.java +++ b/Mage.Sets/src/mage/cards/g/GraveUpheaval.java @@ -43,6 +43,8 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCardInGraveyard; import mage.target.targetpointer.FixedTarget; @@ -55,7 +57,6 @@ public class GraveUpheaval extends CardImpl { public GraveUpheaval(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}{R}"); - // Put target creature card from a graveyard onto the battlefield under your control. It gains haste. this.getSpellAbility().addEffect(new GraveUpheavalEffect()); this.getSpellAbility().addTarget(new TargetCardInGraveyard()); @@ -92,12 +93,19 @@ class GraveUpheavalEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } Card card = game.getCard(source.getFirstTarget()); if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = game.getPermanent(card.getId()); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + } return true; } diff --git a/Mage.Sets/src/mage/cards/g/GruesomeEncore.java b/Mage.Sets/src/mage/cards/g/GruesomeEncore.java index 162c5f0259..26b1d86fff 100644 --- a/Mage.Sets/src/mage/cards/g/GruesomeEncore.java +++ b/Mage.Sets/src/mage/cards/g/GruesomeEncore.java @@ -48,6 +48,8 @@ import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCardInOpponentsGraveyard; import mage.target.targetpointer.FixedTarget; @@ -60,7 +62,7 @@ public class GruesomeEncore extends CardImpl { private static final FilterCreatureCard filter = new FilterCreatureCard("creature card from an opponent's graveyard"); public GruesomeEncore(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); // Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. this.getSpellAbility().addEffect(new GruesomeEncoreEffect()); @@ -97,19 +99,23 @@ class GruesomeEncoreEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getFirstTarget()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Card card = game.getCard(getTargetPointer().getFirst(game, source)); if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - - ExileTargetEffect exileEffect = new ExileTargetEffect(); - exileEffect.setTargetPointer(new FixedTarget(card.getId())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); - game.addDelayedTriggeredAbility(delayedAbility, source); - + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + Permanent permanent = game.getPermanent(card.getId()); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + ExileTargetEffect exileEffect = new ExileTargetEffect(); + exileEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); + game.addDelayedTriggeredAbility(delayedAbility, source); + } return true; } diff --git a/Mage.Sets/src/mage/cards/g/GryffsBoon.java b/Mage.Sets/src/mage/cards/g/GryffsBoon.java index 171fc5c063..df26c590d8 100644 --- a/Mage.Sets/src/mage/cards/g/GryffsBoon.java +++ b/Mage.Sets/src/mage/cards/g/GryffsBoon.java @@ -45,6 +45,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -55,7 +56,7 @@ import mage.target.common.TargetCreaturePermanent; public class GryffsBoon extends CardImpl { public GryffsBoon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}"); this.subtype.add(SubType.AURA); // Enchant creature @@ -102,12 +103,13 @@ class GryffsBoonEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Card aura = game.getCard(source.getSourceId()); - if (aura != null + Player controller = game.getPlayer(source.getControllerId()); + if (aura != null && controller != null && game.getState().getZone(aura.getId()) == Zone.GRAVEYARD) { Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (!targetPermanent.cantBeAttachedBy(aura, game)) { game.getState().setValue("attachTo:" + aura.getId(), targetPermanent); - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return targetPermanent.addAttachment(aura.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/g/GuildFeud.java b/Mage.Sets/src/mage/cards/g/GuildFeud.java index c3dceb9c07..7276a9159b 100644 --- a/Mage.Sets/src/mage/cards/g/GuildFeud.java +++ b/Mage.Sets/src/mage/cards/g/GuildFeud.java @@ -27,6 +27,7 @@ */ package mage.cards.g; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -43,8 +44,6 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetOpponent; -import java.util.UUID; - /** * * @author LevelX2 @@ -52,7 +51,7 @@ import java.util.UUID; public class GuildFeud extends CardImpl { public GuildFeud(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{5}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{R}"); // At the beginning of your upkeep, target opponent reveals the top three cards // of their library, may put a creature card from among them onto the battlefield, @@ -95,9 +94,8 @@ class GuildFeudEffect extends OneShotEffect { if (opponent != null && controller != null && sourceObject != null) { for (int activePlayer = 0; activePlayer < 2; activePlayer++) { Player player = (activePlayer == 0 ? opponent : controller); - Cards topThreeCards = new CardsImpl(); - topThreeCards.addAll(player.getLibrary().getTopCards(game, 3)); - player.revealCards(sourceObject.getIdName() + " - " + player.getName() + " top library cards", topThreeCards, game); + Cards topThreeCards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + player.revealCards(source, player.getName() + " top library cards", topThreeCards, game); Card creatureToBattlefield; if (!topThreeCards.isEmpty()) { if (player.chooseUse(Outcome.PutCreatureInPlay, "Put a creature card among them to the battlefield?", source, game)) { @@ -108,9 +106,7 @@ class GuildFeudEffect extends OneShotEffect { creatureToBattlefield = topThreeCards.get(target.getFirstTarget(), game); if (creatureToBattlefield != null) { topThreeCards.remove(creatureToBattlefield); - if (creatureToBattlefield.putOntoBattlefield(game, Zone.LIBRARY, - source.getSourceId(), player.getId())) { - game.informPlayers("Guild Feud: " + player.getLogName() + " put " + creatureToBattlefield.getName() + " to the battlefield"); + if (player.moveCards(creatureToBattlefield, Zone.BATTLEFIELD, source, game)) { if (activePlayer == 0) { opponentCreature = game.getPermanent(creatureToBattlefield.getId()); } else { diff --git a/Mage.Sets/src/mage/cards/h/HuntedWumpus.java b/Mage.Sets/src/mage/cards/h/HuntedWumpus.java index 712c0c2dc4..98ef9b971e 100644 --- a/Mage.Sets/src/mage/cards/h/HuntedWumpus.java +++ b/Mage.Sets/src/mage/cards/h/HuntedWumpus.java @@ -31,18 +31,18 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; 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.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCardInHand; +import mage.target.targetpointer.FixedTarget; /** * @@ -51,7 +51,7 @@ import mage.target.common.TargetCardInHand; public class HuntedWumpus extends CardImpl { public HuntedWumpus(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(6); @@ -92,20 +92,11 @@ class HuntedWumpusEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for(UUID playerId: game.getState().getPlayersInRange(controller.getId(), game)) { + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { if (!playerId.equals(controller.getId())) { - Player player = game.getPlayer(playerId); - if (player != null) { - TargetCardInHand target = new TargetCardInHand(new FilterCreatureCard()); - if (target.canChoose(source.getSourceId(), playerId, game) - && player.chooseUse(Outcome.Neutral, "Put a creature card from your hand onto the battlefield?", source, game) - && player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId()); - } - } - } + Effect effect = new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A, true); + effect.setTargetPointer(new FixedTarget(playerId)); + effect.apply(game, source); } } return true; diff --git a/Mage.Sets/src/mage/cards/h/HuntingGrounds.java b/Mage.Sets/src/mage/cards/h/HuntingGrounds.java index 3e03f591a5..de57563194 100644 --- a/Mage.Sets/src/mage/cards/h/HuntingGrounds.java +++ b/Mage.Sets/src/mage/cards/h/HuntingGrounds.java @@ -33,7 +33,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.condition.common.CardsInControllerGraveCondition; import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -53,7 +53,7 @@ public class HuntingGrounds extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}{W}"); // Threshold - As long as seven or more cards are in your graveyard, Hunting Grounds has "Whenever an opponent casts a spell, you may put a creature card from your hand onto the battlefield." - Ability gainedAbility = new SpellCastOpponentTriggeredAbility(new PutPermanentOnBattlefieldEffect( + Ability gainedAbility = new SpellCastOpponentTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect( new FilterCreatureCard("a creature card")), true); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), diff --git a/Mage.Sets/src/mage/cards/i/Incoming.java b/Mage.Sets/src/mage/cards/i/Incoming.java index 2ad9b51cc7..f00eadbf6e 100644 --- a/Mage.Sets/src/mage/cards/i/Incoming.java +++ b/Mage.Sets/src/mage/cards/i/Incoming.java @@ -30,9 +30,9 @@ package mage.cards.i; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -101,13 +101,7 @@ class IncomingEffect extends OneShotEffect { if (player != null) { TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, filter); if (player.searchLibrary(target, game)) { - for (UUID cardId : target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); - if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId(), true); - } - - } + player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game); player.shuffleLibrary(source, game); } } diff --git a/Mage.Sets/src/mage/cards/i/IntoTheWilds.java b/Mage.Sets/src/mage/cards/i/IntoTheWilds.java index 27b2f15ba9..f64cd9c128 100644 --- a/Mage.Sets/src/mage/cards/i/IntoTheWilds.java +++ b/Mage.Sets/src/mage/cards/i/IntoTheWilds.java @@ -34,13 +34,11 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.players.Player; @@ -51,10 +49,9 @@ import mage.players.Player; public class IntoTheWilds extends CardImpl { public IntoTheWilds(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); - - // At the beginning of your upkeep, look at the top card of your library. If it's a land card, you may put it onto the battlefield. + // At the beginning of your upkeep, look at the top card of your library. If it's a land card, you may put it onto the battlefield. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new IntoTheWildsEffect(), TargetController.YOU, false)); } @@ -71,8 +68,6 @@ public class IntoTheWilds extends CardImpl { class IntoTheWildsEffect extends OneShotEffect { - private final static FilterLandCard filter = new FilterLandCard(); - public IntoTheWildsEffect() { super(Outcome.PutLandInPlay); this.staticText = "look at the top card of your library. If it's a land card, you may put it onto the battlefield"; @@ -89,20 +84,18 @@ class IntoTheWildsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } - Card card = player.getLibrary().getFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - Cards cards = new CardsImpl(); - cards.add(card); - player.lookAtCards("Into the Wilds", cards, game); - if (filter.match(card, game)) { + controller.lookAtCards(source, "", new CardsImpl(card), game); + if (card.isLand()) { String message = "Put " + card.getName() + " onto the battlefield?"; - if (player.chooseUse(outcome, message, source, game)) { - return card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId(), false); + if (controller.chooseUse(outcome, message, source, game)) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game); } } } diff --git a/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java b/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java index 2d8ff4b391..bbe0b97502 100644 --- a/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java +++ b/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java @@ -31,12 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.StaticFilters; /** * @@ -45,14 +46,15 @@ import mage.constants.Zone; public class KrosanWayfarer extends CardImpl { public KrosanWayfarer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.DRUID); this.power = new MageInt(1); this.toughness = new MageInt(1); // Sacrifice Krosan Wayfarer: You may put a land card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new SacrificeSourceCost())); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new SacrificeSourceCost())); } public KrosanWayfarer(final KrosanWayfarer card) { diff --git a/Mage.Sets/src/mage/cards/k/Kudzu.java b/Mage.Sets/src/mage/cards/k/Kudzu.java index 398a081c93..7ceb1215dc 100644 --- a/Mage.Sets/src/mage/cards/k/Kudzu.java +++ b/Mage.Sets/src/mage/cards/k/Kudzu.java @@ -37,10 +37,9 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.Filter; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -120,22 +119,18 @@ class KudzuEffect extends OneShotEffect { Permanent landChosen = game.getPermanent(target.getFirstTarget()); if (landChosen != null) { for (Target targetTest : kudzuCard.getSpellAbility().getTargets()) { - Filter filterTest = targetTest.getFilter(); - if (filterTest.match(landChosen, game)) { - if (game.getBattlefield().containsPermanent(landChosen.getId())) { //verify that it is still on the battlefield - game.getState().setValue("attachTo:" + kudzuCard.getId(), landChosen); - Zone zone = game.getState().getZone(kudzuCard.getId()); - kudzuCard.putOntoBattlefield(game, zone, source.getSourceId(), controller.getId()); - return landChosen.addAttachment(kudzuCard.getId(), game); - } + if (targetTest.getFilter().match(landChosen, game)) { + landChosen.addAttachment(kudzu.getId(), game); } } } } } } + } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java index 93bf9c481e..55c77da720 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java @@ -34,7 +34,6 @@ import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -43,7 +42,7 @@ import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.CounterPredicate; import mage.game.Game; @@ -111,11 +110,9 @@ class LilianaDeathWielderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null){ - for (Card card : player.getGraveyard().getCards(new FilterCreatureCard(), game)) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.moveCards(controller.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game), Zone.BATTLEFIELD, source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/l/LlanowarScout.java b/Mage.Sets/src/mage/cards/l/LlanowarScout.java index abd1722d94..46332c0816 100644 --- a/Mage.Sets/src/mage/cards/l/LlanowarScout.java +++ b/Mage.Sets/src/mage/cards/l/LlanowarScout.java @@ -31,12 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.StaticFilters; /** * @@ -53,7 +54,8 @@ public class LlanowarScout extends CardImpl { this.toughness = new MageInt(3); // {T}: You may put a land card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new TapSourceCost())); } public LlanowarScout(final LlanowarScout card) { diff --git a/Mage.Sets/src/mage/cards/l/LoamDweller.java b/Mage.Sets/src/mage/cards/l/LoamDweller.java index 2f338e36cc..a8899d21da 100644 --- a/Mage.Sets/src/mage/cards/l/LoamDweller.java +++ b/Mage.Sets/src/mage/cards/l/LoamDweller.java @@ -30,7 +30,7 @@ package mage.cards.l; import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -44,14 +44,16 @@ import mage.filter.StaticFilters; public class LoamDweller extends CardImpl { public LoamDweller(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); // Whenever you cast a Spirit or Arcane spell, you may put a land card from your hand onto the battlefield tapped. - this.addAbility(new SpellCastControllerTriggeredAbility(new PutLandFromHandOntoBattlefieldEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); + this.addAbility(new SpellCastControllerTriggeredAbility( + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A, false, true), + StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public LoamDweller(final LoamDweller card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalCathar.java b/Mage.Sets/src/mage/cards/l/LoyalCathar.java index e0805cb145..dbad114028 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalCathar.java +++ b/Mage.Sets/src/mage/cards/l/LoyalCathar.java @@ -32,6 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.VigilanceAbility; @@ -40,11 +41,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.u.UnhallowedCathar; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; /** * @@ -53,7 +55,7 @@ import mage.game.permanent.Permanent; public class LoyalCathar extends CardImpl { public LoyalCathar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); @@ -96,8 +98,11 @@ class LoyalCatharEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { //create delayed triggered ability - AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnLoyalCatharEffect(source.getSourceId())); - game.addDelayedTriggeredAbility(delayedAbility, source); + if (Zone.GRAVEYARD == game.getState().getZone(source.getSourceId())) { + Effect effect = new ReturnLoyalCatharEffect(); + effect.setTargetPointer(new FixedTarget(source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId()))); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); + } return true; } @@ -110,17 +115,13 @@ class LoyalCatharEffect extends OneShotEffect { class ReturnLoyalCatharEffect extends OneShotEffect { - private UUID cardId; - - public ReturnLoyalCatharEffect(UUID cardId) { + public ReturnLoyalCatharEffect() { super(Outcome.PutCardInPlay); - this.cardId = cardId; this.staticText = "return it to the battlefield transformed under your control"; } public ReturnLoyalCatharEffect(final ReturnLoyalCatharEffect effect) { super(effect); - this.cardId = effect.cardId; } @Override @@ -130,16 +131,16 @@ class ReturnLoyalCatharEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Card card = game.getCard(cardId); - if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - Permanent perm = game.getPermanent(cardId); - if (perm != null && perm.isTransformable()) { - perm.transform(game); - return true; - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; } - return false; + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (card != null) { + game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + card.getId(), Boolean.TRUE); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/m/MasterTransmuter.java b/Mage.Sets/src/mage/cards/m/MasterTransmuter.java index c9e2b9359b..bf144ba75f 100644 --- a/Mage.Sets/src/mage/cards/m/MasterTransmuter.java +++ b/Mage.Sets/src/mage/cards/m/MasterTransmuter.java @@ -34,7 +34,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -59,7 +59,7 @@ public class MasterTransmuter extends CardImpl { this.toughness = new MageInt(2); // {U}, {tap}, Return an artifact you control to its owner's hand: You may put an artifact card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(new FilterArtifactCard("an artifact card")), new ManaCostsImpl("{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(new FilterArtifactCard("an artifact card")), new ManaCostsImpl("{U}")); ability.addCost(new TapSourceCost()); ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/m/MatterReshaper.java b/Mage.Sets/src/mage/cards/m/MatterReshaper.java index 8a7f6aef6c..e1e8536734 100644 --- a/Mage.Sets/src/mage/cards/m/MatterReshaper.java +++ b/Mage.Sets/src/mage/cards/m/MatterReshaper.java @@ -29,7 +29,6 @@ package mage.cards.m; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -38,9 +37,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; @@ -54,7 +53,7 @@ import mage.players.Player; public class MatterReshaper extends CardImpl { public MatterReshaper(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{C}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{C}"); this.subtype.add(SubType.ELDRAZI); this.power = new MageInt(3); this.toughness = new MageInt(2); @@ -89,22 +88,20 @@ class MatterReshaperEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null && controller.getLibrary().hasCards()) { + if (controller != null) { Card card = controller.getLibrary().getFromTop(game); if (card == null) { - return false; - } - controller.revealCards(sourceObject.getIdName(), new CardsImpl(card), game); - FilterPermanentCard filter = new FilterPermanentCard("permanent card with converted mana cost 3 or less"); - filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 4)); - if (filter.match(card, game)) { - if (controller.chooseUse(Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield (otherwise put in hand)?", source, game)) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId(), false); - return true; + controller.revealCards(source, new CardsImpl(card), game); + FilterPermanentCard filter = new FilterPermanentCard("permanent card with converted mana cost 3 or less"); + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 4)); + if (filter.match(card, game)) { + if (controller.chooseUse(Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield (otherwise put in hand)?", source, game)) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + return true; + } } + controller.moveCards(card, Zone.HAND, source, game); } - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/m/MindwrackLiege.java b/Mage.Sets/src/mage/cards/m/MindwrackLiege.java index e2deb019e0..3bb93115b2 100644 --- a/Mage.Sets/src/mage/cards/m/MindwrackLiege.java +++ b/Mage.Sets/src/mage/cards/m/MindwrackLiege.java @@ -33,7 +33,7 @@ import mage.ObjectColor; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -81,7 +81,7 @@ public class MindwrackLiege extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter2, true))); // {UR}{UR}{UR}{UR}: You may put a blue or red creature card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter3), new ManaCostsImpl("{U/R}{U/R}{U/R}{U/R}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter3), new ManaCostsImpl("{U/R}{U/R}{U/R}{U/R}"))); } public MindwrackLiege(final MindwrackLiege card) { diff --git a/Mage.Sets/src/mage/cards/m/MoldgrafMonstrosity.java b/Mage.Sets/src/mage/cards/m/MoldgrafMonstrosity.java index 4eaef9de47..781181f75b 100644 --- a/Mage.Sets/src/mage/cards/m/MoldgrafMonstrosity.java +++ b/Mage.Sets/src/mage/cards/m/MoldgrafMonstrosity.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -39,14 +38,15 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; -import mage.util.RandomUtil; /** * @@ -98,34 +98,21 @@ class MoldgrafMonstrosityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean returned = false; - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - Set<Card> cards = player.getGraveyard().getCards(new FilterCreatureCard("creature cards"), game); - + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards possibleCards = new CardsImpl(controller.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game)); + // Set<Card> cards = controller.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game); + Cards toBattlefield = new CardsImpl(); for (int i = 0; i < 2; i++) { - Card card = getRandomCard(cards); + Card card = possibleCards.getRandom(game); if (card != null) { - returned |= card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - cards.remove(card); + toBattlefield.add(card); + possibleCards.remove(card); } } + controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + return true; } - return returned; - } - - private Card getRandomCard(Set<Card> cards) { - if (cards == null || cards.size() < 1) { - return null; - } - int i = 0; - int pick = RandomUtil.nextInt(cards.size()); - for (Card card : cards) { - if (i == pick) { - return card; - } - i = i + 1; - } - return null; + return false; } } diff --git a/Mage.Sets/src/mage/cards/n/NettlevineBlight.java b/Mage.Sets/src/mage/cards/n/NettlevineBlight.java index 23a52cc2af..17b7bb3c3e 100644 --- a/Mage.Sets/src/mage/cards/n/NettlevineBlight.java +++ b/Mage.Sets/src/mage/cards/n/NettlevineBlight.java @@ -40,7 +40,6 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -134,10 +133,7 @@ class NettlevineBlightEffect extends OneShotEffect { if (chosenPermanent != null) { Card nettlevineBlightCard = game.getCard(source.getSourceId()); if (nettlevineBlightCard != null) { - Zone zone = game.getState().getZone(nettlevineBlightCard.getId()); - nettlevineBlightCard.putOntoBattlefield(game, zone, source.getSourceId(), newController.getId()); - game.getState().setValue("attachTo:" + nettlevineBlight.getId(), chosenPermanent); - chosenPermanent.addAttachment(nettlevineBlight.getId(), game); + nettlevineBlight.attachTo(chosenPermanent.getId(), game); return true; } } diff --git a/Mage.Sets/src/mage/cards/n/NewFrontiers.java b/Mage.Sets/src/mage/cards/n/NewFrontiers.java index 246b24e817..9311f5aad7 100644 --- a/Mage.Sets/src/mage/cards/n/NewFrontiers.java +++ b/Mage.Sets/src/mage/cards/n/NewFrontiers.java @@ -29,7 +29,6 @@ package mage.cards.n; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -41,6 +40,7 @@ import mage.players.Player; import mage.target.common.TargetCardInLibrary; import java.util.UUID; +import mage.cards.CardsImpl; /** * @@ -86,18 +86,12 @@ class NewFrontiersEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { int amount = source.getManaCostsToPay().getX(); - for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); - if (player != null) { + if (player != null && player.chooseUse(outcome, "Search your library for up to " + amount + " basic lands?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(0, amount, StaticFilters.FILTER_BASIC_LAND_CARD); if (player.searchLibrary(target, game)) { - for (UUID cardId : target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); - if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId(), true); - } - } + player.moveCards(new CardsImpl(target.getTargets()).getCards(game), Zone.BATTLEFIELD, source, game, true, false, false, null); player.shuffleLibrary(source, game); } diff --git a/Mage.Sets/src/mage/cards/n/NissaStewardOfElements.java b/Mage.Sets/src/mage/cards/n/NissaStewardOfElements.java index 1b827c9bdb..d0f6e2b096 100644 --- a/Mage.Sets/src/mage/cards/n/NissaStewardOfElements.java +++ b/Mage.Sets/src/mage/cards/n/NissaStewardOfElements.java @@ -51,7 +51,6 @@ import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.TargetPermanent; @@ -117,8 +116,8 @@ class NissaStewardOfElementsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } int count = 1 + new CountersSourceCount(CounterType.LOYALTY).calculate(game, source, this); @@ -126,15 +125,12 @@ class NissaStewardOfElementsEffect extends OneShotEffect { filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, count)); - Card card = player.getLibrary().getFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - Cards cards = new CardsImpl(); - cards.add(card); - player.lookAtCards("Nissa, Steward of Elements", cards, game); + controller.lookAtCards(source, null, new CardsImpl(card), game); if (filter.match(card, game)) { - String message = "Put " + card.getName() + " onto the battlefield?"; - if (player.chooseUse(outcome, message, source, game)) { - return card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId(), false); + if (controller.chooseUse(outcome, "Put " + card.getName() + " onto the battlefield?", source, game)) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game); } } } @@ -153,6 +149,7 @@ class NissaStewardOfElementsToken extends TokenImpl { this.addAbility(FlyingAbility.getInstance()); this.addAbility(HasteAbility.getInstance()); } + public NissaStewardOfElementsToken(final NissaStewardOfElementsToken token) { super(token); } diff --git a/Mage.Sets/src/mage/cards/n/NissasPilgrimage.java b/Mage.Sets/src/mage/cards/n/NissasPilgrimage.java index 9b6ba2b1dc..34f5209ced 100644 --- a/Mage.Sets/src/mage/cards/n/NissasPilgrimage.java +++ b/Mage.Sets/src/mage/cards/n/NissasPilgrimage.java @@ -40,10 +40,11 @@ import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterBasicLandCard; import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; @@ -55,7 +56,7 @@ import mage.target.common.TargetCardInLibrary; public class NissasPilgrimage extends CardImpl { public NissasPilgrimage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library. // <i>Spell Mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two. @@ -74,9 +75,10 @@ public class NissasPilgrimage extends CardImpl { class NissasPilgrimageEffect extends OneShotEffect { - private static final FilterCard filter = new FilterBasicLandCard("basic Forest"); + private static final FilterCard filter = new FilterCard("basic Forest card"); static { + filter.add(new SupertypePredicate(SuperType.BASIC)); filter.add(new SubtypePredicate(SubType.FOREST)); } diff --git a/Mage.Sets/src/mage/cards/n/NomadMythmaker.java b/Mage.Sets/src/mage/cards/n/NomadMythmaker.java index 70540ac8fb..1ebff537f7 100644 --- a/Mage.Sets/src/mage/cards/n/NomadMythmaker.java +++ b/Mage.Sets/src/mage/cards/n/NomadMythmaker.java @@ -110,8 +110,7 @@ class NomadMythmakerEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Card aura = game.getCard(source.getFirstTarget()); - if (controller == null - || aura == null) { + if (controller == null || aura == null) { return false; } FilterControlledCreaturePermanent FILTER = new FilterControlledCreaturePermanent("Choose a creature you control"); @@ -122,7 +121,7 @@ class NomadMythmakerEffect extends OneShotEffect { if (permanent != null && !permanent.cantBeAttachedBy(aura, game)) { game.getState().setValue("attachTo:" + aura.getId(), permanent); - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return permanent.addAttachment(aura.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/n/NorwoodPriestess.java b/Mage.Sets/src/mage/cards/n/NorwoodPriestess.java index 50e5f25441..e6575475f0 100644 --- a/Mage.Sets/src/mage/cards/n/NorwoodPriestess.java +++ b/Mage.Sets/src/mage/cards/n/NorwoodPriestess.java @@ -33,7 +33,7 @@ import mage.ObjectColor; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.condition.common.MyTurnBeforeAttackersDeclaredCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -64,7 +64,7 @@ public class NorwoodPriestess extends CardImpl { // {tap}: You may put a green creature card from your hand onto the battlefield. Activate this ability only during your turn, before attackers are declared. this.addAbility(new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(filter), + new PutCardFromHandOntoBattlefieldEffect(filter), new TapSourceCost(), MyTurnBeforeAttackersDeclaredCondition.instance )); diff --git a/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java b/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java index a49ff3ea02..b702c28489 100644 --- a/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java +++ b/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java @@ -48,13 +48,13 @@ import mage.players.Player; import mage.target.common.TargetCardInHand; /** - * + * * @author Rafbill */ public class PreeminentCaptain extends CardImpl { public PreeminentCaptain(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.KITHKIN); this.subtype.add(SubType.SOLDIER); @@ -96,20 +96,22 @@ class PreeminentCaptainEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); TargetCardInHand target = new TargetCardInHand(filter); - if (target.canChoose(player.getId(), game) && target.choose(getOutcome(), player.getId(), source.getSourceId(), game)) { + if (target.canChoose(controller.getId(), game) && target.choose(getOutcome(), controller.getId(), source.getSourceId(), game)) { if (!target.getTargets().isEmpty()) { UUID cardId = target.getFirstTarget(); - Card card = player.getHand().get(cardId, game); + Card card = controller.getHand().get(cardId, game); if (card != null) { - if (card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId(), true)) { + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { Permanent permanent = game.getPermanent(card.getId()); - game.getCombat().addAttackingCreature(permanent.getId(), game); + if (permanent != null) { + game.getCombat().addAttackingCreature(permanent.getId(), game); + } } } - return true; } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java b/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java index 9e1963d270..8c6713e7e5 100644 --- a/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java +++ b/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java @@ -5,7 +5,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.LegendarySpellAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -15,8 +14,7 @@ import mage.game.Game; import mage.players.Player; /** - * @author JRHerlehy - * Created on 4/8/18. + * @author JRHerlehy Created on 4/8/18. */ public class PrimevalsGloriousRebirth extends CardImpl { @@ -61,11 +59,10 @@ class PrimevalsGloriousRebirthEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (Card card : player.getGraveyard().getCards(filter, game)) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/p/PyrrhicRevival.java b/Mage.Sets/src/mage/cards/p/PyrrhicRevival.java index 3110ce8a5c..f286c90362 100644 --- a/Mage.Sets/src/mage/cards/p/PyrrhicRevival.java +++ b/Mage.Sets/src/mage/cards/p/PyrrhicRevival.java @@ -27,20 +27,25 @@ */ package mage.cards.p; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.EntersBattlefieldEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.targetpointer.FixedTarget; /** * @@ -50,8 +55,7 @@ import mage.players.Player; public class PyrrhicRevival extends CardImpl { public PyrrhicRevival(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{W/B}{W/B}{W/B}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W/B}{W/B}{W/B}"); // Each player returns each creature card from their graveyard to the battlefield with an additional -1/-1 counter on it. this.getSpellAbility().addEffect(new PyrrhicRevivalEffect()); @@ -86,23 +90,26 @@ class PyrrhicRevivalEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean result = false; - for (Player player : game.getPlayers().values()) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Set<Card> toBattlefield = new HashSet<>(); + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); if (player != null) { - Cards cards = player.getGraveyard(); - for (Card card : cards.getCards(game)) { + for (Card card : player.getGraveyard().getCards(game)) { if (card != null && card.isCreature()) { - if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), card.getOwnerId(), false)) { - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - permanent.addCounters(CounterType.M1M1.createInstance(), source, game); - } - result = true; - } + toBattlefield.add(card); + ContinuousEffect effect = new EntersBattlefieldEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance())); + effect.setDuration(Duration.OneUse); + effect.setTargetPointer(new FixedTarget(card.getId())); + game.addEffect(effect, source); } } } } - return result; + controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game, false, false, true, null); + return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java b/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java index 3d0a9b608e..dfdcbd7ecb 100644 --- a/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java +++ b/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java @@ -31,7 +31,9 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -47,7 +49,6 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.common.TargetCardInHand; /** * @@ -56,13 +57,19 @@ import mage.target.common.TargetCardInHand; public class QuestForUlasTemple extends CardImpl { public QuestForUlasTemple(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); // At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for Ula's Temple. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new QuestForUlasTempleEffect(), TargetController.YOU, true)); // At the beginning of each end step, if there are three or more quest counters on Quest for Ula's Temple, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield. - this.addAbility(new QuestForUlasTempleTriggeredAbility()); + FilterCreatureCard filter = new FilterCreatureCard("Kraken, Leviathan, Octopus, or Serpent creature card"); + filter.add(Predicates.or( + new SubtypePredicate(SubType.KRAKEN), + new SubtypePredicate(SubType.LEVIATHAN), + new SubtypePredicate(SubType.OCTOPUS), + new SubtypePredicate(SubType.SERPENT))); + this.addAbility(new QuestForUlasTempleTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter))); } public QuestForUlasTemple(final QuestForUlasTemple card) { @@ -116,8 +123,8 @@ class QuestForUlasTempleEffect extends OneShotEffect { class QuestForUlasTempleTriggeredAbility extends TriggeredAbilityImpl { - public QuestForUlasTempleTriggeredAbility() { - super(Zone.BATTLEFIELD, new QuestForUlasTempleEffect2(), true); + public QuestForUlasTempleTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, true); } public QuestForUlasTempleTriggeredAbility(final QuestForUlasTempleTriggeredAbility ability) { @@ -142,50 +149,6 @@ class QuestForUlasTempleTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "At the beginning of each end step, if there are three or more quest counters on {this}, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield."; - } -} - -class QuestForUlasTempleEffect2 extends OneShotEffect { - - private static final String query = "Do you want to put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield?"; - private static final FilterCreatureCard filter = new FilterCreatureCard("Kraken, Leviathan, Octopus, or Serpent creature card from your hand"); - - static { - filter.add(Predicates.or( - new SubtypePredicate(SubType.KRAKEN), - new SubtypePredicate(SubType.LEVIATHAN), - new SubtypePredicate(SubType.OCTOPUS), - new SubtypePredicate(SubType.SERPENT))); - } - - QuestForUlasTempleEffect2() { - super(Outcome.PutCreatureInPlay); - } - - QuestForUlasTempleEffect2(final QuestForUlasTempleEffect2 effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - TargetCardInHand target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), controller.getId(), game) - && controller.chooseUse(Outcome.PutCreatureInPlay, query, source, game)) { - if (controller.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - } - } - return true; - } - return false; - } - - @Override - public QuestForUlasTempleEffect2 copy() { - return new QuestForUlasTempleEffect2(this); + return "At the beginning of each end step, if there are three or more quest counters on {this}, " + super.getRule(); } } diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverAmulet.java b/Mage.Sets/src/mage/cards/q/QuicksilverAmulet.java index fc31254cc6..bd640c680e 100644 --- a/Mage.Sets/src/mage/cards/q/QuicksilverAmulet.java +++ b/Mage.Sets/src/mage/cards/q/QuicksilverAmulet.java @@ -31,12 +31,12 @@ import java.util.UUID; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; /** * @@ -45,11 +45,11 @@ import mage.filter.common.FilterCreatureCard; public class QuicksilverAmulet extends CardImpl { public QuicksilverAmulet(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // {4}, {tap}: You may put a creature card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), new ManaCostsImpl("{4}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -64,5 +64,3 @@ public class QuicksilverAmulet extends CardImpl { return new QuicksilverAmulet(this); } } - - diff --git a/Mage.Sets/src/mage/cards/r/Reincarnation.java b/Mage.Sets/src/mage/cards/r/Reincarnation.java index 9c61c9a692..ed717e6238 100644 --- a/Mage.Sets/src/mage/cards/r/Reincarnation.java +++ b/Mage.Sets/src/mage/cards/r/Reincarnation.java @@ -57,7 +57,7 @@ import mage.target.common.TargetCreaturePermanent; public class Reincarnation extends CardImpl { public Reincarnation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}{G}"); // Choose target creature. When that creature dies this turn, return a creature card from its owner's graveyard to the battlefield under the control of that creature's owner. this.getSpellAbility().addEffect(new ReincarnationEffect()); @@ -141,7 +141,7 @@ class ReincarnationDelayedTriggeredAbility extends DelayedTriggeredAbility { class ReincarnationDelayedEffect extends OneShotEffect { - private UUID target; + private final UUID target; public ReincarnationDelayedEffect(UUID target) { super(Outcome.Detriment); @@ -166,14 +166,14 @@ class ReincarnationDelayedEffect extends OneShotEffect { if (permanent != null && controller != null) { Player player = game.getPlayer(permanent.getOwnerId()); if (player != null) { - FilterCreatureCard filter = new FilterCreatureCard(new StringBuilder("a creature card from ").append(player.getLogName()).append("'s graveyard").toString()); + FilterCreatureCard filter = new FilterCreatureCard("a creature card from " + player.getName() + "'s graveyard"); filter.add(new OwnerIdPredicate(player.getId())); Target targetCreature = new TargetCardInGraveyard(filter); if (targetCreature.canChoose(source.getSourceId(), controller.getId(), game) && controller.chooseTarget(outcome, targetCreature, source, game)) { Card card = game.getCard(targetCreature.getFirstTarget()); if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { - return card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); + controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null); } } return true; diff --git a/Mage.Sets/src/mage/cards/r/ReinsOfTheVinesteed.java b/Mage.Sets/src/mage/cards/r/ReinsOfTheVinesteed.java index 837efc634a..e59c361311 100644 --- a/Mage.Sets/src/mage/cards/r/ReinsOfTheVinesteed.java +++ b/Mage.Sets/src/mage/cards/r/ReinsOfTheVinesteed.java @@ -27,6 +27,9 @@ */ package mage.cards.r; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; @@ -49,10 +52,6 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - /** * * @author jeffwadsworth @@ -60,7 +59,7 @@ import java.util.UUID; public class ReinsOfTheVinesteed extends CardImpl { public ReinsOfTheVinesteed(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); this.subtype.add(SubType.AURA); // Enchant creature @@ -127,7 +126,7 @@ class ReinsOfTheVinesteedEffect extends OneShotEffect { Permanent targetPermanent = game.getPermanent(target.getFirstTarget()); if (!targetPermanent.cantBeAttachedBy(aura, game)) { game.getState().setValue("attachTo:" + aura.getId(), targetPermanent); - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return targetPermanent.addAttachment(aura.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/r/Restore.java b/Mage.Sets/src/mage/cards/r/Restore.java index 804ab78032..f05738b2bc 100644 --- a/Mage.Sets/src/mage/cards/r/Restore.java +++ b/Mage.Sets/src/mage/cards/r/Restore.java @@ -51,8 +51,7 @@ public class Restore extends CardImpl { private static final FilterLandCard filter = new FilterLandCard(); public Restore(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}"); // Put target land card from a graveyard onto the battlefield under your control. this.getSpellAbility().addEffect(new RestoreEffect()); @@ -91,7 +90,8 @@ class RestoreEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Card land = game.getCard(this.getTargetPointer().getFirst(game, source)); if (controller != null && game.getState().getZone(land.getId()) == Zone.GRAVEYARD) { - return land.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); + controller.moveCards(land, Zone.BATTLEFIELD, source, game); + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/r/Retether.java b/Mage.Sets/src/mage/cards/r/Retether.java index beab992681..22efa8b76c 100644 --- a/Mage.Sets/src/mage/cards/r/Retether.java +++ b/Mage.Sets/src/mage/cards/r/Retether.java @@ -58,7 +58,7 @@ import mage.target.Target; public class Retether extends CardImpl { public Retether(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}"); // Return each Aura card from your graveyard to the battlefield. Only creatures can be enchanted this way. this.getSpellAbility().addEffect(new RetetherEffect()); @@ -108,7 +108,7 @@ class RetetherEffect extends OneShotEffect { FilterCreaturePermanent filter = new FilterCreaturePermanent("creature to enchant (" + aura.getLogName() + ')'); filter.add(new CanBeEnchantedByPredicate(aura)); Target target = null; - + auraLegalitySearch: for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, playerId, game)) { @@ -135,6 +135,7 @@ class RetetherEffect extends OneShotEffect { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null && !permanent.cantBeAttachedBy(aura, game)) { auraMap.put(aura, permanent); + game.getState().setValue("attachTo:" + aura.getId(), permanent); continue auraCardsInGraveyard; } } @@ -143,17 +144,12 @@ class RetetherEffect extends OneShotEffect { game.informPlayers("No valid creature targets for " + aura.getLogName()); } } + controller.moveCards(auraMap.keySet(), Zone.BATTLEFIELD, source, game); for (Entry<Card, Permanent> entry : auraMap.entrySet()) { Card aura = entry.getKey(); Permanent permanent = entry.getValue(); - if (aura != null) { - if (permanent != null) { - game.getState().setValue("attachTo:" + aura.getId(), permanent); - } - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); - if (permanent != null) { - permanent.addAttachment(aura.getId(), game); - } + if (aura != null && permanent != null) { + permanent.addAttachment(aura.getId(), game); } } return true; diff --git a/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java b/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java index e4fc525b19..0883601d9d 100644 --- a/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java +++ b/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java @@ -30,7 +30,6 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -79,7 +78,7 @@ class ReturnOfTheNightstalkersEffect extends OneShotEffect { public ReturnOfTheNightstalkersEffect() { super(Outcome.PutCreatureInPlay); - staticText = "Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control."; + staticText = "Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control"; } public ReturnOfTheNightstalkersEffect(final ReturnOfTheNightstalkersEffect effect) { @@ -93,15 +92,14 @@ class ReturnOfTheNightstalkersEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (Card card : player.getGraveyard().getCards(filter1, game)) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.moveCards(controller.getGraveyard().getCards(filter1, game), Zone.BATTLEFIELD, source, game); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter2, source.getControllerId(), source.getSourceId(), game)) { permanent.destroy(source.getSourceId(), game, false); } + return true; } - return true; + return false; } } diff --git a/Mage.Sets/src/mage/cards/r/RoarOfReclamation.java b/Mage.Sets/src/mage/cards/r/RoarOfReclamation.java index 2e343879e4..fbf9ab2513 100644 --- a/Mage.Sets/src/mage/cards/r/RoarOfReclamation.java +++ b/Mage.Sets/src/mage/cards/r/RoarOfReclamation.java @@ -30,14 +30,12 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterArtifactCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; @@ -48,7 +46,7 @@ import mage.players.Player; public class RoarOfReclamation extends CardImpl { public RoarOfReclamation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{5}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{W}{W}"); // Each player returns all artifact cards from their graveyard to the battlefield. this.getSpellAbility().addEffect(new RoarOfReclamationEffect()); @@ -65,7 +63,7 @@ public class RoarOfReclamation extends CardImpl { } class RoarOfReclamationEffect extends OneShotEffect { - + public RoarOfReclamationEffect() { super(Outcome.PutCardInPlay); staticText = "Each player returns all artifact cards from their graveyard to the battlefield"; @@ -82,19 +80,12 @@ class RoarOfReclamationEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean result = true; - for (Player player : game.getPlayers().values()) { + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); if (player != null) { - Cards cards = player.getGraveyard(); - for (Card card : cards.getCards(new FilterArtifactCard(), game)) { - if (card != null) { - if (!card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), card.getOwnerId(), false)) { - result = false; - } - } - } + player.moveCards(player.getGraveyard().getCards(StaticFilters.FILTER_CARD_ARTIFACT, game), Zone.BATTLEFIELD, source, game); } } - return result; + return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RootElemental.java b/Mage.Sets/src/mage/cards/r/RootElemental.java index 1a1c59270a..c73e690a8a 100644 --- a/Mage.Sets/src/mage/cards/r/RootElemental.java +++ b/Mage.Sets/src/mage/cards/r/RootElemental.java @@ -31,13 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; /** * @@ -46,7 +46,7 @@ import mage.filter.common.FilterCreatureCard; public class RootElemental extends CardImpl { public RootElemental(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add(SubType.ELEMENTAL); this.power = new MageInt(6); this.toughness = new MageInt(5); @@ -54,7 +54,7 @@ public class RootElemental extends CardImpl { // Morph {5}{G}{G} this.addAbility(new MorphAbility(this, new ManaCostsImpl("{5}{G}{G}"))); // When Root Elemental is turned face up, you may put a creature card from your hand onto the battlefield. - this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")))); + this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A))); } public RootElemental(final RootElemental card) { diff --git a/Mage.Sets/src/mage/cards/s/SakuraTribeScout.java b/Mage.Sets/src/mage/cards/s/SakuraTribeScout.java index 0104db981f..5e297bd67e 100644 --- a/Mage.Sets/src/mage/cards/s/SakuraTribeScout.java +++ b/Mage.Sets/src/mage/cards/s/SakuraTribeScout.java @@ -31,12 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.StaticFilters; /** * @@ -45,7 +46,7 @@ import mage.constants.Zone; public class SakuraTribeScout extends CardImpl { public SakuraTribeScout(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.SNAKE); this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.SCOUT); @@ -54,7 +55,8 @@ public class SakuraTribeScout extends CardImpl { this.toughness = new MageInt(1); // {tap}: You may put a land card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new TapSourceCost())); } public SakuraTribeScout(final SakuraTribeScout card) { diff --git a/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java b/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java index 45e1b12a58..af68d9e413 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfDarkness.java @@ -39,8 +39,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -56,7 +56,7 @@ import mage.target.common.TargetCardInGraveyard; public class ScionOfDarkness extends CardImpl { public ScionOfDarkness(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}"); this.subtype.add(SubType.AVATAR); this.power = new MageInt(6); @@ -102,20 +102,22 @@ class ScionOfDarknessEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player damagedPlayer = game.getPlayer(targetPointer.getFirst(game, source)); - Player you = game.getPlayer(source.getControllerId()); - FilterCard filter = new FilterCard("creature in that player's graveyard"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null || damagedPlayer == null) { + return false; + } + FilterCard filter = new FilterCard("creature in " + damagedPlayer.getName() + "'s graveyard"); filter.add(new CardTypePredicate(CardType.CREATURE)); filter.add(new OwnerIdPredicate(damagedPlayer.getId())); TargetCardInGraveyard target = new TargetCardInGraveyard(filter); - if (target.canChoose(source.getSourceId(), you.getId(), game)) { - if (you.chooseTarget(Outcome.PutCreatureInPlay, target, source, game)) { + if (target.canChoose(source.getSourceId(), controller.getId(), game)) { + if (controller.chooseTarget(Outcome.PutCreatureInPlay, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), you.getId()); - return true; + controller.moveCards(card, Zone.BATTLEFIELD, source, game); } } } - return false; + return true; } } diff --git a/Mage.Sets/src/mage/cards/s/SettleTheWreckage.java b/Mage.Sets/src/mage/cards/s/SettleTheWreckage.java index 11392ad722..704c74f141 100644 --- a/Mage.Sets/src/mage/cards/s/SettleTheWreckage.java +++ b/Mage.Sets/src/mage/cards/s/SettleTheWreckage.java @@ -27,13 +27,16 @@ */ package mage.cards.s; +import java.util.HashSet; import java.util.Iterator; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -87,28 +90,27 @@ class SettleTheWreckageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getFirstTarget()); - if (player != null) { - int attackers = 0; - Iterator<UUID> creatureIds = game.getCombat().getAttackers().iterator(); - while (creatureIds.hasNext()) { - Permanent creature = game.getPermanent(creatureIds.next()); - if (creature != null && creature.getControllerId().equals(player.getId())) { - creature.moveToExile(null, null, source.getId(), game); - attackers++; - } - } - TargetCardInLibrary target = new TargetCardInLibrary(0, attackers, StaticFilters.FILTER_BASIC_LAND_CARD); - if (player.chooseUse(Outcome.Benefit, "Search for up to " + attackers + " basic land" + ((attackers == 1) ? "" : "s") + "?", source, game) && player.searchLibrary(target, game)) { - for (UUID cardId : target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); - if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId(), true); - } - } - player.shuffleLibrary(source, game); - } - return true; + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null || player == null) { + return false; } - return false; + int attackers = 0; + Set<Card> toExile = new HashSet<>(); + Iterator<UUID> creatureIds = game.getCombat().getAttackers().iterator(); + while (creatureIds.hasNext()) { + Permanent creature = game.getPermanent(creatureIds.next()); + if (creature != null && creature.getControllerId().equals(player.getId())) { + toExile.add(creature); + attackers++; + } + } + controller.moveCards(toExile, Zone.EXILED, source, game); + TargetCardInLibrary target = new TargetCardInLibrary(0, attackers, StaticFilters.FILTER_BASIC_LAND_CARD); + if (player.chooseUse(Outcome.Benefit, "Search for up to " + attackers + " basic land" + ((attackers == 1) ? "" : "s") + "?", source, game) && player.searchLibrary(target, game)) { + player.moveCards(new CardsImpl(target.getTargets()).getCards(game), Zone.BATTLEFIELD, source, game, true, false, false, null); + player.shuffleLibrary(source, game); + } + return true; + } } diff --git a/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java b/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java index bb09b6d0dc..614b015bf3 100644 --- a/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java +++ b/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java @@ -31,12 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.StaticFilters; /** * @@ -45,15 +46,16 @@ import mage.constants.Zone; public class SkyshroudRanger extends CardImpl { public SkyshroudRanger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.ELF); this.power = new MageInt(1); this.toughness = new MageInt(1); // {tap}: You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. - this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); - + this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new TapSourceCost())); + } public SkyshroudRanger(final SkyshroudRanger card) { diff --git a/Mage.Sets/src/mage/cards/s/StoneforgeMystic.java b/Mage.Sets/src/mage/cards/s/StoneforgeMystic.java index d8bc4e7b8c..e18c83b4e7 100644 --- a/Mage.Sets/src/mage/cards/s/StoneforgeMystic.java +++ b/Mage.Sets/src/mage/cards/s/StoneforgeMystic.java @@ -34,7 +34,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -70,7 +70,7 @@ public class StoneforgeMystic extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true, true), true)); // {1}{W}, {T}: You may put an Equipment card from your hand onto the battlefield. - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{1}{W}")); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter), new ManaCostsImpl("{1}{W}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SwellOfGrowth.java b/Mage.Sets/src/mage/cards/s/SwellOfGrowth.java index b90a7986a7..8710a17a82 100644 --- a/Mage.Sets/src/mage/cards/s/SwellOfGrowth.java +++ b/Mage.Sets/src/mage/cards/s/SwellOfGrowth.java @@ -28,12 +28,13 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; /** @@ -43,12 +44,12 @@ import mage.target.common.TargetCreaturePermanent; public class SwellOfGrowth extends CardImpl { public SwellOfGrowth(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); // Target creature gets +2/+2 until end of turn. You may put a land card from your hand onto the battlefield. this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new PutLandFromHandOntoBattlefieldEffect()); + this.getSpellAbility().addEffect(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A)); } public SwellOfGrowth(final SwellOfGrowth card) { diff --git a/Mage.Sets/src/mage/cards/t/TerrainGenerator.java b/Mage.Sets/src/mage/cards/t/TerrainGenerator.java index c661ce064a..91447add72 100644 --- a/Mage.Sets/src/mage/cards/t/TerrainGenerator.java +++ b/Mage.Sets/src/mage/cards/t/TerrainGenerator.java @@ -32,13 +32,13 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterLandCard; +import mage.filter.StaticFilters; /** * @@ -47,13 +47,14 @@ import mage.filter.common.FilterLandCard; public class TerrainGenerator extends CardImpl { public TerrainGenerator(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Add {C}. this.addAbility(new ColorlessManaAbility()); - - // {2}, {tap}: You may put a basic land card from your hand onto the battlefield tapped. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(true, FilterLandCard.basicLandCard()), new ManaCostsImpl("{2}")); + + // {2}, {T}: You may put a basic land card from your hand onto the battlefield tapped. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A, false, true), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TheUrDragon.java b/Mage.Sets/src/mage/cards/t/TheUrDragon.java index 88b2653f77..f0380b3be9 100644 --- a/Mage.Sets/src/mage/cards/t/TheUrDragon.java +++ b/Mage.Sets/src/mage/cards/t/TheUrDragon.java @@ -27,6 +27,9 @@ */ package mage.cards.t; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; @@ -34,13 +37,14 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.events.GameEvent; @@ -48,10 +52,6 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.watchers.Watcher; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - /** * @author TheElk801 */ @@ -180,7 +180,7 @@ class TheUrDragonEffect extends OneShotEffect { public TheUrDragonEffect() { super(Outcome.Benefit); - this.staticText = "draw that many cards, then you may put a permanent card from your hand onto the battlefield."; + this.staticText = "draw that many cards, then you may put a permanent card from your hand onto the battlefield"; } public TheUrDragonEffect(final TheUrDragonEffect effect) { @@ -207,9 +207,7 @@ class TheUrDragonEffect extends OneShotEffect { if (attackingDragons > 0) { controller.drawCards(attackingDragons, game); } - Effect effect = new PutPermanentOnBattlefieldEffect(); - effect.apply(game, source); - return true; + return new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A).apply(game, source); } } return false; diff --git a/Mage.Sets/src/mage/cards/t/ThranTemporalGateway.java b/Mage.Sets/src/mage/cards/t/ThranTemporalGateway.java index 13db844ec0..4807f0b0c5 100644 --- a/Mage.Sets/src/mage/cards/t/ThranTemporalGateway.java +++ b/Mage.Sets/src/mage/cards/t/ThranTemporalGateway.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -59,7 +59,7 @@ public class ThranTemporalGateway extends CardImpl { // {4}, {t}: You may put a historic permanent card from your hand onto the battlefield. (Artifacts, legendaries, and Sagas are historic.) SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(filter) + new PutCardFromHandOntoBattlefieldEffect(filter) .setText("You may put a historic permanent card from your hand onto the battlefield. " + "<i>(Artifacts, legendaries, and Sagas are historic.)</i>"), new ManaCostsImpl("{4}")); diff --git a/Mage.Sets/src/mage/cards/t/TimmyPowerGamer.java b/Mage.Sets/src/mage/cards/t/TimmyPowerGamer.java index 84b635f6b2..e52df31c04 100644 --- a/Mage.Sets/src/mage/cards/t/TimmyPowerGamer.java +++ b/Mage.Sets/src/mage/cards/t/TimmyPowerGamer.java @@ -30,16 +30,16 @@ package mage.cards.t; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; 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.FilterCreatureCard; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -48,7 +48,7 @@ import java.util.UUID; public class TimmyPowerGamer extends CardImpl { public TimmyPowerGamer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); this.supertype.add(SuperType.LEGENDARY); @@ -60,7 +60,7 @@ public class TimmyPowerGamer extends CardImpl { // {4}: You may put a creature card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), new ManaCostsImpl("{4}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TriassicEgg.java b/Mage.Sets/src/mage/cards/t/TriassicEgg.java index a33791f351..d77b356df6 100644 --- a/Mage.Sets/src/mage/cards/t/TriassicEgg.java +++ b/Mage.Sets/src/mage/cards/t/TriassicEgg.java @@ -36,7 +36,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.decorator.ConditionalActivatedAbility; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -45,7 +45,6 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreatureCard; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; @@ -67,7 +66,7 @@ public class TriassicEgg extends CardImpl { // Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), new SacrificeSourceCost(), new SourceHasCounterCondition(CounterType.HATCHLING, 2, Integer.MAX_VALUE), "Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on {this}."); diff --git a/Mage.Sets/src/mage/cards/w/WalkingAtlas.java b/Mage.Sets/src/mage/cards/w/WalkingAtlas.java index 19a64228c4..7b04146037 100644 --- a/Mage.Sets/src/mage/cards/w/WalkingAtlas.java +++ b/Mage.Sets/src/mage/cards/w/WalkingAtlas.java @@ -25,19 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.w; import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.StaticFilters; /** * @@ -45,17 +45,18 @@ import mage.constants.Zone; */ public class WalkingAtlas extends CardImpl { - public WalkingAtlas (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}"); + public WalkingAtlas(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); this.subtype.add(SubType.CONSTRUCT); this.power = new MageInt(1); this.toughness = new MageInt(1); // {tap}: You may put a land card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_BASIC_LAND_CARD_A), new TapSourceCost())); } - public WalkingAtlas (final WalkingAtlas card) { + public WalkingAtlas(final WalkingAtlas card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/w/WarrenInstigator.java b/Mage.Sets/src/mage/cards/w/WarrenInstigator.java index afc26696a5..8babe5cb4e 100644 --- a/Mage.Sets/src/mage/cards/w/WarrenInstigator.java +++ b/Mage.Sets/src/mage/cards/w/WarrenInstigator.java @@ -30,7 +30,7 @@ package mage.cards.w; import java.util.UUID; import mage.MageInt; import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.DoubleStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -62,7 +62,7 @@ public class WarrenInstigator extends CardImpl { this.addAbility(DoubleStrikeAbility.getInstance()); // Whenever Warren Instigator deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield. - this.addAbility(new DealsDamageToOpponentTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter), false)); + this.addAbility(new DealsDamageToOpponentTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter), false)); } public WarrenInstigator(final WarrenInstigator card) { diff --git a/Mage.Sets/src/mage/cards/w/WillowPriestess.java b/Mage.Sets/src/mage/cards/w/WillowPriestess.java index 3b1d6e2e34..08a37374f1 100644 --- a/Mage.Sets/src/mage/cards/w/WillowPriestess.java +++ b/Mage.Sets/src/mage/cards/w/WillowPriestess.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; @@ -73,7 +73,7 @@ public class WillowPriestess extends CardImpl { // {T}: You may put a Faerie permanent card from your hand onto the battlefield. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutPermanentOnBattlefieldEffect(filter), + new PutCardFromHandOntoBattlefieldEffect(filter), new TapSourceCost())); // {2}{G}: Target green creature gains protection from black until end of turn. diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java index d425019311..54828ccbf5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java @@ -110,6 +110,7 @@ public class VorinclexVoiceOfHungerTest extends CardTestPlayerBase { execute(); assertPermanentCount(playerB, "Gemstone Caverns", 1); + assertCounterCount("Gemstone Caverns", CounterType.LUCK, 1); assertPermanentCount(playerB, "Silvercoat Lion", 1); assertExileCount("Silvercoat Lion", 1); assertTapped("Gemstone Caverns", true); diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index cadb470761..880e67ad44 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -851,6 +851,9 @@ public class ContinuousEffects implements Serializable { if (rEffect != null) { event.getAppliedEffects().add(rEffect.getId()); caught = rEffect.replaceEvent(event, rAbility, game); + if (Duration.OneUse.equals(rEffect.getDuration())) { + rEffect.discard(); + } } if (caught) { // Event was completely replaced -> stop applying effects to it break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java similarity index 70% rename from Mage/src/main/java/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java rename to Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java index c6f2461b5a..4ea64c17dc 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java @@ -15,34 +15,41 @@ import mage.target.common.TargetCardInHand; /** * @author magenoxx_at_gmail.com */ -public class PutPermanentOnBattlefieldEffect extends OneShotEffect { +public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { private final FilterCard filter; private final boolean useTargetController; + private final boolean tapped; - public PutPermanentOnBattlefieldEffect() { + public PutCardFromHandOntoBattlefieldEffect() { this(new FilterPermanentCard("a permanent card"), false); } - public PutPermanentOnBattlefieldEffect(FilterCard filter) { + public PutCardFromHandOntoBattlefieldEffect(FilterCard filter) { this(filter, false); } - public PutPermanentOnBattlefieldEffect(FilterCard filter, boolean useTargetController) { + public PutCardFromHandOntoBattlefieldEffect(FilterCard filter, boolean useTargetController) { + this(filter, useTargetController, false); + } + + public PutCardFromHandOntoBattlefieldEffect(FilterCard filter, boolean useTargetController, boolean tapped) { super(Outcome.PutCardInPlay); this.filter = filter; this.useTargetController = useTargetController; + this.tapped = tapped; } - public PutPermanentOnBattlefieldEffect(final PutPermanentOnBattlefieldEffect effect) { + public PutCardFromHandOntoBattlefieldEffect(final PutCardFromHandOntoBattlefieldEffect effect) { super(effect); this.filter = effect.filter.copy(); this.useTargetController = effect.useTargetController; + this.tapped = effect.tapped; } @Override - public PutPermanentOnBattlefieldEffect copy() { - return new PutPermanentOnBattlefieldEffect(this); + public PutCardFromHandOntoBattlefieldEffect copy() { + return new PutCardFromHandOntoBattlefieldEffect(this); } @Override @@ -58,10 +65,10 @@ public class PutPermanentOnBattlefieldEffect extends OneShotEffect { } if (player.chooseUse(Outcome.PutCardInPlay, "Put " + filter.getMessage() + " from your hand onto the battlefield?", source, game)) { TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { + if (player.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - return player.moveCards(card, Zone.BATTLEFIELD, source, game); + return player.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, false, null); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java deleted file mode 100644 index 45edec3a94..0000000000 --- a/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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.effects.common; - -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.common.FilterLandCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; - -/** - * - * @author LevelX2 - */ -public class PutLandFromHandOntoBattlefieldEffect extends OneShotEffect { - - private FilterCard filter; - private boolean tapped; - - public PutLandFromHandOntoBattlefieldEffect() { - this(false); - } - - public PutLandFromHandOntoBattlefieldEffect(boolean tapped) { - this(tapped, new FilterLandCard()); - } - - public PutLandFromHandOntoBattlefieldEffect(boolean tapped, FilterCard filter) { - super(Outcome.PutLandInPlay); - this.tapped = tapped; - this.filter = filter; - staticText = "you may put a " + filter.getMessage() + " from your hand onto the battlefield" + (tapped ? " tapped" : ""); - } - - public PutLandFromHandOntoBattlefieldEffect(final PutLandFromHandOntoBattlefieldEffect effect) { - super(effect); - this.tapped = effect.tapped; - this.filter = effect.filter; - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) - && controller.chooseUse(outcome, "Put land onto battlefield?", source, game) - && controller.choose(outcome, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, false, null); - } - } - return true; - } - return false; - - } - - @Override - public PutLandFromHandOntoBattlefieldEffect copy() { - return new PutLandFromHandOntoBattlefieldEffect(this); - } - -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java index 18c5bad257..09545bd4cc 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,22 +20,21 @@ * 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.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.game.permanent.Permanent; +import mage.players.Player; /** * @@ -59,12 +58,15 @@ public class ReturnToBattlefieldUnderOwnerControlAttachedEffect extends OneShotE @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } Object object = getValue("attachedTo"); if (object != null && object instanceof Permanent) { Card card = game.getCard(((Permanent) object).getId()); if (card != null) { - Zone currentZone = game.getState().getZone(card.getId()); - if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), card.getOwnerId())) { + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlSourceEffect.java index 07048c0624..e2383ead40 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlSourceEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,22 +20,22 @@ * 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.effects.common; import java.util.UUID; -import mage.constants.Outcome; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; +import mage.constants.Outcome; import mage.constants.Zone; import mage.game.ExileZone; import mage.game.Game; +import mage.players.Player; import mage.util.CardUtil; /** @@ -60,11 +60,16 @@ public class ReturnToBattlefieldUnderYourControlSourceEffect extends OneShotEffe @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); ExileZone exileZone = game.getExile().getExileZone(exileZoneId); if (exileZone != null && exileZone.contains(source.getSourceId())) { - Card card = game.getCard(source.getSourceId()); - if (card != null && card.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), source.getControllerId())) { + Card card = game.getCard(source.getSourceId()); + if (card != null + && controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java index b662a74911..655ccff0aa 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java @@ -103,11 +103,11 @@ class AuraSwapEffect extends OneShotEffect { Card auraInHand = game.getCard(target.getFirstTarget()); if (auraInHand != null) { game.getState().setValue("attachTo:" + auraInHand.getId(), enchantedPermanent); - auraInHand.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), controller.getId()); + controller.moveCards(auraInHand, Zone.BATTLEFIELD, source, game); enchantedPermanent.addAttachment(auraInHand.getId(), game); game.informPlayers(controller.getLogName() + " put " + auraInHand.getLogName() + " on the battlefield attached to " + enchantedPermanent.getLogName() + '.'); enchantedPermanent.removeAttachment(auraSourcePermanent.getId(), game); - return controller.moveCards(game.getCard(source.getSourceId()), Zone.HAND, source, game); + return controller.moveCards(auraSourcePermanent, Zone.HAND, source, game); } } } diff --git a/Mage/src/main/java/mage/abilities/keyword/NinjutsuAbility.java b/Mage/src/main/java/mage/abilities/keyword/NinjutsuAbility.java index 893fad9d4e..86b04eccc3 100644 --- a/Mage/src/main/java/mage/abilities/keyword/NinjutsuAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/NinjutsuAbility.java @@ -120,9 +120,13 @@ class NinjutsuEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } Card card = game.getCard(source.getSourceId()); if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); + controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null); Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { UUID defendingPlayerId = null; @@ -133,7 +137,6 @@ class NinjutsuEffect extends OneShotEffect { } if (defendingPlayerId != null) { game.getCombat().addAttackerToCombat(permanent.getId(), defendingPlayerId, game); - permanent.setTapped(true); return true; } } diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index e540945a42..3fca15f61e 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -71,6 +71,13 @@ public final class StaticFilters { static { FILTER_CARD_CREATURE.setLockedFilter(true); } + + public static final FilterCreatureCard FILTER_CARD_CREATURE_A = new FilterCreatureCard("a creature card"); + + static { + FILTER_CARD_CREATURE_A.setLockedFilter(true); + } + public static final FilterCreatureCard FILTER_CARD_CREATURE_YOUR_GRAVEYARD = new FilterCreatureCard("creature card from your graveyard"); static { @@ -88,6 +95,12 @@ public final class StaticFilters { static { FILTER_CARD_LAND.setLockedFilter(true); } + + public static final FilterLandCard FILTER_CARD_LAND_A = new FilterLandCard("a land card"); + + static { + FILTER_CARD_LAND_A.setLockedFilter(true); + } public static final FilterNonlandCard FILTER_CARD_NON_LAND = new FilterNonlandCard(); static { @@ -292,6 +305,12 @@ public final class StaticFilters { FILTER_BASIC_LAND_CARD.setLockedFilter(true); } + public static final FilterBasicLandCard FILTER_BASIC_LAND_CARD_A = new FilterBasicLandCard("a basic land card"); + + static { + FILTER_BASIC_LAND_CARD_A.setLockedFilter(true); + } + // Used for sacrifice targets that don't need the "you control" text public static final FilterControlledLandPermanent FILTER_CONTROLLED_LAND_SHORT_TEXT = new FilterControlledLandPermanent("a land"); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 427b46ef05..1f6eeacb01 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -152,7 +152,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { this.blocking = permanent.blocking; this.maxBlocks = permanent.maxBlocks; this.deathtouched = permanent.deathtouched; -// this.attachments.addAll(permanent.attachments); + for (Map.Entry<String, List<UUID>> entry : permanent.connectedCards.entrySet()) { this.connectedCards.put(entry.getKey(), entry.getValue()); } @@ -696,7 +696,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { for (Iterator<Effect> ite = ability.getEffects(game, EffectType.CONTINUOUS).iterator(); ite.hasNext();) { ContinuousEffect effect = (ContinuousEffect) ite.next(); game.getContinuousEffects().setOrder(effect); - // It's important is to update timestamp of the copied effect in ContinuousEffects because it does the action + // It's important to update the timestamp of the copied effect in ContinuousEffects because it does the action for (ContinuousEffect conEffect : game.getContinuousEffects().getLayeredEffects(game)) { if (conEffect.getId().equals(effect.getId())) { game.getContinuousEffects().setOrder(conEffect);