[SPM] implement Sandman's Quicksand

This commit is contained in:
jmlundeen 2025-09-04 09:53:30 -05:00
parent 411e25661a
commit 43d315861d
3 changed files with 136 additions and 0 deletions

View file

@ -0,0 +1,54 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.abilities.keyword.MayhemAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
*
* @author Jmlundeen
*/
public final class SandmansQuicksand extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures your opponents control");
static {
filter.add(TargetController.OPPONENT.getControllerPredicate());
}
public SandmansQuicksand(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
// Mayhem {3}{B}
Ability mayhem = new MayhemAbility(this, "{3}{B}");
mayhem.addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn, filter, false));
this.addAbility(mayhem);
// All creatures get -2/-2 until end of turn. If this spell's mayhem cost was paid, creatures your opponents control get -2/-2 until end of turn instead.
ContinuousEffect effect = new BoostAllEffect(-2, -2, Duration.EndOfTurn);
effect.setText("All creatures get -2/-2 until end of turn. If this spell's mayhem cost was paid, " +
"creatures your opponents control get -2/-2 until end of turn instead"
);
this.getSpellAbility().addEffect(effect);
}
private SandmansQuicksand(final SandmansQuicksand card) {
super(card);
}
@Override
public SandmansQuicksand copy() {
return new SandmansQuicksand(this);
}
}

View file

@ -164,6 +164,7 @@ public final class MarvelsSpiderMan extends ExpansionSet {
cards.add(new SetCardInfo("Robotics Mastery", 41, Rarity.UNCOMMON, mage.cards.r.RoboticsMastery.class)); cards.add(new SetCardInfo("Robotics Mastery", 41, Rarity.UNCOMMON, mage.cards.r.RoboticsMastery.class));
cards.add(new SetCardInfo("Rocket-Powered Goblin Glider", 172, Rarity.RARE, mage.cards.r.RocketPoweredGoblinGlider.class)); cards.add(new SetCardInfo("Rocket-Powered Goblin Glider", 172, Rarity.RARE, mage.cards.r.RocketPoweredGoblinGlider.class));
cards.add(new SetCardInfo("Romantic Rendezvous", 86, Rarity.COMMON, mage.cards.r.RomanticRendezvous.class)); cards.add(new SetCardInfo("Romantic Rendezvous", 86, Rarity.COMMON, mage.cards.r.RomanticRendezvous.class));
cards.add(new SetCardInfo("Sandman's Quicksand", 63, Rarity.UNCOMMON, mage.cards.s.SandmansQuicksand.class));
cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 112, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 112, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 266, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 266, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Scarlet Spider, Kaine", 143, Rarity.UNCOMMON, mage.cards.s.ScarletSpiderKaine.class)); cards.add(new SetCardInfo("Scarlet Spider, Kaine", 143, Rarity.UNCOMMON, mage.cards.s.ScarletSpiderKaine.class));

View file

@ -0,0 +1,81 @@
package org.mage.test.cards.single.spm;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author Jmlundeen
*/
public class SandmansQuicksandTest extends CardTestPlayerBase {
/*
Sandman's Quicksand
{1}{B}{B}
Sorcery
Mayhem {3}{B}
All creatures get -2/-2 until end of turn. If this spell's mayhem cost was paid, creatures your opponents control get -2/-2 until end of turn instead.
*/
private static final String sandmansQuicksand = "Sandman's Quicksand";
/*
Bear Cub
{1}{G}
Creature - Bear
2/2
*/
private static final String bearCub = "Bear Cub";
/*
Thought Courier
{1}{U}
Creature - Human Wizard
{tap}: Draw a card, then discard a card.
1/1
*/
private static final String thoughtCourier = "Thought Courier";
@Test
public void testSandmansQuicksand() {
setStrictChooseMode(true);
addCard(Zone.HAND, playerA, sandmansQuicksand);
addCard(Zone.BATTLEFIELD, playerA, bearCub);
addCard(Zone.BATTLEFIELD, playerB, bearCub);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, sandmansQuicksand);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertGraveyardCount(playerA, bearCub, 1);
assertGraveyardCount(playerB, bearCub, 1);
}
@Test
public void testSandmansQuicksandMayhem() {
setStrictChooseMode(true);
addCard(Zone.HAND, playerA, sandmansQuicksand);
addCard(Zone.BATTLEFIELD, playerA, bearCub);
addCard(Zone.BATTLEFIELD, playerA, thoughtCourier);
addCard(Zone.BATTLEFIELD, playerB, bearCub);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Draw");
setChoice(playerA, sandmansQuicksand);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, sandmansQuicksand + " with Mayhem");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertGraveyardCount(playerA, bearCub, 0);
assertGraveyardCount(playerB, bearCub, 1);
}
}