From 192f39f0753f7c9727707b3ccf987c4a6fc014eb Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sat, 14 Oct 2023 20:53:10 +0200 Subject: [PATCH] [LEA] Implement Chaos Orb (Errated version) (#11306) (85% chance to destroy a chosen nontoken permanent) --- Mage.Sets/src/mage/cards/c/ChaosOrb.java | 111 ++++++++++++++++++ .../src/mage/sets/LimitedEditionAlpha.java | 1 + .../src/mage/sets/LimitedEditionBeta.java | 2 +- Mage.Sets/src/mage/sets/UnlimitedEdition.java | 1 + 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/c/ChaosOrb.java diff --git a/Mage.Sets/src/mage/cards/c/ChaosOrb.java b/Mage.Sets/src/mage/cards/c/ChaosOrb.java new file mode 100644 index 00000000000..3c09379d202 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChaosOrb.java @@ -0,0 +1,111 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroySourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * Heavily errated version of Chaos Orb, as it is not + * realistic to implement any kind of fall simulation. + * No dexterity, a single destroyed permanent at most, + * and a randomized (not a dice roll) chance to destroy + * the other permanent. + * + * @author Susucr + */ +public final class ChaosOrb extends CardImpl { + + public ChaosOrb(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // {1}, {T}: If Chaos Orb is on the battlefield, choose a nontoken permanent, then a number between 1 and 20 is generated at random. If the number is 4 or more, destroy the chosen permanent. Then destroy Chaos Orb. + Ability ability = new SimpleActivatedAbility( + new ChaosOrbEffect(), + new GenericManaCost(1) + ); + ability.addCost(new TapSourceCost()); + ability.addEffect(new DestroySourceEffect().concatBy("Then")); + this.addAbility(ability); + } + + private ChaosOrb(final ChaosOrb card) { + super(card); + } + + @Override + public ChaosOrb copy() { + return new ChaosOrb(this); + } +} + +class ChaosOrbEffect extends OneShotEffect { + + private static final FilterPermanent filter = new FilterPermanent("nontoken permanent"); + + static { + filter.add(TokenPredicate.FALSE); + } + + ChaosOrbEffect() { + super(Outcome.DestroyPermanent); + staticText = "if {this} is on the battlefield, choose a nontoken permanent, " + + "then a number between 1 and 20 is generated at random. " + + "If the number is 4 or more, destroy the chosen permanent"; + } + + private ChaosOrbEffect(final ChaosOrbEffect effect) { + super(effect); + } + + @Override + public ChaosOrbEffect copy() { + return new ChaosOrbEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent orb = source.getSourcePermanentIfItStillExists(game); + if (player == null || orb == null) { + return false; + } + + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + Permanent chosen = null; + if (target.choose(outcome, player.getId(), source.getSourceId(), source, game)) { + chosen = game.getPermanent(target.getFirstTarget()); + } + if (chosen != null) { + game.informPlayers(player.getLogName() + " has chosen " + chosen.getLogName() + CardUtil.getSourceLogName(game, source)); + + // roll a 20 side dice without any roll interaction. + int result = player.rollDieResult(20, game); + game.informPlayers("The random number is " + result + CardUtil.getSourceLogName(game, source)); + + // 3/20 chance of failure. + if (result >= 4) { + chosen.destroy(source, game); + } + } + + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 9490ac492a1..eda85f39d59 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -57,6 +57,7 @@ public final class LimitedEditionAlpha extends ExpansionSet { cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 234, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); cards.add(new SetCardInfo("Channel", 188, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaos Orb", 235, Rarity.RARE, mage.cards.c.ChaosOrb.class)); cards.add(new SetCardInfo("Chaoslace", 139, Rarity.RARE, mage.cards.c.Chaoslace.class)); cards.add(new SetCardInfo("Circle of Protection: Blue", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); cards.add(new SetCardInfo("Circle of Protection: Green", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java index f4f6c83127f..420021db9b7 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java @@ -7,7 +7,6 @@ import mage.constants.Rarity; import mage.constants.SetType; /** - * * @author North */ public final class LimitedEditionBeta extends ExpansionSet { @@ -57,6 +56,7 @@ public final class LimitedEditionBeta extends ExpansionSet { cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 235, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); cards.add(new SetCardInfo("Channel", 189, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaos Orb", 236, Rarity.RARE, mage.cards.c.ChaosOrb.class)); cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); cards.add(new SetCardInfo("Circle of Protection: Black", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); cards.add(new SetCardInfo("Circle of Protection: Blue", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); diff --git a/Mage.Sets/src/mage/sets/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java index f28346fe00c..8c0ee176e67 100644 --- a/Mage.Sets/src/mage/sets/UnlimitedEdition.java +++ b/Mage.Sets/src/mage/sets/UnlimitedEdition.java @@ -57,6 +57,7 @@ public final class UnlimitedEdition extends ExpansionSet { cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 235, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); cards.add(new SetCardInfo("Channel", 189, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaos Orb", 236, Rarity.RARE, mage.cards.c.ChaosOrb.class)); cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); cards.add(new SetCardInfo("Circle of Protection: Black", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); cards.add(new SetCardInfo("Circle of Protection: Blue", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class));