From 807f69f548446940aefcd0b075afd7e49a8b9883 Mon Sep 17 00:00:00 2001 From: Miquel <36759597+mllagostera@users.noreply.github.com> Date: Tue, 23 Sep 2025 04:42:54 +0200 Subject: [PATCH] [BOT] Implement Cyclonus, the Saboteur (#13963) --- .../cards/c/CyclonusCybertronianFighter.java | 86 +++++++++++++++++++ .../src/mage/cards/c/CyclonusTheSaboteur.java | 74 ++++++++++++++++ Mage.Sets/src/mage/sets/Transformers.java | 2 + 3 files changed, 162 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CyclonusCybertronianFighter.java create mode 100644 Mage.Sets/src/mage/cards/c/CyclonusTheSaboteur.java diff --git a/Mage.Sets/src/mage/cards/c/CyclonusCybertronianFighter.java b/Mage.Sets/src/mage/cards/c/CyclonusCybertronianFighter.java new file mode 100644 index 00000000000..1b21a9e9880 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CyclonusCybertronianFighter.java @@ -0,0 +1,86 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.LivingMetalAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TurnPhase; +import mage.game.Game; +import mage.game.turn.TurnMod; + +import java.util.UUID; + +/** + * @author mllagostera + */ +public final class CyclonusCybertronianFighter extends CardImpl { + + public CyclonusCybertronianFighter(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(5); + this.toughness = new MageInt(5); + this.color.setBlack(true); + this.color.setBlue(true); + this.nightCard = true; + + // Living metal + this.addAbility(new LivingMetalAbility()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Cyclonus deals combat damage to a player, convert it. + // If you do, there is an additional beginning phase after this phase. + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( + new CyclonusCybertronianFighterEffect(), + false + ); + this.addAbility(ability); + } + + private CyclonusCybertronianFighter(final CyclonusCybertronianFighter card) { + super(card); + } + + @Override + public CyclonusCybertronianFighter copy() { + return new CyclonusCybertronianFighter(this); + } +} + +class CyclonusCybertronianFighterEffect extends TransformSourceEffect { + + CyclonusCybertronianFighterEffect() { + super(); + staticText = "transform it. If you do, there is an additional beginning phase after this phase"; + } + + private CyclonusCybertronianFighterEffect(final CyclonusCybertronianFighterEffect effect) { + super(effect); + } + + @Override + public CyclonusCybertronianFighterEffect copy() { + return new CyclonusCybertronianFighterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (!super.apply(game, source)) { + return false; + } + TurnMod beginning = new TurnMod(game.getState().getActivePlayerId()).withExtraPhase(TurnPhase.BEGINNING); + game.getState().getTurnMods().add(beginning); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/c/CyclonusTheSaboteur.java b/Mage.Sets/src/mage/cards/c/CyclonusTheSaboteur.java new file mode 100644 index 00000000000..d5559695d3d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CyclonusTheSaboteur.java @@ -0,0 +1,74 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceMatchesFilterCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.keyword.ConniveSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.MoreThanMeetsTheEyeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.PowerPredicate; + +import java.util.UUID; + +/** + * @author mllagostera + */ +public final class CyclonusTheSaboteur extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(); + + static { + filter.add(new PowerPredicate(ComparisonType.MORE_THAN,4)); + } + + private static final Condition condition = new SourceMatchesFilterCondition(filter); + + public CyclonusTheSaboteur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}{U}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ROBOT); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + this.secondSideCardClazz = mage.cards.c.CyclonusCybertronianFighter.class; + + // More Than Meets the Eye {5}{U}{B} + this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{5}{U}{B}")); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Cyclonus deals combat damage to a player, it connives. + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( + new ConniveSourceEffect("it"), + false, + true + ); + + // Then if Cyclonus's power is 5 or greater, convert it + ability.addEffect((new ConditionalOneShotEffect( + new TransformSourceEffect(), + condition, + "Then if {this}'s power is 5 or greater, convert it." + ))); + + this.addAbility(ability); + } + + private CyclonusTheSaboteur(final CyclonusTheSaboteur card) { + super(card); + } + + @Override + public CyclonusTheSaboteur copy() { + return new CyclonusTheSaboteur(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Transformers.java b/Mage.Sets/src/mage/sets/Transformers.java index 1a228b0b29b..0e8daddb516 100644 --- a/Mage.Sets/src/mage/sets/Transformers.java +++ b/Mage.Sets/src/mage/sets/Transformers.java @@ -23,6 +23,8 @@ public final class Transformers extends ExpansionSet { cards.add(new SetCardInfo("Arcee, Sharpshooter", 7, Rarity.MYTHIC, mage.cards.a.ArceeSharpshooter.class)); cards.add(new SetCardInfo("Blitzwing, Adaptive Assailant", 4, Rarity.MYTHIC, mage.cards.b.BlitzwingAdaptiveAssailant.class)); cards.add(new SetCardInfo("Blitzwing, Cruel Tormentor", 4, Rarity.MYTHIC, mage.cards.b.BlitzwingCruelTormentor.class)); + cards.add(new SetCardInfo("Cyclonus, Cybertronian Fighter", 9, Rarity.MYTHIC, mage.cards.c.CyclonusCybertronianFighter.class)); + cards.add(new SetCardInfo("Cyclonus, the Saboteur", 9, Rarity.MYTHIC, mage.cards.c.CyclonusTheSaboteur.class)); cards.add(new SetCardInfo("Flamewar, Brash Veteran", 10, Rarity.MYTHIC, mage.cards.f.FlamewarBrashVeteran.class)); cards.add(new SetCardInfo("Flamewar, Streetwise Operative", 10, Rarity.MYTHIC, mage.cards.f.FlamewarStreetwiseOperative.class)); cards.add(new SetCardInfo("Goldbug, Humanity's Ally", 11, Rarity.MYTHIC, mage.cards.g.GoldbugHumanitysAlly.class));