From 44fb94782c0f13fb7722640428150ff87c5919e6 Mon Sep 17 00:00:00 2001 From: Svyatoslav28597 <105356842+Svyatoslav28597@users.noreply.github.com> Date: Sat, 24 Aug 2024 08:02:16 +0300 Subject: [PATCH] Add set [YNEO] with six cards; add two [J21] cards plus reprints (#12692) --- .../plugins/card/dl/sources/GathererSets.java | 2 +- .../dl/sources/ScryfallImageSupportCards.java | 1 + .../src/mage/cards/b/BoseijuPathlighter.java | 61 ++++++++++++ .../src/mage/cards/d/DragonflyPilot.java | 41 ++++++++ .../src/mage/cards/e/ExperimentalPilot.java | 75 +++++++++++++++ .../src/mage/cards/j/JukaiLiberator.java | 89 ++++++++++++++++++ .../src/mage/cards/k/KamiOfBambooGroves.java | 45 +++++++++ .../src/mage/cards/k/KioraTheTidesFury.java | 63 +++++++++++++ .../src/mage/cards/s/SubversiveAcolyte.java | 94 +++++++++++++++++++ Mage.Sets/src/mage/cards/s/SwarmSaboteur.java | 48 ++++++++++ Mage.Sets/src/mage/sets/AlchemyKamigawa.java | 32 +++++++ .../mage/sets/JumpstartHistoricHorizons.java | 19 ++++ 12 files changed, 569 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/b/BoseijuPathlighter.java create mode 100644 Mage.Sets/src/mage/cards/d/DragonflyPilot.java create mode 100644 Mage.Sets/src/mage/cards/e/ExperimentalPilot.java create mode 100644 Mage.Sets/src/mage/cards/j/JukaiLiberator.java create mode 100644 Mage.Sets/src/mage/cards/k/KamiOfBambooGroves.java create mode 100644 Mage.Sets/src/mage/cards/k/KioraTheTidesFury.java create mode 100644 Mage.Sets/src/mage/cards/s/SubversiveAcolyte.java create mode 100644 Mage.Sets/src/mage/cards/s/SwarmSaboteur.java create mode 100644 Mage.Sets/src/mage/sets/AlchemyKamigawa.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java index aa9dbf2254d..f12baabcae2 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java @@ -101,7 +101,7 @@ public class GathererSets implements Iterable { "C19", "ELD", "MB1", "GN2", "J20", "THB", "UND", "C20", "IKO", "M21", "JMP", "2XM", "ZNR", "KLR", "CMR", "KHC", "KHM", "TSR", "STX", "STA", "C21", "MH2", "AFR", "AFC", "J21", "MID", "MIC", "VOW", "VOC", "YMID", - "NEC", "NEO", "SNC", "NCC", "CLB", "2X2", "DMU", "DMC", "YDMU", "40K", "GN3", + "NEC", "YNEO", "NEO", "SNC", "NCC", "CLB", "2X2", "DMU", "DMC", "YDMU", "40K", "GN3", "UNF", "BRO", "BRC", "BOT", "30A", "J22", "SCD", "DMR", "ONE", "ONC", "MOM", "MOC", "MUL", "MAT", "LTR", "CMM", "WOE", "WHO", "RVR", "WOT", "WOC", "SPG", "LCI", "LCC", "REX", "PIP", "MKM", "MKC", "CLU", "OTJ", diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java index 7647ff08f8a..0ebb003fde6 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java @@ -503,6 +503,7 @@ public class ScryfallImageSupportCards { add("DBL"); // Innistrad: Double Feature add("CC2"); // Commander Collection: Black add("NEO"); // Kamigawa: Neon Dynasty + add("YNEO"); // Alchemy: Kamigawa add("NEC"); // Neon Dynasty Commander add("PL22"); // Year of the Tiger 2022 add("SNC"); // Streets of New Capenna diff --git a/Mage.Sets/src/mage/cards/b/BoseijuPathlighter.java b/Mage.Sets/src/mage/cards/b/BoseijuPathlighter.java new file mode 100644 index 00000000000..e683ba31eb6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoseijuPathlighter.java @@ -0,0 +1,61 @@ +package mage.cards.b; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DraftFromSpellbookEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * @author Svyatoslav28 + */ +public final class BoseijuPathlighter extends CardImpl { + + private static final List spellbook = Collections.unmodifiableList(Arrays.asList( + "Bonders' Enclave", + "Boseiju, Who Endures", + "Emergence Zone", + "Field of Ruin", + "Gingerbread Cabin", + "Hall of Oracles", + "Khalni Garden", + "Memorial to Unity", + "Mobilized District", + "Radiant Fountain", + "Roadside Reliquary", + "Scavenger Grounds", + "Secluded Courtyard", + "Thriving Grove", + "Treasure vault" + )); + + public BoseijuPathlighter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Boseiju Pathlighter enters the battlefield, draft a card from Boseiju Pathlighter's spellbook. + Ability ability = new EntersBattlefieldTriggeredAbility(new DraftFromSpellbookEffect(spellbook)); + this.addAbility(ability); + } + + private BoseijuPathlighter(final BoseijuPathlighter card) { + super(card); + } + + @Override + public BoseijuPathlighter copy() { + return new BoseijuPathlighter(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonflyPilot.java b/Mage.Sets/src/mage/cards/d/DragonflyPilot.java new file mode 100644 index 00000000000..3767560d0a4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonflyPilot.java @@ -0,0 +1,41 @@ +package mage.cards.d; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.common.CrewIncreasedPowerAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ConjureCardEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * @author Svyatoslav28 + */ +public final class DragonflyPilot extends CardImpl { + + public DragonflyPilot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.FOX); + this.subtype.add(SubType.PILOT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Dragonfly Pilot enters the battlefield, conjure a card named Dragonfly Suit into your hand. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConjureCardEffect("Dragonfly Suit"))); + // Dragonfly Pilot crews Vehicles as though its power were 2 greater. + this.addAbility(new CrewIncreasedPowerAbility()); + } + + private DragonflyPilot(final DragonflyPilot card) { + super(card); + } + + @Override + public DragonflyPilot copy() { + return new DragonflyPilot(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/ExperimentalPilot.java b/Mage.Sets/src/mage/cards/e/ExperimentalPilot.java new file mode 100644 index 00000000000..d01efe3f128 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ExperimentalPilot.java @@ -0,0 +1,75 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CrewIncreasedPowerAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DraftFromSpellbookEffect; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInHand; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +/** + * @author Svyatoslav28 + */ +public final class ExperimentalPilot extends CardImpl { + + private static final List spellbook = Collections.unmodifiableList(Arrays.asList( + "Bomat Bazaar Barge", + "Cultivator's Caravan", + "Daredevil Dragster", + "Demolition Stomper", + "Futurist Sentinel", + "High-Speed Hoverbike", + "Mechtitan Core", + "Mindlink Mech", + "Mobile Garrison", + "Ovalchase Dragster", + "Raiders' Karve", + "Reckoner Bankbuster", + "Silent Submersible", + "Thundering Chariot", + "Untethered Express" + )); + + public ExperimentalPilot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.PILOT); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Ward {2} + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + + // {U}, Discard two cards: Draft a card from Experimental Pilot's spellbook. + Ability ability = new SimpleActivatedAbility( + new DraftFromSpellbookEffect(spellbook), new ManaCostsImpl<>("{U}") + ); + ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS))); + this.addAbility(ability); + // Experimental Pilot crews Vehicles as though its power were 2 greater. + this.addAbility(new CrewIncreasedPowerAbility()); + } + + private ExperimentalPilot(final ExperimentalPilot card) { + super(card); + } + + @Override + public ExperimentalPilot copy() { + return new ExperimentalPilot(this); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JukaiLiberator.java b/Mage.Sets/src/mage/cards/j/JukaiLiberator.java new file mode 100644 index 00000000000..90b68f80dc6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JukaiLiberator.java @@ -0,0 +1,89 @@ + +package mage.cards.j; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.NinjutsuAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; + +import java.util.UUID; + + +/** + * @author Svyatoslav28 + */ + +public final class JukaiLiberator extends CardImpl { + + public JukaiLiberator(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.NINJA); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Ninjutsu {1}{G} + this.addAbility(new NinjutsuAbility("{1}{G}")); + + // Whenever Jukai Liberator deals combat damage to a player, choose land or nonland. Seek a permanent card of the chosen type. + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new JukaiLiberatorEffect()); + this.addAbility(ability); + } + + private JukaiLiberator(final JukaiLiberator card) { + super(card); + } + + @Override + public JukaiLiberator copy() { + return new JukaiLiberator(this); + } +} + +class JukaiLiberatorEffect extends OneShotEffect { + + JukaiLiberatorEffect() { + super(Outcome.Benefit); + staticText = "choose land or nonland." + + " Seek a permanent card of the chosen kind."; + } + + private JukaiLiberatorEffect(final JukaiLiberatorEffect effect) { + super(effect); + } + + @Override + public JukaiLiberatorEffect copy() { + return new JukaiLiberatorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + boolean land = player.chooseUse( + Outcome.Neutral, "Choose land or nonland", null, + "Land", "Nonland", source, game + ); + if (land) { + player.seekCard(StaticFilters.FILTER_CARD_LAND, source, game); + } else { + player.seekCard(StaticFilters.FILTER_CARD_NON_LAND, source, game); + } + return true; + } +} + + diff --git a/Mage.Sets/src/mage/cards/k/KamiOfBambooGroves.java b/Mage.Sets/src/mage/cards/k/KamiOfBambooGroves.java new file mode 100644 index 00000000000..d29d0e775f5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KamiOfBambooGroves.java @@ -0,0 +1,45 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ConjureCardEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; +import mage.abilities.keyword.ChannelAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author Svyatoslav28 + */ +public final class KamiOfBambooGroves extends CardImpl { + + public KamiOfBambooGroves(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.SPIRIT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Kami of Bamboo Groves enters the battlefield, you may put a land card from your hand onto the battlefield tapped. + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect( + StaticFilters.FILTER_CARD_LAND_A, false, true + ), false)); + // Channel -- {2}{G}, Discard Kami of Bamboo Groves: Conjure two cards named Forest into your hand. + this.addAbility(new ChannelAbility("{2}{G}", new ConjureCardEffect("Forest", Zone.HAND, 2))); + } + + private KamiOfBambooGroves(final KamiOfBambooGroves card) { + super(card); + } + + @Override + public KamiOfBambooGroves copy() { + return new KamiOfBambooGroves(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KioraTheTidesFury.java b/Mage.Sets/src/mage/cards/k/KioraTheTidesFury.java new file mode 100644 index 00000000000..955a40ea338 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KioraTheTidesFury.java @@ -0,0 +1,63 @@ +package mage.cards.k; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.game.permanent.token.KrakenToken; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author Svyatoslav28 + */ +public final class KioraTheTidesFury extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent (SubType.KRAKEN, "Kraken"); + + public KioraTheTidesFury(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{U}"); + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.KIORA); + + this.setStartingLoyalty(4); + + // +1: Conjure a card named Kraken Hatchling into your hand. + LoyaltyAbility ability = new LoyaltyAbility((new ConjureCardEffect("Kraken Hatchling")), 1); + this.addAbility(ability); + + // +1: Untap target creature or land. Prevent all damage that would be dealt to and dealt by that permanent until your next turn. + Ability secondAbility = new LoyaltyAbility(new UntapTargetEffect(), 1); + secondAbility.addEffect(new PreventDamageToTargetEffect(Duration.UntilYourNextTurn) + .setText("Prevent all damage that would be dealt to")); + secondAbility.addEffect(new PreventDamageByTargetEffect(Duration.UntilYourNextTurn, false) + .setText(" and dealt by that permanent until your next turn.")); + secondAbility.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE_OR_LAND)); + this.addAbility(secondAbility); + + + // −3: You may sacrifice a Kraken. If you do, create an 8/8 blue Kraken creature token. + this.addAbility(new LoyaltyAbility(new DoIfCostPaid( + new CreateTokenEffect(new KrakenToken()), + new SacrificeTargetCost(filter)), + -3)); + } + + private KioraTheTidesFury(final KioraTheTidesFury card) { + super(card); + } + + @Override + public KioraTheTidesFury copy() { + return new KioraTheTidesFury(this); + } +} + diff --git a/Mage.Sets/src/mage/cards/s/SubversiveAcolyte.java b/Mage.Sets/src/mage/cards/s/SubversiveAcolyte.java new file mode 100644 index 00000000000..863d83a40c2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SubversiveAcolyte.java @@ -0,0 +1,94 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.ActivateOncePerGameActivatedAbility; +import mage.abilities.common.DealtDamageToSourceTriggeredAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.common.SavedDamageValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; +import mage.abilities.effects.common.continuous.AddCardSubTypeSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * @author Svyatoslav28 + */ +public final class SubversiveAcolyte extends CardImpl { + + public SubversiveAcolyte(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.HUMAN); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {2}: Pay 2 life: Choose one. Activate only once. + // * Subversive Acolyte becomes a Human Cleric. It gets +1/+1 and gains lifelink. + Ability ability = new ActivateOncePerGameActivatedAbility(Zone.BATTLEFIELD, new AddCardSubTypeSourceEffect(Duration.WhileOnBattlefield, SubType.HUMAN, SubType.CLERIC).setText("{this} becomes a Human Cleric"), + new GenericManaCost(2), TimingRule.INSTANT); + ability.addEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield).setText("It gains +1/+1")); + ability.addEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield).setText(" and gains lifelink")); + ability.addCost(new PayLifeCost(2)); + + // * Subversive Acolyte becomes a Phyrexian. It gets +3/+2 and gains trample and “Whenever this creature is dealt damage, sacrifice that many permanents.” + ability.addMode(new Mode(new PhyrexianModeEffect())); + this.addAbility(ability); + } + + private SubversiveAcolyte(final SubversiveAcolyte card) { + super(card); + } + + @Override + public SubversiveAcolyte copy() { + return new SubversiveAcolyte(this); + } +} + +class PhyrexianModeEffect extends OneShotEffect { + + PhyrexianModeEffect() { + super(Outcome.Benefit); + staticText = "{this} becomes a Phyrexian. It gets +3/+2 " + + "and gains trample and \"Whenever this creature is dealt damage, sacrifice that many permanents.\""; + } + + private PhyrexianModeEffect(final PhyrexianModeEffect effect) { + super(effect); + } + + @Override + public PhyrexianModeEffect copy() { + return new PhyrexianModeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null) { + return false; + } + game.addEffect(new AddCardSubTypeSourceEffect(Duration.WhileOnBattlefield, SubType.PHYREXIAN), source); + game.addEffect(new BoostSourceEffect(3, 2, Duration.WhileOnBattlefield), source); + game.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield), source); + game.addEffect(new GainAbilitySourceEffect( + new DealtDamageToSourceTriggeredAbility( + new SacrificeControllerEffect(StaticFilters.FILTER_PERMANENTS, SavedDamageValue.MANY, ""),false), + Duration.WhileOnBattlefield), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SwarmSaboteur.java b/Mage.Sets/src/mage/cards/s/SwarmSaboteur.java new file mode 100644 index 00000000000..15c68444a45 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SwarmSaboteur.java @@ -0,0 +1,48 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.ConjureCardEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.NinjutsuAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author Svyatoslav28 + */ +public final class SwarmSaboteur extends CardImpl { + + public SwarmSaboteur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.NINJA); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Ninjutsu {B} + this.addAbility(new NinjutsuAbility("{B}")); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Whenever Swarm Saboteur deals combat damage to a player, conjure a card named Virus Beetle into your hand. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + (new ConjureCardEffect("Virus Beetle")) + )); + } + + private SwarmSaboteur(final SwarmSaboteur card) { + super(card); + } + + @Override + public SwarmSaboteur copy() { + return new SwarmSaboteur(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AlchemyKamigawa.java b/Mage.Sets/src/mage/sets/AlchemyKamigawa.java new file mode 100644 index 00000000000..a040f4cdc7d --- /dev/null +++ b/Mage.Sets/src/mage/sets/AlchemyKamigawa.java @@ -0,0 +1,32 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author karapuzz14 + */ +public final class AlchemyKamigawa extends ExpansionSet { + + private static final AlchemyKamigawa instance = new AlchemyKamigawa(); + + public static AlchemyKamigawa getInstance() { + return instance; + } + + private AlchemyKamigawa() { + super("Alchemy: Kamigawa", "YNEO", ExpansionSet.buildDate(2022, 3, 17), SetType.MAGIC_ARENA); + this.blockName = "Alchemy"; + this.hasBoosters = false; + this.hasBasicLands = false; + + cards.add(new SetCardInfo("Boseiju Pathlighter", 26, Rarity.RARE, mage.cards.b.BoseijuPathlighter.class)); + cards.add(new SetCardInfo("Dragonfly Pilot", 1, Rarity.UNCOMMON, mage.cards.d.DragonflyPilot.class)); + cards.add(new SetCardInfo("Experimental Pilot", 6, Rarity.UNCOMMON, mage.cards.e.ExperimentalPilot.class)); + cards.add(new SetCardInfo("Jukai Liberator", 27, Rarity.RARE, mage.cards.j.JukaiLiberator.class)); + cards.add(new SetCardInfo("Kami of Bamboo Groves", 24, Rarity.UNCOMMON, mage.cards.k.KamiOfBambooGroves.class)); + cards.add(new SetCardInfo("Swarm Saboteur", 13, Rarity.RARE, mage.cards.s.SwarmSaboteur.class)); + + } +} diff --git a/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java b/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java index 17a881be011..39b54ca1d8b 100644 --- a/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java +++ b/Mage.Sets/src/mage/sets/JumpstartHistoricHorizons.java @@ -43,6 +43,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Arcbound Whelp", 410, Rarity.UNCOMMON, mage.cards.a.ArcboundWhelp.class)); cards.add(new SetCardInfo("Archfiend of Sorrows", 285, Rarity.UNCOMMON, mage.cards.a.ArchfiendOfSorrows.class)); cards.add(new SetCardInfo("Archmage's Charm", 166, Rarity.RARE, mage.cards.a.ArchmagesCharm.class)); + cards.add(new SetCardInfo("Assault Strobe", 786, Rarity.COMMON, mage.cards.a.AssaultStrobe.class)); cards.add(new SetCardInfo("Arcus Acolyte", 678, Rarity.UNCOMMON, mage.cards.a.ArcusAcolyte.class)); cards.add(new SetCardInfo("Asylum Visitor", 286, Rarity.RARE, mage.cards.a.AsylumVisitor.class)); cards.add(new SetCardInfo("Awaken the Bear", 542, Rarity.COMMON, mage.cards.a.AwakenTheBear.class)); @@ -98,6 +99,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Cordial Vampire", 306, Rarity.RARE, mage.cards.c.CordialVampire.class)); cards.add(new SetCardInfo("Crocanura", 557, Rarity.COMMON, mage.cards.c.Crocanura.class)); cards.add(new SetCardInfo("Dark Salvation", 308, Rarity.RARE, mage.cards.d.DarkSalvation.class)); + cards.add(new SetCardInfo("Dark Ritual", 783, Rarity.COMMON, mage.cards.d.DarkRitual.class)); cards.add(new SetCardInfo("Death Wind", 314, Rarity.COMMON, mage.cards.d.DeathWind.class)); cards.add(new SetCardInfo("Deepwood Denizen", 558, Rarity.COMMON, mage.cards.d.DeepwoodDenizen.class)); cards.add(new SetCardInfo("Devouring Light", 67, Rarity.UNCOMMON, mage.cards.d.DevouringLight.class)); @@ -112,6 +114,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Dragon's Rage Channeler", 438, Rarity.UNCOMMON, mage.cards.d.DragonsRageChanneler.class)); cards.add(new SetCardInfo("Dregscape Sliver", 319, Rarity.UNCOMMON, mage.cards.d.DregscapeSliver.class)); cards.add(new SetCardInfo("Drey Keeper", 687, Rarity.COMMON, mage.cards.d.DreyKeeper.class)); + cards.add(new SetCardInfo("Duress", 784, Rarity.COMMON, mage.cards.d.Duress.class)); cards.add(new SetCardInfo("Duskshell Crawler", 561, Rarity.COMMON, mage.cards.d.DuskshellCrawler.class)); cards.add(new SetCardInfo("Echoing Return", 320, Rarity.COMMON, mage.cards.e.EchoingReturn.class)); cards.add(new SetCardInfo("Elusive Krasis", 688, Rarity.UNCOMMON, mage.cards.e.ElusiveKrasis.class)); @@ -136,6 +139,8 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Fists of Flame", 443, Rarity.COMMON, mage.cards.f.FistsOfFlame.class)); cards.add(new SetCardInfo("Fleshbag Marauder", 331, Rarity.UNCOMMON, mage.cards.f.FleshbagMarauder.class)); cards.add(new SetCardInfo("Floodhound", 193, Rarity.COMMON, mage.cards.f.Floodhound.class)); + cards.add(new SetCardInfo("Fog", 789, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force Spike", 780, Rarity.COMMON, mage.cards.f.ForceSpike.class)); cards.add(new SetCardInfo("Foul Watcher", 194, Rarity.COMMON, mage.cards.f.FoulWatcher.class)); cards.add(new SetCardInfo("Foundry Street Denizen", 446, Rarity.COMMON, mage.cards.f.FoundryStreetDenizen.class)); cards.add(new SetCardInfo("Funnel-Web Recluse", 573, Rarity.COMMON, mage.cards.f.FunnelWebRecluse.class)); @@ -143,6 +148,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Galvanic Relay", 450, Rarity.COMMON, mage.cards.g.GalvanicRelay.class)); cards.add(new SetCardInfo("Geomancer's Gambit", 452, Rarity.COMMON, mage.cards.g.GeomancersGambit.class)); cards.add(new SetCardInfo("Ghost-Lit Drifter", 196, Rarity.UNCOMMON, mage.cards.g.GhostLitDrifter.class)); + cards.add(new SetCardInfo("Giant Growth", 790, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); cards.add(new SetCardInfo("Gilded Light", 86, Rarity.COMMON, mage.cards.g.GildedLight.class)); cards.add(new SetCardInfo("Gilt-Blade Prowler", 332, Rarity.COMMON, mage.cards.g.GiltBladeProwler.class)); cards.add(new SetCardInfo("Glimmer Bairn", 576, Rarity.COMMON, mage.cards.g.GlimmerBairn.class)); @@ -171,6 +177,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Hollowhead Sliver", 469, Rarity.UNCOMMON, mage.cards.h.HollowheadSliver.class)); cards.add(new SetCardInfo("Hordeling Outburst", 470, Rarity.UNCOMMON, mage.cards.h.HordelingOutburst.class)); cards.add(new SetCardInfo("Hunting Pack", 587, Rarity.UNCOMMON, mage.cards.h.HuntingPack.class)); + cards.add(new SetCardInfo("Ichor Wellspring", 763, Rarity.COMMON, mage.cards.i.IchorWellspring.class)); cards.add(new SetCardInfo("Igneous Elemental", 471, Rarity.COMMON, mage.cards.i.IgneousElemental.class)); cards.add(new SetCardInfo("Implement of Combustion", 744, Rarity.COMMON, mage.cards.i.ImplementOfCombustion.class)); cards.add(new SetCardInfo("Impostor of the Sixth Pride", 96, Rarity.COMMON, mage.cards.i.ImpostorOfTheSixthPride.class)); @@ -186,8 +193,10 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Just the Wind", 205, Rarity.COMMON, mage.cards.j.JustTheWind.class)); cards.add(new SetCardInfo("Khalni Garden", 770, Rarity.COMMON, mage.cards.k.KhalniGarden.class)); cards.add(new SetCardInfo("King of the Pride", 99, Rarity.UNCOMMON, mage.cards.k.KingOfThePride.class)); + cards.add(new SetCardInfo("Kiora, the Tide's Fury", 10, Rarity.MYTHIC, mage.cards.k.KioraTheTidesFury.class)); cards.add(new SetCardInfo("Kitchen Imp", 342, Rarity.COMMON, mage.cards.k.KitchenImp.class)); cards.add(new SetCardInfo("Kor Skyfisher", 100, Rarity.COMMON, mage.cards.k.KorSkyfisher.class)); + cards.add(new SetCardInfo("Kraken Hatchling", 781, Rarity.COMMON, mage.cards.k.KrakenHatchling.class)); cards.add(new SetCardInfo("Krenko's Command", 480, Rarity.COMMON, mage.cards.k.KrenkosCommand.class)); cards.add(new SetCardInfo("Kuldotha Flamefiend", 481, Rarity.UNCOMMON, mage.cards.k.KuldothaFlamefiend.class)); cards.add(new SetCardInfo("Lancer Sliver", 102, Rarity.COMMON, mage.cards.l.LancerSliver.class)); @@ -196,7 +205,9 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Lazotep Chancellor", 702, Rarity.UNCOMMON, mage.cards.l.LazotepChancellor.class)); cards.add(new SetCardInfo("Leeching Sliver", 344, Rarity.UNCOMMON, mage.cards.l.LeechingSliver.class)); cards.add(new SetCardInfo("Legion Vanguard", 345, Rarity.UNCOMMON, mage.cards.l.LegionVanguard.class)); + cards.add(new SetCardInfo("Lightning Bolt", 787, Rarity.COMMON, mage.cards.l.LightningBolt.class)); cards.add(new SetCardInfo("Lightning Spear", 484, Rarity.COMMON, mage.cards.l.LightningSpear.class)); + cards.add(new SetCardInfo("Light of Hope", 777, Rarity.COMMON, mage.cards.l.LightOfHope.class)); cards.add(new SetCardInfo("Llanowar Tribe", 598, Rarity.UNCOMMON, mage.cards.l.LlanowarTribe.class)); cards.add(new SetCardInfo("Lonis, Cryptozoologist", 703, Rarity.RARE, mage.cards.l.LonisCryptozoologist.class)); cards.add(new SetCardInfo("Mad Prophet", 487, Rarity.COMMON, mage.cards.m.MadProphet.class)); @@ -236,6 +247,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Pashalik Mons", 495, Rarity.RARE, mage.cards.p.PashalikMons.class)); cards.add(new SetCardInfo("Phantasmal Form", 229, Rarity.COMMON, mage.cards.p.PhantasmalForm.class)); cards.add(new SetCardInfo("Phantom Ninja", 230, Rarity.COMMON, mage.cards.p.PhantomNinja.class)); + cards.add(new SetCardInfo("Ponder", 782, Rarity.COMMON, mage.cards.p.Ponder.class)); cards.add(new SetCardInfo("Pondering Mage", 231, Rarity.COMMON, mage.cards.p.PonderingMage.class)); cards.add(new SetCardInfo("Predatory Sliver", 619, Rarity.COMMON, mage.cards.p.PredatorySliver.class)); cards.add(new SetCardInfo("Prey's Vengeance", 620, Rarity.COMMON, mage.cards.p.PreysVengeance.class)); @@ -251,10 +263,12 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Ravenous Squirrel", 728, Rarity.UNCOMMON, mage.cards.r.RavenousSquirrel.class)); cards.add(new SetCardInfo("Raving Visionary", 234, Rarity.UNCOMMON, mage.cards.r.RavingVisionary.class)); cards.add(new SetCardInfo("Reap the Past", 710, Rarity.RARE, mage.cards.r.ReapThePast.class)); + cards.add(new SetCardInfo("Reassembling Skeleton", 785, Rarity.UNCOMMON, mage.cards.r.ReassemblingSkeleton.class)); cards.add(new SetCardInfo("Recalibrate", 235, Rarity.COMMON, mage.cards.r.Recalibrate.class)); cards.add(new SetCardInfo("Reckless Charge", 500, Rarity.COMMON, mage.cards.r.RecklessCharge.class)); cards.add(new SetCardInfo("Reckless Racer", 501, Rarity.UNCOMMON, mage.cards.r.RecklessRacer.class)); cards.add(new SetCardInfo("Reckless Wurm", 502, Rarity.UNCOMMON, mage.cards.r.RecklessWurm.class)); + cards.add(new SetCardInfo("Regal Force", 791, Rarity.RARE, mage.cards.r.RegalForce.class)); cards.add(new SetCardInfo("Renegade Tactics", 503, Rarity.COMMON, mage.cards.r.RenegadeTactics.class)); cards.add(new SetCardInfo("Reprobation", 116, Rarity.COMMON, mage.cards.r.Reprobation.class)); cards.add(new SetCardInfo("Restoration Angel", 117, Rarity.RARE, mage.cards.r.RestorationAngel.class)); @@ -288,6 +302,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Servant of the Scale", 635, Rarity.COMMON, mage.cards.s.ServantOfTheScale.class)); cards.add(new SetCardInfo("Shambleshark", 714, Rarity.COMMON, mage.cards.s.Shambleshark.class)); cards.add(new SetCardInfo("Shelter", 133, Rarity.COMMON, mage.cards.s.Shelter.class)); + cards.add(new SetCardInfo("Shivan Drgaon", 788, Rarity.RARE, mage.cards.s.ShivanDragon.class)); cards.add(new SetCardInfo("Shiv's Embrace", 511, Rarity.UNCOMMON, mage.cards.s.ShivsEmbrace.class)); cards.add(new SetCardInfo("Shoreline Scout", 12, Rarity.UNCOMMON, mage.cards.s.ShorelineScout.class)); cards.add(new SetCardInfo("Sinister Starfish", 383, Rarity.COMMON, mage.cards.s.SinisterStarfish.class)); @@ -316,13 +331,16 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Sterling Grove", 720, Rarity.RARE, mage.cards.s.SterlingGrove.class)); cards.add(new SetCardInfo("Stirring Address", 145, Rarity.COMMON, mage.cards.s.StirringAddress.class)); cards.add(new SetCardInfo("Stitchwing Skaab", 256, Rarity.UNCOMMON, mage.cards.s.StitchwingSkaab.class)); + cards.add(new SetCardInfo("Stormfront Pegasus", 778, Rarity.UNCOMMON, mage.cards.s.StormfrontPegasus.class)); cards.add(new SetCardInfo("Storm God's Oracle", 721, Rarity.COMMON, mage.cards.s.StormGodsOracle.class)); cards.add(new SetCardInfo("Strike It Rich", 521, Rarity.UNCOMMON, mage.cards.s.StrikeItRich.class)); cards.add(new SetCardInfo("Striking Sliver", 522, Rarity.COMMON, mage.cards.s.StrikingSliver.class)); cards.add(new SetCardInfo("Striped Bears", 648, Rarity.COMMON, mage.cards.s.StripedBears.class)); + cards.add(new SetCardInfo("Subversive Acolyte", 19, Rarity.RARE, mage.cards.s.SubversiveAcolyte.class)); cards.add(new SetCardInfo("Sudden Edict", 389, Rarity.UNCOMMON, mage.cards.s.SuddenEdict.class)); cards.add(new SetCardInfo("Sustainer of the Realm", 146, Rarity.COMMON, mage.cards.s.SustainerOfTheRealm.class)); cards.add(new SetCardInfo("Svyelun of Sea and Sky", 259, Rarity.MYTHIC, mage.cards.s.SvyelunOfSeaAndSky.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 779, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); cards.add(new SetCardInfo("Sylvan Anthem", 649, Rarity.RARE, mage.cards.s.SylvanAnthem.class)); cards.add(new SetCardInfo("Sythis, Harvest's Hand", 722, Rarity.RARE, mage.cards.s.SythisHarvestsHand.class)); cards.add(new SetCardInfo("Tajuru Pathwarden", 650, Rarity.COMMON, mage.cards.t.TajuruPathwarden.class)); @@ -343,6 +361,7 @@ public final class JumpstartHistoricHorizons extends ExpansionSet { cards.add(new SetCardInfo("Tireless Provisioner", 655, Rarity.UNCOMMON, mage.cards.t.TirelessProvisioner.class)); cards.add(new SetCardInfo("Tourach's Canticle", 393, Rarity.COMMON, mage.cards.t.TourachsCanticle.class)); cards.add(new SetCardInfo("Treasure Keeper", 758, Rarity.UNCOMMON, mage.cards.t.TreasureKeeper.class)); + cards.add(new SetCardInfo("Tropical Island", 792, Rarity.RARE, mage.cards.t.TropicalIsland.class)); cards.add(new SetCardInfo("Trumpeting Herd", 659, Rarity.COMMON, mage.cards.t.TrumpetingHerd.class)); cards.add(new SetCardInfo("Twin-Silk Spider", 660, Rarity.COMMON, mage.cards.t.TwinSilkSpider.class)); cards.add(new SetCardInfo("Ulvenwald Mysteries", 661, Rarity.UNCOMMON, mage.cards.u.UlvenwaldMysteries.class));