[SPM] implement Scarlet Spider, Ben Reilly

This commit is contained in:
jmlundeen 2025-09-04 12:01:43 -05:00
parent 8b6b90c8d8
commit ed134cbfc6
4 changed files with 169 additions and 1 deletions

View file

@ -0,0 +1,100 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.common.WebSlingingCondition;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.WebSlingingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author Jmlundeen
*/
public final class ScarletSpiderBenReilly extends CardImpl {
public ScarletSpiderBenReilly(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SPIDER);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.HERO);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
// Web-slinging {R}{G}
this.addAbility(new WebSlingingAbility(this, "{R}{G}"));
// Trample
this.addAbility(TrampleAbility.getInstance());
// Sensational Save -- If Scarlet Spider was cast using web-slinging, he enters with X +1/+1 counters on him, where X is the mana value of the returned creature.
String ruleText = CardUtil.italicizeWithEmDash("Sensational Save") + "If {this} was cast using web-slinging, " +
"he enters with X +1/+1 counters on him, where X is the mana value of the returned creature.";
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(),
ScarletSpiderBenReillyValue.instance, false),
WebSlingingCondition.THIS, ruleText, ""));
}
private ScarletSpiderBenReilly(final ScarletSpiderBenReilly card) {
super(card);
}
@Override
public ScarletSpiderBenReilly copy() {
return new ScarletSpiderBenReilly(this);
}
}
enum ScarletSpiderBenReillyValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Spell spell = game.getSpellOrLKIStack(sourceAbility.getSourceId());
if (spell == null || spell.getSpellAbility() == null) {
return 0;
}
ReturnToHandChosenControlledPermanentCost returnCost = (ReturnToHandChosenControlledPermanentCost) spell.getSpellAbility().getCosts().stream()
.filter(cost -> cost instanceof ReturnToHandChosenControlledPermanentCost)
.findFirst()
.orElse(null);
if (returnCost == null || returnCost.getPermanents().isEmpty()) {
return 0;
}
return returnCost.getPermanents().get(0).getManaValue();
}
@Override
public ScarletSpiderBenReillyValue copy() {
return this;
}
@Override
public String toString() {
return "X";
}
@Override
public String getMessage() {
return "";
}
}

View file

@ -168,6 +168,8 @@ public final class MarvelsSpiderMan extends ExpansionSet {
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", 266, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Scarlet Spider, Ben Reilly", 142, Rarity.RARE, mage.cards.s.ScarletSpiderBenReilly.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Scarlet Spider, Ben Reilly", 214, Rarity.RARE, mage.cards.s.ScarletSpiderBenReilly.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Scarlet Spider, Kaine", 143, Rarity.UNCOMMON, mage.cards.s.ScarletSpiderKaine.class));
cards.add(new SetCardInfo("School Daze", 42, Rarity.UNCOMMON, mage.cards.s.SchoolDaze.class));
cards.add(new SetCardInfo("Scorpion's Sting", 65, Rarity.COMMON, mage.cards.s.ScorpionsSting.class));

View file

@ -0,0 +1,65 @@
package org.mage.test.cards.single.spm;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TapAllEffect;
import mage.constants.PhaseStep;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author Jmlundeen
*/
public class ScarletSpiderBenReillyTest extends CardTestPlayerBase {
/*
Scarlet Spider, Ben Reilly
{1}{R}{G}
Legendary Creature - Spider Human Hero
Web-slinging {R}{G}
Trample
Sensational Save -- If Scarlet Spider was cast using web-slinging, he enters with X +1/+1 counters on him, where X is the mana value of the returned creature.
4/3
*/
private static final String scarletSpiderBenReilly = "Scarlet Spider, Ben Reilly";
/*
Bear Cub
{1}{G}
Creature - Bear
2/2
*/
private static final String bearCub = "Bear Cub";
@Test
public void testScarletSpiderBenReilly() {
setStrictChooseMode(true);
addCustomCardWithAbility("tap all creatures", playerA, new SimpleActivatedAbility(
new TapAllEffect(new FilterCreaturePermanent(SubType.BEAR, "bears")),
new ManaCostsImpl<>("")
));
addCard(Zone.HAND, playerA, scarletSpiderBenReilly);
addCard(Zone.BATTLEFIELD, playerA, bearCub, 1);
addCard(Zone.BATTLEFIELD, playerA, "Taiga", 3);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "tap all"); // tap bears, addCard command isn't working to set tapped
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, scarletSpiderBenReilly + " with Web-slinging");
setChoice(playerA, bearCub);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertCounterCount(playerA, scarletSpiderBenReilly, CounterType.P1P1, 2);
assertHandCount(playerA, bearCub, 1);
}
}

View file

@ -10,7 +10,8 @@ import mage.util.CardUtil;
* @author TheElk801
*/
public enum WebSlingingCondition implements Condition {
THEY("they were");
THEY("they were"),
THIS("{this}");
private final String message;
WebSlingingCondition(String message) {