From 9d833813268c205e88fed7d7bdc3434a1004c1cf Mon Sep 17 00:00:00 2001 From: Sidorovich77 Date: Thu, 22 Aug 2024 21:25:37 +0300 Subject: [PATCH] [UNF] Implement Atomwheel Acrobats & Six-Sided Die (#12651) * Implemented cards: Atomwheel Acrobats, Six-Sided Die. * Implemented cards: Atomwheel Acrobats, Six-Sided Die. * Implemented cards: Atomwheel Acrobats, Six-Sided Die. * Changes from review. * Changes from review. * Changes from review. --- .../src/mage/cards/a/AtomwheelAcrobats.java | 120 ++++++++++++++++++ Mage.Sets/src/mage/cards/s/SixSidedDie.java | 109 ++++++++++++++++ Mage.Sets/src/mage/sets/Unfinity.java | 2 + .../src/main/java/mage/constants/SubType.java | 1 + 4 files changed, 232 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AtomwheelAcrobats.java create mode 100644 Mage.Sets/src/mage/cards/s/SixSidedDie.java diff --git a/Mage.Sets/src/mage/cards/a/AtomwheelAcrobats.java b/Mage.Sets/src/mage/cards/a/AtomwheelAcrobats.java new file mode 100644 index 00000000000..8ea23bace4f --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AtomwheelAcrobats.java @@ -0,0 +1,120 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.RollDiceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.DieRolledEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * @author Sidorovich77 + */ +public final class AtomwheelAcrobats extends CardImpl { + + public AtomwheelAcrobats(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.PERFORMER); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Whenever you roll a 1 or 2, put that many +1/+1 counters on Atomwheel Acrobats. + this.addAbility(new AtomwheelAcrobatsTriggeredAbility()); + + // {2}{G}: Roll a six-sided die. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RollDiceEffect(null, 6), new ManaCostsImpl<>("{2}{G}")); + this.addAbility(ability); + } + + private AtomwheelAcrobats(final AtomwheelAcrobats card) { + super(card); + } + + @Override + public AtomwheelAcrobats copy() { + return new AtomwheelAcrobats(this); + } +} + +// Based on Mr. House, President and CEO +class AtomwheelAcrobatsTriggeredAbility extends TriggeredAbilityImpl { + + public AtomwheelAcrobatsTriggeredAbility() { + super(Zone.BATTLEFIELD, new AtomwheelAcrobatsCountersEffect(), false); + } + + private AtomwheelAcrobatsTriggeredAbility(final AtomwheelAcrobatsTriggeredAbility ability) { + super(ability); + } + + @Override + public AtomwheelAcrobatsTriggeredAbility copy() { + return new AtomwheelAcrobatsTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DIE_ROLLED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DieRolledEvent drEvent = (DieRolledEvent) event; + if (this.isControlledBy(event.getTargetId()) && drEvent.getRollDieType() == RollDieType.NUMERICAL) { + int result = drEvent.getResult(); + if (result == 1 || result == 2) { + this.getEffects().setValue("rolled", result); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever you roll a 1 or 2, put that many +1/+1 counters on {this}."; + } +} + +class AtomwheelAcrobatsCountersEffect extends OneShotEffect { + + AtomwheelAcrobatsCountersEffect() { + super(Outcome.Benefit); + } + + private AtomwheelAcrobatsCountersEffect(final AtomwheelAcrobatsCountersEffect effect) { + super(effect); + } + + @Override + public AtomwheelAcrobatsCountersEffect copy() { + return new AtomwheelAcrobatsCountersEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (getValue("rolled") == null) { + return false; + } + int amount = (Integer) getValue("rolled"); + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + if (sourcePermanent == null) { + return false; + } + sourcePermanent.addCounters(CounterType.P1P1.createInstance(amount), source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SixSidedDie.java b/Mage.Sets/src/mage/cards/s/SixSidedDie.java new file mode 100644 index 00000000000..83d1fe6912d --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SixSidedDie.java @@ -0,0 +1,109 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author Sidorovich77 + */ +public final class SixSidedDie extends CardImpl { + + public SixSidedDie(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}"); + + // Choose target creature. Roll a six-sided die. + // + //1 — It has base toughness 1 until end of turn. + // + //2 — Put two -1/-1 counters on it. + // + //3 — Six-Sided Die deals 3 damage to it, and you gain 3 life. + // + //4 — It gets -4/-4 until end of turn. + // + //5 — Destroy it. + // + //6 — Exile it. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new SixSidedDieEffect()); + } + + private SixSidedDie(final SixSidedDie card) { + super(card); + } + + @Override + public SixSidedDie copy() { + return new SixSidedDie(this); + } +} + +class SixSidedDieEffect extends OneShotEffect { + + SixSidedDieEffect() { + super(Outcome.Benefit); + setText("choose target creature. Roll a six-sided die." + + "
1 — It has base toughness 1 until end of turn." + + "
2 — Put two -1/-1 counters on it." + + "
3 — {this} deals 3 damage to it and you gain 3 life." + + "
4 — It gets -4/-4 until end of turn." + + "
5 — Destroy it." + + "
6 — Exile it."); + } + + private SixSidedDieEffect(final SixSidedDieEffect effect) { + super(effect); + } + + @Override + public SixSidedDieEffect copy() { + return new SixSidedDieEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (player == null || permanent == null) { + return false; + } + int result = player.rollDice(outcome, source, game, 1); + switch (result) { + case 6: + game.addEffect(new SetBasePowerToughnessTargetEffect(1, 1, Duration.EndOfTurn), source); + break; + case 2: + permanent.addCounters(CounterType.M1M1.createInstance(2), source, game); + break; + case 3: + permanent.damage(3, source, game); + player.gainLife(3, game, source); + break; + case 4: + game.addEffect(new BoostTargetEffect(-4, -4, Duration.EndOfTurn), source); + break; + case 5: + permanent.destroy(source, game); + break; + case 1: + player.moveCards(permanent, Zone.EXILED, source, game); + break; + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/Unfinity.java b/Mage.Sets/src/mage/sets/Unfinity.java index 86bf7616201..b6afc3459e9 100644 --- a/Mage.Sets/src/mage/sets/Unfinity.java +++ b/Mage.Sets/src/mage/sets/Unfinity.java @@ -21,6 +21,7 @@ public final class Unfinity extends ExpansionSet { this.hasBoosters = false; // not likely to be able to drafts at any point cards.add(new SetCardInfo("\"Name Sticker\" Goblin", "107m", Rarity.COMMON, mage.cards.n.NameStickerGoblin.class)); + cards.add(new SetCardInfo("Atomwheel Acrobats", 130, Rarity.COMMON, mage.cards.a.AtomwheelAcrobats.class)); cards.add(new SetCardInfo("Attempted Murder", 66, Rarity.UNCOMMON, mage.cards.a.AttemptedMurder.class)); cards.add(new SetCardInfo("Blood Crypt", 279, Rarity.RARE, mage.cards.b.BloodCrypt.class)); cards.add(new SetCardInfo("Boing!", 40, Rarity.COMMON, mage.cards.b.Boing.class)); @@ -51,6 +52,7 @@ public final class Unfinity extends ExpansionSet { cards.add(new SetCardInfo("Plains", 240, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_UST_VARIOUS)); cards.add(new SetCardInfo("Sacred Foundry", 285, Rarity.RARE, mage.cards.s.SacredFoundry.class)); cards.add(new SetCardInfo("Saw in Half", 88, Rarity.RARE, mage.cards.s.SawInHalf.class)); + cards.add(new SetCardInfo("Six-Sided Die", 92, Rarity.COMMON, mage.cards.s.SixSidedDie.class)); cards.add(new SetCardInfo("Slight Malfunction", 123, Rarity.COMMON, mage.cards.s.SlightMalfunction.class)); cards.add(new SetCardInfo("Starlight Spectacular", 28, Rarity.RARE, mage.cards.s.StarlightSpectacular.class)); cards.add(new SetCardInfo("Steam Vents", 283, Rarity.RARE, mage.cards.s.SteamVents.class)); diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index 63b020f0763..d7ecbae173b 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -307,6 +307,7 @@ public enum SubType { PEASANT("Peasant", SubTypeSet.CreatureType), PEGASUS("Pegasus", SubTypeSet.CreatureType), PENTAVITE("Pentavite", SubTypeSet.CreatureType), + PERFORMER("Performer", SubTypeSet.CreatureType), PEST("Pest", SubTypeSet.CreatureType), PHELDDAGRIF("Phelddagrif", SubTypeSet.CreatureType), PHOENIX("Phoenix", SubTypeSet.CreatureType),