From d6e7ff6dadb23cd4c24466dcb2fcc94822b4c51c Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 17 Feb 2024 02:05:15 -0500 Subject: [PATCH] new TargetPlayerGainControlSourceEffect rework Drooling Ogre and others to use it --- Mage.Sets/src/mage/cards/a/AvariceAmulet.java | 37 +------- Mage.Sets/src/mage/cards/c/ChaosLord.java | 34 +------ Mage.Sets/src/mage/cards/c/CovetedJewel.java | 36 +------ Mage.Sets/src/mage/cards/c/CragSaurian.java | 45 +-------- Mage.Sets/src/mage/cards/d/DroolingOgre.java | 94 ++----------------- Mage.Sets/src/mage/cards/f/FickleEfreet.java | 73 ++++---------- .../src/mage/cards/h/HumbleDefector.java | 81 ++-------------- Mage.Sets/src/mage/cards/j/JinxedChoker.java | 33 +------ Mage.Sets/src/mage/cards/j/JinxedIdol.java | 49 ++-------- Mage.Sets/src/mage/cards/j/JinxedRing.java | 45 +-------- .../src/mage/cards/l/LoxodonPeacekeeper.java | 3 +- .../src/mage/cards/m/MeasureOfWickedness.java | 45 +-------- Mage.Sets/src/mage/cards/r/RiskyMove.java | 7 +- Mage.Sets/src/mage/cards/s/Shuriken.java | 2 +- Mage.Sets/src/mage/cards/w/WitchEngine.java | 43 +-------- .../TargetPlayerGainControlSourceEffect.java | 61 ++++++++++++ 16 files changed, 139 insertions(+), 549 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/TargetPlayerGainControlSourceEffect.java diff --git a/Mage.Sets/src/mage/cards/a/AvariceAmulet.java b/Mage.Sets/src/mage/cards/a/AvariceAmulet.java index a372b29d524..123d5f8cf6a 100644 --- a/Mage.Sets/src/mage/cards/a/AvariceAmulet.java +++ b/Mage.Sets/src/mage/cards/a/AvariceAmulet.java @@ -1,15 +1,13 @@ - package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; @@ -17,10 +15,10 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author emerald000 @@ -46,7 +44,7 @@ public final class AvariceAmulet extends CardImpl { this.addAbility(ability); // Whenever equipped creature dies, target opponent gains control of Avarice Amulet. - ability = new DiesAttachedTriggeredAbility(new AvariceAmuletChangeControlEffect(), "equipped creature", false); + ability = new DiesAttachedTriggeredAbility(new TargetPlayerGainControlSourceEffect(), "equipped creature", false); ability.addTarget(new TargetOpponent()); this.addAbility(ability); @@ -63,30 +61,3 @@ public final class AvariceAmulet extends CardImpl { return new AvariceAmulet(this); } } - -class AvariceAmuletChangeControlEffect extends ContinuousEffectImpl { - - AvariceAmuletChangeControlEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "target opponent gains control of {this}"; - } - - private AvariceAmuletChangeControlEffect(final AvariceAmuletChangeControlEffect effect) { - super(effect); - } - - @Override - public AvariceAmuletChangeControlEffect copy() { - return new AvariceAmuletChangeControlEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } - return false; - } - -} diff --git a/Mage.Sets/src/mage/cards/c/ChaosLord.java b/Mage.Sets/src/mage/cards/c/ChaosLord.java index 83b5c1422fe..69b94337662 100644 --- a/Mage.Sets/src/mage/cards/c/ChaosLord.java +++ b/Mage.Sets/src/mage/cards/c/ChaosLord.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.ControlsPermanentsComparedToOpponentsCondition; import mage.abilities.effects.AsThoughEffectImpl; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -62,7 +62,7 @@ class ChaosLordTriggeredAbility extends BeginningOfUpkeepTriggeredAbility { ChaosLordTriggeredAbility() { super(Zone.BATTLEFIELD, - new GainControlSourceEffect(), + new TargetPlayerGainControlSourceEffect(), TargetController.YOU, false); } @@ -96,39 +96,11 @@ class ChaosLordTriggeredAbility extends BeginningOfUpkeepTriggeredAbility { } -class GainControlSourceEffect extends ContinuousEffectImpl { - - GainControlSourceEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "target opponent gains control of {this}"; - } - - private GainControlSourceEffect(final GainControlSourceEffect effect) { - super(effect); - } - - @Override - public GainControlSourceEffect copy() { - return new GainControlSourceEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } else { - discard(); - } - return false; - } -} - class ChaosLordEffect extends AsThoughEffectImpl { ChaosLordEffect() { super(AsThoughEffectType.ATTACK_AS_HASTE, Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "Chaos Lord can attack as though it had haste unless it entered the battlefield this turn"; + staticText = "{this} can attack as though it had haste unless it entered the battlefield this turn"; } private ChaosLordEffect(final ChaosLordEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CovetedJewel.java b/Mage.Sets/src/mage/cards/c/CovetedJewel.java index 69c0f4f7b7f..13fb573dc71 100644 --- a/Mage.Sets/src/mage/cards/c/CovetedJewel.java +++ b/Mage.Sets/src/mage/cards/c/CovetedJewel.java @@ -1,18 +1,18 @@ package mage.cards.c; -import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.effects.common.UntapSourceEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -59,7 +59,7 @@ class CovetedJewelTriggeredAbility extends TriggeredAbilityImpl { public CovetedJewelTriggeredAbility() { super(Zone.BATTLEFIELD, new DrawCardTargetEffect(3), false); - this.addEffect(new CovetedJewelControlEffect()); + this.addEffect(new TargetPlayerGainControlSourceEffect()); this.addEffect(new UntapSourceEffect()); } @@ -103,31 +103,3 @@ class CovetedJewelTriggeredAbility extends TriggeredAbilityImpl { + "and gains control of {this}. Untap it."; } } - -class CovetedJewelControlEffect extends ContinuousEffectImpl { - - CovetedJewelControlEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - } - - private CovetedJewelControlEffect(final CovetedJewelControlEffect effect) { - super(effect); - } - - @Override - public CovetedJewelControlEffect copy() { - return new CovetedJewelControlEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - Player newControllingPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (permanent == null || newControllingPlayer == null || !newControllingPlayer.canRespond()) { - this.discard(); - return false; - } - permanent.changeControllerId(getTargetPointer().getFirst(game, source), game, source); - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/c/CragSaurian.java b/Mage.Sets/src/mage/cards/c/CragSaurian.java index f523ecc8747..fdac30c0a13 100644 --- a/Mage.Sets/src/mage/cards/c/CragSaurian.java +++ b/Mage.Sets/src/mage/cards/c/CragSaurian.java @@ -1,21 +1,14 @@ package mage.cards.c; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SourceDealsDamageToThisTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.game.Game; -import mage.players.Player; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** * @@ -30,7 +23,7 @@ public final class CragSaurian extends CardImpl { this.toughness = new MageInt(4); // Whenever a source deals damage to Crag Saurian, that source's controller gains control of Crag Saurian. - this.addAbility(new SourceDealsDamageToThisTriggeredAbility(new CragSaurianEffect())); + this.addAbility(new SourceDealsDamageToThisTriggeredAbility(new TargetPlayerGainControlSourceEffect("that source's controller"))); } private CragSaurian(final CragSaurian card) { @@ -42,33 +35,3 @@ public final class CragSaurian extends CardImpl { return new CragSaurian(this); } } - -class CragSaurianEffect extends OneShotEffect { - - CragSaurianEffect() { - super(Outcome.GainControl); - this.staticText = "that source's controller gains control of {this}"; - } - - private CragSaurianEffect(final CragSaurianEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Player newController = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (newController != null && controller != null && !controller.equals(newController)) { - ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, newController.getId()); - effect.setTargetPointer(new FixedTarget(source.getSourceId(), game)); - game.addEffect(effect, source); - return true; - } - return false; - } - - @Override - public CragSaurianEffect copy() { - return new CragSaurianEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DroolingOgre.java b/Mage.Sets/src/mage/cards/d/DroolingOgre.java index ec4d11cab85..edd68e7233f 100644 --- a/Mage.Sets/src/mage/cards/d/DroolingOgre.java +++ b/Mage.Sets/src/mage/cards/d/DroolingOgre.java @@ -1,28 +1,19 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SetTargetPointer; import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.stack.Spell; -import mage.players.Player; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author wetterlicht + * @author xenohedron */ public final class DroolingOgre extends CardImpl { @@ -33,7 +24,8 @@ public final class DroolingOgre extends CardImpl { this.toughness = new MageInt(3); // Whenever a player casts an artifact spell, that player gains control of Drooling Ogre. - this.addAbility(new DroolingOgreTriggeredAbility()); + this.addAbility(new SpellCastAllTriggeredAbility(new TargetPlayerGainControlSourceEffect(), + StaticFilters.FILTER_SPELL_AN_ARTIFACT, false, SetTargetPointer.PLAYER)); } private DroolingOgre(final DroolingOgre card) { @@ -45,72 +37,4 @@ public final class DroolingOgre extends CardImpl { return new DroolingOgre(this); } - private static class DroolingOgreEffect extends OneShotEffect { - - DroolingOgreEffect() { - super(Outcome.GainControl); - this.staticText = "that player gains control of {this}"; - } - - private DroolingOgreEffect(final DroolingOgreEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Player newController = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (newController != null - && controller != null - && !controller.equals(newController)) { - ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, newController.getId()); - effect.setTargetPointer(new FixedTarget(source.getSourceId(), game)); - game.addEffect(effect, source); - return true; - } - return false; - } - - @Override - public DroolingOgreEffect copy() { - return new DroolingOgreEffect(this); - } - - } - - class DroolingOgreTriggeredAbility extends TriggeredAbilityImpl { - - public DroolingOgreTriggeredAbility() { - super(Zone.BATTLEFIELD, new DroolingOgreEffect(), false); - } - - private DroolingOgreTriggeredAbility(final DroolingOgreTriggeredAbility ability) { - super(ability); - } - - @Override - public DroolingOgreTriggeredAbility copy() { - return new DroolingOgreTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && spell.isArtifact(game)) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a player casts an artifact spell, that player gains control of {this}."; - } - } } diff --git a/Mage.Sets/src/mage/cards/f/FickleEfreet.java b/Mage.Sets/src/mage/cards/f/FickleEfreet.java index 0eeb0bd5643..0d0326ceb10 100644 --- a/Mage.Sets/src/mage/cards/f/FickleEfreet.java +++ b/Mage.Sets/src/mage/cards/f/FickleEfreet.java @@ -1,15 +1,12 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.common.AttacksOrBlocksTriggeredAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -20,6 +17,8 @@ import mage.target.Target; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author L_J @@ -67,60 +66,22 @@ class FickleEfreetChangeControlEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (controller != null) { - if (!controller.flipCoin(source, game, true)) { - if (sourcePermanent != null) { - Target target = new TargetOpponent(true); - if (target.canChoose(controller.getId(), source, game)) { - while (!target.isChosen() && target.canChoose(controller.getId(), source, game) && controller.canRespond()) { - controller.chooseTarget(outcome, target, source, game); - } - } - Player chosenOpponent = game.getPlayer(target.getFirstTarget()); - if (chosenOpponent != null) { - ContinuousEffect effect = new FickleEfreetGainControlEffect(Duration.Custom, target.getFirstTarget()); - effect.setTargetPointer(new FixedTarget(sourcePermanent.getId(), game)); - game.addEffect(effect, source); - game.informPlayers(chosenOpponent.getLogName() + " has gained control of " + sourcePermanent.getLogName()); - return true; - } - } + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + if (controller == null || sourcePermanent == null) { + return false; + } + if (!controller.flipCoin(source, game, true)) { + Target target = new TargetOpponent(true); + controller.chooseTarget(outcome, target, source, game); + Player chosenOpponent = game.getPlayer(target.getFirstTarget()); + if (chosenOpponent != null) { + game.addEffect(new GainControlTargetEffect( + Duration.Custom, true, chosenOpponent.getId() + ).setTargetPointer(new FixedTarget(sourcePermanent, game)), source); + game.informPlayers(chosenOpponent.getLogName() + " has gained control of " + sourcePermanent.getLogName()); + return true; } } return false; } } - -class FickleEfreetGainControlEffect extends ContinuousEffectImpl { - - UUID controller; - - public FickleEfreetGainControlEffect(Duration duration, UUID controller) { - super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - this.controller = controller; - this.staticText = "That player gains control of {this}"; - } - - private FickleEfreetGainControlEffect(final FickleEfreetGainControlEffect effect) { - super(effect); - this.controller = effect.controller; - } - - @Override - public FickleEfreetGainControlEffect copy() { - return new FickleEfreetGainControlEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (targetPointer != null) { - permanent = game.getPermanent(targetPointer.getFirst(game, source)); - } - if (permanent != null) { - return permanent.changeControllerId(controller, game, source); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HumbleDefector.java b/Mage.Sets/src/mage/cards/h/HumbleDefector.java index e4e96571006..c647ca1a29a 100644 --- a/Mage.Sets/src/mage/cards/h/HumbleDefector.java +++ b/Mage.Sets/src/mage/cards/h/HumbleDefector.java @@ -5,22 +5,20 @@ import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.hint.common.MyTurnHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; import mage.target.common.TargetOpponent; import java.util.UUID; /** - * @author jeffwadsworth + * @author xenohedron */ public final class HumbleDefector extends CardImpl { @@ -32,7 +30,9 @@ public final class HumbleDefector extends CardImpl { this.toughness = new MageInt(1); // {T}: Draw two cards. Target opponent gains control of Humble Defector. Activate this ability only during your turn. - Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, new HumbleDefectorEffect(), new TapSourceCost(), MyTurnCondition.instance); + Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, + new DrawCardSourceControllerEffect(2), new TapSourceCost(), MyTurnCondition.instance); + ability.addEffect(new TargetPlayerGainControlSourceEffect()); ability.addTarget(new TargetOpponent()); ability.addHint(MyTurnHint.instance); this.addAbility(ability); @@ -48,66 +48,3 @@ public final class HumbleDefector extends CardImpl { return new HumbleDefector(this); } } - -class HumbleDefectorEffect extends OneShotEffect { - - HumbleDefectorEffect() { - super(Outcome.Discard); - this.staticText = "Draw two cards. Target opponent gains control of {this}."; - } - - private HumbleDefectorEffect(final HumbleDefectorEffect effect) { - super(effect); - } - - @Override - public HumbleDefectorEffect copy() { - return new HumbleDefectorEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.drawCards(2, source, game); - } - Permanent humbleDefector = source.getSourcePermanentIfItStillExists(game); - Player targetOpponent = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (targetOpponent != null && humbleDefector != null) { - ContinuousEffect effect = new HumbleDefectorControlSourceEffect(); - game.addEffect(effect, source); - game.informPlayers(humbleDefector.getName() + " is now controlled by " + targetOpponent.getLogName()); - return true; - } - return false; - } -} - -class HumbleDefectorControlSourceEffect extends ContinuousEffectImpl { - - HumbleDefectorControlSourceEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - } - - private HumbleDefectorControlSourceEffect(final HumbleDefectorControlSourceEffect effect) { - super(effect); - } - - @Override - public HumbleDefectorControlSourceEffect copy() { - return new HumbleDefectorControlSourceEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player targetOpponent = game.getPlayer(source.getFirstTarget()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null && targetOpponent != null) { - permanent.changeControllerId(targetOpponent.getId(), game, source); - } else { - // no valid target exists, effect can be discarded - discard(); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/j/JinxedChoker.java b/Mage.Sets/src/mage/cards/j/JinxedChoker.java index 04bc95f5db2..157058654e9 100644 --- a/Mage.Sets/src/mage/cards/j/JinxedChoker.java +++ b/Mage.Sets/src/mage/cards/j/JinxedChoker.java @@ -6,10 +6,10 @@ import mage.abilities.common.OnEventTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class JinxedChoker extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // At the beginning of your end step, target opponent gains control of Jinxed Choker and puts a charge counter on it. - Ability endStepAbility = new BeginningOfYourEndStepTriggeredAbility(new JinxedChokerChangeControllerEffect(), false); + Ability endStepAbility = new BeginningOfYourEndStepTriggeredAbility(new TargetPlayerGainControlSourceEffect(), false); endStepAbility.addEffect(new JinxedChokerAddCounterEffect()); endStepAbility.addTarget(new TargetOpponent()); this.addAbility(endStepAbility); @@ -58,35 +58,6 @@ public final class JinxedChoker extends CardImpl { } } -class JinxedChokerChangeControllerEffect extends ContinuousEffectImpl { - - JinxedChokerChangeControllerEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "target opponent gains control of {this}"; - } - - private JinxedChokerChangeControllerEffect(final JinxedChokerChangeControllerEffect effect) { - super(effect); - } - - @Override - public JinxedChokerChangeControllerEffect copy() { - return new JinxedChokerChangeControllerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } else { - discard(); - } - return false; - } - -} - class JinxedChokerAddCounterEffect extends OneShotEffect { JinxedChokerAddCounterEffect() { diff --git a/Mage.Sets/src/mage/cards/j/JinxedIdol.java b/Mage.Sets/src/mage/cards/j/JinxedIdol.java index 03f4af2832b..8a9400371f2 100644 --- a/Mage.Sets/src/mage/cards/j/JinxedIdol.java +++ b/Mage.Sets/src/mage/cards/j/JinxedIdol.java @@ -1,23 +1,21 @@ - package mage.cards.j; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -28,10 +26,10 @@ public final class JinxedIdol extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // At the beginning of your upkeep, Jinxed Idol deals 2 damage to you. - this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new DamageControllerEffect(2))); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(2), TargetController.YOU, false)); // Sacrifice a creature: Target opponent gains control of Jinxed Idol. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JinxedIdolEffect(), + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TargetPlayerGainControlSourceEffect(), new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT)); ability.addTarget(new TargetOpponent()); this.addAbility(ability); @@ -47,32 +45,3 @@ public final class JinxedIdol extends CardImpl { } } - -class JinxedIdolEffect extends ContinuousEffectImpl { - - JinxedIdolEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "Target opponent gains control of {this}"; - } - - private JinxedIdolEffect(final JinxedIdolEffect effect) { - super(effect); - } - - @Override - public JinxedIdolEffect copy() { - return new JinxedIdolEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } else { - discard(); - } - return false; - } - -} diff --git a/Mage.Sets/src/mage/cards/j/JinxedRing.java b/Mage.Sets/src/mage/cards/j/JinxedRing.java index d1113f68ab9..8431b4cd0c9 100644 --- a/Mage.Sets/src/mage/cards/j/JinxedRing.java +++ b/Mage.Sets/src/mage/cards/j/JinxedRing.java @@ -1,30 +1,22 @@ - package mage.cards.j; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; - import mage.filter.predicate.permanent.TokenPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author fireshoes @@ -44,7 +36,7 @@ public final class JinxedRing extends CardImpl { this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility(new DamageControllerEffect(1), false, filter, false, true)); // Sacrifice a creature: Target opponent gains control of Jinxed Ring. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JinxedRingEffect(), + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TargetPlayerGainControlSourceEffect(), new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT)); ability.addTarget(new TargetOpponent()); this.addAbility(ability); @@ -59,32 +51,3 @@ public final class JinxedRing extends CardImpl { return new JinxedRing(this); } } - -class JinxedRingEffect extends ContinuousEffectImpl { - - JinxedRingEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "Target opponent gains control of {this}"; - } - - private JinxedRingEffect(final JinxedRingEffect effect) { - super(effect); - } - - @Override - public JinxedRingEffect copy() { - return new JinxedRingEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } else { - discard(); - } - return false; - } - -} diff --git a/Mage.Sets/src/mage/cards/l/LoxodonPeacekeeper.java b/Mage.Sets/src/mage/cards/l/LoxodonPeacekeeper.java index fa7973b3dac..fe5dceb3b7d 100644 --- a/Mage.Sets/src/mage/cards/l/LoxodonPeacekeeper.java +++ b/Mage.Sets/src/mage/cards/l/LoxodonPeacekeeper.java @@ -1,4 +1,3 @@ - package mage.cards.l; import java.util.HashSet; @@ -95,7 +94,7 @@ class LoxodonPeacekeeperEffect extends OneShotEffect { } } - if (tiedPlayers.size() > 0) { + if (!tiedPlayers.isEmpty()) { UUID newControllerId = null; if (tiedPlayers.size() > 1) { FilterPlayer filter = new FilterPlayer("a player tied for lowest life total"); diff --git a/Mage.Sets/src/mage/cards/m/MeasureOfWickedness.java b/Mage.Sets/src/mage/cards/m/MeasureOfWickedness.java index 0e9e8dd808e..d175328f21d 100644 --- a/Mage.Sets/src/mage/cards/m/MeasureOfWickedness.java +++ b/Mage.Sets/src/mage/cards/m/MeasureOfWickedness.java @@ -1,30 +1,23 @@ - package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author LevelX2 @@ -50,7 +43,7 @@ public final class MeasureOfWickedness extends CardImpl { // Whenever another card is put into your graveyard from anywhere, target opponent gains control of Measure of Wickedness. ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility( - new MeasureOfWickednessControlSourceEffect(), false, filter, TargetController.YOU); + new TargetPlayerGainControlSourceEffect(), false, filter, TargetController.YOU); ability.addTarget(new TargetOpponent()); this.addAbility(ability); @@ -65,33 +58,3 @@ public final class MeasureOfWickedness extends CardImpl { return new MeasureOfWickedness(this); } } - -class MeasureOfWickednessControlSourceEffect extends ContinuousEffectImpl { - - MeasureOfWickednessControlSourceEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "target opponent gains control of {this}"; - } - - private MeasureOfWickednessControlSourceEffect(final MeasureOfWickednessControlSourceEffect effect) { - super(effect); - } - - @Override - public MeasureOfWickednessControlSourceEffect copy() { - return new MeasureOfWickednessControlSourceEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player targetOpponent = game.getPlayer(source.getFirstTarget()); - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null && targetOpponent != null) { - permanent.changeControllerId(targetOpponent.getId(), game, source); - } else { - // no valid target exists, effect can be discarded - discard(); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/r/RiskyMove.java b/Mage.Sets/src/mage/cards/r/RiskyMove.java index dbefd9063fa..7819b9c4731 100644 --- a/Mage.Sets/src/mage/cards/r/RiskyMove.java +++ b/Mage.Sets/src/mage/cards/r/RiskyMove.java @@ -3,7 +3,6 @@ package mage.cards.r; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.ContinuousEffect; @@ -100,7 +99,7 @@ class RiskyMoveGetControlEffect extends OneShotEffect { class RiskyMoveTriggeredAbility extends TriggeredAbilityImpl { - public RiskyMoveTriggeredAbility() { + RiskyMoveTriggeredAbility() { super(Zone.BATTLEFIELD, new RiskyMoveFlipCoinEffect(), false); setTriggerPhrase("When you gain control of {this} from another player, "); } @@ -180,9 +179,9 @@ class RiskyMoveFlipCoinEffect extends OneShotEffect { class RiskyMoveCreatureGainControlEffect extends ContinuousEffectImpl { - private UUID controller; + private final UUID controller; - public RiskyMoveCreatureGainControlEffect(Duration duration, UUID controller) { + RiskyMoveCreatureGainControlEffect(Duration duration, UUID controller) { super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); this.controller = controller; this.staticText = "If you lose the flip, that opponent gains control of that creature"; diff --git a/Mage.Sets/src/mage/cards/s/Shuriken.java b/Mage.Sets/src/mage/cards/s/Shuriken.java index 10d99277dfd..9f53df16c30 100644 --- a/Mage.Sets/src/mage/cards/s/Shuriken.java +++ b/Mage.Sets/src/mage/cards/s/Shuriken.java @@ -80,7 +80,7 @@ class ShurikenEffect extends OneShotEffect { Permanent equipment = (Permanent) object; targetedPermanent.damage(2, equipment.getId(), source, game); Permanent attached = source.getSourcePermanentOrLKI(game); - if (attached != null && attached.hasSubtype(SubType.NINJA, game)) { + if (attached == null || attached.hasSubtype(SubType.NINJA, game)) { return true; } game.addEffect(new GainControlTargetEffect( diff --git a/Mage.Sets/src/mage/cards/w/WitchEngine.java b/Mage.Sets/src/mage/cards/w/WitchEngine.java index f321476c5b5..b76eb01a4be 100644 --- a/Mage.Sets/src/mage/cards/w/WitchEngine.java +++ b/Mage.Sets/src/mage/cards/w/WitchEngine.java @@ -1,28 +1,22 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.SwampwalkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.SubType; import mage.constants.Zone; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author fireshoes @@ -40,7 +34,7 @@ public final class WitchEngine extends CardImpl { // {T}: Add {B}{B}{B}{B}. Target opponent gains control of Witch Engine. (Activate this ability only any time you could cast an instant.) Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BasicManaEffect(Mana.BlackMana(4)), new TapSourceCost()); - ability.addEffect(new WitchEngineEffect()); + ability.addEffect(new TargetPlayerGainControlSourceEffect()); ability.addTarget(new TargetOpponent()); this.addAbility(ability); } @@ -54,32 +48,3 @@ public final class WitchEngine extends CardImpl { return new WitchEngine(this); } } - -class WitchEngineEffect extends ContinuousEffectImpl { - - WitchEngineEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - staticText = "target opponent gains control of {this}"; - } - - private WitchEngineEffect(final WitchEngineEffect effect) { - super(effect); - } - - @Override - public WitchEngineEffect copy() { - return new WitchEngineEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { - return permanent.changeControllerId(source.getFirstTarget(), game, source); - } else { - discard(); - } - return false; - } - -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/TargetPlayerGainControlSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TargetPlayerGainControlSourceEffect.java new file mode 100644 index 00000000000..dfa755a0fea --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/TargetPlayerGainControlSourceEffect.java @@ -0,0 +1,61 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * @author xenohedron + */ +public class TargetPlayerGainControlSourceEffect extends OneShotEffect { + + private final String playerDescription; + + public TargetPlayerGainControlSourceEffect() { + this(""); + } + + public TargetPlayerGainControlSourceEffect(String playerDescription) { + super(Outcome.Benefit); + this.playerDescription = playerDescription; + } + + protected TargetPlayerGainControlSourceEffect(final TargetPlayerGainControlSourceEffect effect) { + super(effect); + this.playerDescription = effect.playerDescription; + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (player == null || permanent == null) { + return false; + } + game.addEffect(new GainControlTargetEffect( + Duration.Custom, true, player.getId() + ).setTargetPointer(new FixedTarget(permanent, game)), source); + return true; + } + + @Override + public TargetPlayerGainControlSourceEffect copy() { + return new TargetPlayerGainControlSourceEffect(this); + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return (playerDescription.isEmpty() ? getTargetPointer().describeTargets(mode.getTargets(), "that player") : playerDescription) + + " gains control of {this}"; + } +}