diff --git a/Mage.Sets/src/mage/cards/s/SlicerHighSpeedAntagonist.java b/Mage.Sets/src/mage/cards/s/SlicerHighSpeedAntagonist.java new file mode 100644 index 00000000000..61fb781a073 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SlicerHighSpeedAntagonist.java @@ -0,0 +1,59 @@ +package mage.cards.s; + +import java.util.UUID; + +import mage.MageInt; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.abilities.keyword.LivingMetalAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * @author grimreap124 + */ +public final class SlicerHighSpeedAntagonist extends CardImpl { + + public SlicerHighSpeedAntagonist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT }, ""); + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.VEHICLE); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + this.color.setRed(true); + this.nightCard = true; + + // Living metal + this.addAbility(new LivingMetalAbility()); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Whenever Slicer deals combat damage to a player, convert it at end of combat. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new TransformSourceEffect())) + .setText("convert it at end of combat"), + false)); + + } + + private SlicerHighSpeedAntagonist(final SlicerHighSpeedAntagonist card) { + super(card); + } + + @Override + public SlicerHighSpeedAntagonist copy() { + return new SlicerHighSpeedAntagonist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SlicerHiredMuscle.java b/Mage.Sets/src/mage/cards/s/SlicerHiredMuscle.java new file mode 100644 index 00000000000..7e816aa6bc1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SlicerHiredMuscle.java @@ -0,0 +1,123 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.keyword.MoreThanMeetsTheEyeAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.combat.GoadTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.effects.common.continuous.CantBeSacrificedSourceEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.game.Game; +import mage.constants.*; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; +import mage.players.Player; +import mage.abilities.common.SimpleStaticAbility; + +/** + * @author grimreap124 + */ +public final class SlicerHiredMuscle extends CardImpl { + + public SlicerHiredMuscle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT, CardType.CREATURE }, "{4}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ROBOT); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + this.secondSideCardClazz = mage.cards.s.SlicerHighSpeedAntagonist.class; + + // More Than Meets the Eye {2}{R} + this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{R}")); + + // Double strike + this.addAbility(DoubleStrikeAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // At the beginning of each opponent's upkeep, you may have that player gain + // control of Slicer until end of turn. If you do, untap Slicer, goad it, and it + // can't be sacrificed this turn. If you don't, convert it. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SlicerHiredMuscleUpkeepEffect(), + TargetController.OPPONENT, false, true)); + + } + + private SlicerHiredMuscle(final SlicerHiredMuscle card) { + super(card); + } + + @Override + public SlicerHiredMuscle copy() { + return new SlicerHiredMuscle(this); + } +} + +class SlicerHiredMuscleUpkeepEffect extends OneShotEffect { + + SlicerHiredMuscleUpkeepEffect() { + super(Outcome.GainControl); + staticText = "you may have that player gain control of {this} until end of turn. If you do, untap {this}, goad it, and it can't be sacrificed this turn. If you don't, convert it."; + } + + private SlicerHiredMuscleUpkeepEffect(final SlicerHiredMuscleUpkeepEffect effect) { + super(effect); + } + + @Override + public SlicerHiredMuscleUpkeepEffect copy() { + return new SlicerHiredMuscleUpkeepEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + Player player = game.getPlayer(sourcePermanent.getControllerId()); + Player newController = game.getPlayer(getTargetPointer().getFirst(game, source)); + + if (player == null || newController == null || sourcePermanent == null) { + return false; + } + + if (player.chooseUse(this.getOutcome(), source.getRule(), source, game)) { + + // Gain control + game.addEffect(new GainControlTargetEffect(Duration.EndOfTurn, false, newController.getId()) + .setTargetPointer(new FixedTarget(sourcePermanent, game)), source); + + // process action so that untap effects the new controller + game.getState().processAction(game); + + // Untap + sourcePermanent.untap(game); + + // Goad + game.addEffect(new GoadTargetEffect() + .setDuration(Duration.EndOfTurn) + .setTargetPointer(new FixedTarget(sourcePermanent, game)), + source); + + // Can't be sacrificed + game.addEffect(new GainAbilityTargetEffect( + new SimpleStaticAbility( + new CantBeSacrificedSourceEffect().setText("This creature can't be sacrificed")), + Duration.EndOfTurn).setTargetPointer(new FixedTarget(sourcePermanent, game)), source); + + } else { + new TransformSourceEffect().apply(game, source); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Transformers.java b/Mage.Sets/src/mage/sets/Transformers.java index 152d9f65331..1a228b0b29b 100644 --- a/Mage.Sets/src/mage/sets/Transformers.java +++ b/Mage.Sets/src/mage/sets/Transformers.java @@ -37,6 +37,8 @@ public final class Transformers extends ExpansionSet { cards.add(new SetCardInfo("Optimus Prime, Hero", 27, Rarity.MYTHIC, mage.cards.o.OptimusPrimeHero.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ratchet, Field Medic", 2, Rarity.MYTHIC, mage.cards.r.RatchetFieldMedic.class)); cards.add(new SetCardInfo("Ratchet, Rescue Racer", 2, Rarity.MYTHIC, mage.cards.r.RatchetRescueRacer.class)); + cards.add(new SetCardInfo("Slicer, High-Speed Antagonist", 6, Rarity.MYTHIC, mage.cards.s.SlicerHighSpeedAntagonist.class)); + cards.add(new SetCardInfo("Slicer, Hired Muscle", 6, Rarity.MYTHIC, mage.cards.s.SlicerHiredMuscle.class)); cards.add(new SetCardInfo("Starscream, Power Hungry", 5, Rarity.MYTHIC, mage.cards.s.StarscreamPowerHungry.class)); cards.add(new SetCardInfo("Starscream, Seeker Leader", 5, Rarity.MYTHIC, mage.cards.s.StarscreamSeekerLeader.class)); cards.add(new SetCardInfo("Ultra Magnus, Armored Carrier", 15, Rarity.MYTHIC, mage.cards.u.UltraMagnusArmoredCarrier.class));