master #31

Merged
Failure merged 18 commits from External/mage:master into master 2025-07-24 13:04:55 -07:00
28 changed files with 1073 additions and 91 deletions

View file

@ -0,0 +1,46 @@
package mage.cards.a;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.EffectKeyValue;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AmazingAlliance extends CardImpl {
private static final DynamicValue xValue = new EffectKeyValue(
AttacksWithCreaturesTriggeredAbility.VALUEKEY_NUMBER_ATTACKERS, "that much"
);
public AmazingAlliance(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{W}");
// Creatures you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)));
// Whenever you attack with one or more legendary creatures, you gain that much life.
this.addAbility(new AttacksWithCreaturesTriggeredAbility(
new GainLifeEffect(xValue), 1, StaticFilters.FILTER_CREATURES_LEGENDARY
));
}
private AmazingAlliance(final AmazingAlliance card) {
super(card);
}
@Override
public AmazingAlliance copy() {
return new AmazingAlliance(this);
}
}

View file

@ -44,7 +44,7 @@ public final class BeetleLegacyCriminal extends CardImpl {
ability.addCost(new ExileSourceFromGraveCost());
ability.addTarget(new TargetCreaturePermanent());
ability.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance())
.setText("Put a +1/+1 counter on target creature"));
.setText("It gains flying until end of turn"));
this.addAbility(ability);
}

View file

@ -2,7 +2,7 @@ package mage.cards.c;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.keyword.ConniveSourceEffect;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -30,6 +30,7 @@ public final class ChangeOfPlans extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{1}{U}");
// Each of X target creatures you control connive. You may have any number of them phase out.
this.getSpellAbility().addEffect(new ConniveTargetEffect().setText("each of X target creatures you control connive"));
this.getSpellAbility().addEffect(new ChangeOfPlansEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
@ -49,7 +50,7 @@ class ChangeOfPlansEffect extends OneShotEffect {
ChangeOfPlansEffect() {
super(Outcome.Benefit);
staticText = "each of X target creatures you control connive. You may have any number of them phase out";
staticText = "You may have any number of them phase out";
}
private ChangeOfPlansEffect(final ChangeOfPlansEffect effect) {
@ -73,9 +74,6 @@ class ChangeOfPlansEffect extends OneShotEffect {
if (permanents.isEmpty()) {
return false;
}
for (Permanent permanent : permanents) {
ConniveSourceEffect.connive(permanent, 1, source, game);
}
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return true;

View file

@ -0,0 +1,69 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.keyword.HexproofAbility;
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.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DocOckSinisterScientist extends CardImpl {
private static final Condition condition = new CardsInControllerGraveyardCondition(8);
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.VILLAIN);
static {
filter.add(AnotherPredicate.instance);
}
private static final Condition condition2 = new PermanentsOnTheBattlefieldCondition(filter);
public DocOckSinisterScientist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SCIENTIST);
this.subtype.add(SubType.VILLAIN);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
// As long as there are eight or more cards in your graveyard, Doc Ock has base power and toughness 8/8.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new SetBasePowerToughnessSourceEffect(8, 8, Duration.WhileOnBattlefield), condition,
"as long as there are eight or more cards in your graveyard, {this} has base power and toughness 8/8"
)));
// As long as you control another Villain, Doc Ock has hexproof.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(HexproofAbility.getInstance()), condition2,
"as long as you control another Villain, {this} has hexproof"
)));
}
private DocOckSinisterScientist(final DocOckSinisterScientist card) {
super(card);
}
@Override
public DocOckSinisterScientist copy() {
return new DocOckSinisterScientist(this);
}
}

View file

@ -0,0 +1,68 @@
package mage.cards.d;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DoubleTrouble extends CardImpl {
public DoubleTrouble(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}");
// Double the power of each creature you control until end of turn.
this.getSpellAbility().addEffect(new DoubleTroubleEffect());
}
private DoubleTrouble(final DoubleTrouble card) {
super(card);
}
@Override
public DoubleTrouble copy() {
return new DoubleTrouble(this);
}
}
class DoubleTroubleEffect extends OneShotEffect {
DoubleTroubleEffect() {
super(Outcome.Benefit);
staticText = "double the power of each creature you control until end of turn";
}
private DoubleTroubleEffect(final DoubleTroubleEffect effect) {
super(effect);
}
@Override
public DoubleTroubleEffect copy() {
return new DoubleTroubleEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_CONTROLLED_CREATURE, source.getControllerId(), source, game
)) {
int power = permanent.getPower().getValue();
if (power != 0) {
game.addEffect(new BoostTargetEffect(power, 0)
.setTargetPointer(new FixedTarget(permanent, game)), source);
}
}
return true;
}
}

View file

@ -0,0 +1,36 @@
package mage.cards.e;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.MayhemAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ElectrosBolt extends CardImpl {
public ElectrosBolt(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
// Electro's Bolt deals 4 damage to target creature.
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
// Mayhem {1}{R}
this.addAbility(new MayhemAbility(this, "{1}{R}"));
}
private ElectrosBolt(final ElectrosBolt card) {
super(card);
}
@Override
public ElectrosBolt copy() {
return new ElectrosBolt(this);
}
}

View file

@ -0,0 +1,58 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GhostSpiderGwenStacy extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(StaticFilters.FILTER_ATTACKING_CREATURE);
private static final Hint hint = new ValueHint("Attacking creatures", xValue);
public GhostSpiderGwenStacy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
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(4);
// Menace
this.addAbility(new MenaceAbility());
// Whenever Ghost-Spider attacks, she deals X damage to defending player, where X is the number of attacking creatures.
this.addAbility(new AttacksTriggeredAbility(
new DamageTargetEffect(xValue)
.setText("she deals X damage to defending player, where X is the number of attacking creatures"),
false, null, SetTargetPointer.PLAYER
).addHint(hint));
}
private GhostSpiderGwenStacy(final GhostSpiderGwenStacy card) {
super(card);
}
@Override
public GhostSpiderGwenStacy copy() {
return new GhostSpiderGwenStacy(this);
}
}

View file

@ -0,0 +1,47 @@
package mage.cards.g;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceTargetsPermanentCondition;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GrowExtraArms extends CardImpl {
private static final Condition condition
= new SourceTargetsPermanentCondition(new FilterPermanent(SubType.SPIDER, "a Spider"));
public GrowExtraArms(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// This spell costs {1} less to cast if it targets a Spider.
this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SpellCostReductionSourceEffect(1, condition).setCanWorksOnStackOnly(true)
).setRuleAtTheTop(true));
// Target creature gets +4/+4 until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(4, 4));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private GrowExtraArms(final GrowExtraArms card) {
super(card);
}
@Override
public GrowExtraArms copy() {
return new GrowExtraArms(this);
}
}

View file

@ -6,7 +6,7 @@ import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.keyword.ConniveSourceEffect;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -39,7 +39,7 @@ public final class KamizObscuraOculus extends CardImpl {
// Whenever you attack, target attacking creature can't be blocked this turn. It connives. Then choose another attacking creature with lesser power. That creature gains double strike until end of turn.
Ability ability = new AttacksWithCreaturesTriggeredAbility(new CantBeBlockedTargetEffect(), 1);
ability.addEffect(new KamizConniveEffect());
ability.addEffect(new ConniveTargetEffect().setText("it connives"));
ability.addEffect(new KamizDoubleStrikeEffect().concatBy("Then"));
ability.addTarget(new TargetAttackingCreature());
this.addAbility(ability);
@ -55,29 +55,6 @@ public final class KamizObscuraOculus extends CardImpl {
}
}
class KamizConniveEffect extends OneShotEffect {
KamizConniveEffect() {
super(Outcome.Benefit);
staticText = "it connives";
}
private KamizConniveEffect(final KamizConniveEffect effect) {
super(effect);
}
@Override
public KamizConniveEffect copy() {
return new KamizConniveEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
return ConniveSourceEffect.connive(permanent, 1, source, game);
}
}
class KamizDoubleStrikeEffect extends OneShotEffect {
KamizDoubleStrikeEffect() {
@ -109,8 +86,8 @@ class KamizDoubleStrikeEffect extends OneShotEffect {
if (target.choose(outcome, source.getControllerId(), source.getSourceId(), source, game)) {
game.addEffect(
new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance())
.setTargetPointer(new FixedTarget(target.getFirstTarget(), game))
, source);
.setTargetPointer(new FixedTarget(target.getFirstTarget(), game)), source
);
}
return true;
}

View file

@ -0,0 +1,40 @@
package mage.cards.l;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class LethalProtection extends CardImpl {
public LethalProtection(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}");
// Destroy target creature. Return up to one target creature card from your graveyard to your hand.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect().setTargetPointer(new SecondTargetPointer()));
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(
0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD
));
}
private LethalProtection(final LethalProtection card) {
super(card);
}
@Override
public LethalProtection copy() {
return new LethalProtection(this);
}
}

View file

@ -0,0 +1,48 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MechanicalMobster extends CardImpl {
public MechanicalMobster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ROBOT);
this.subtype.add(SubType.VILLAIN);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// When this creature enters, exile up to one target card from a graveyard. Target creature you control connives.
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect());
ability.addTarget(new TargetCardInGraveyard(0, 1));
ability.addEffect(new ConniveTargetEffect().setTargetPointer(new SecondTargetPointer()));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}
private MechanicalMobster(final MechanicalMobster card) {
super(card);
}
@Override
public MechanicalMobster copy() {
return new MechanicalMobster(this);
}
}

View file

@ -5,7 +5,7 @@ import mage.abilities.Mode;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect;
import mage.abilities.effects.keyword.ConniveSourceEffect;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -14,7 +14,6 @@ import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.TargetPlayer;
@ -44,7 +43,7 @@ public final class ObscuraConfluence extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
// Target creature connives.
this.getSpellAbility().addMode(new Mode(new ObscuraConfluenceConniveEffect()).addTarget(new TargetCreaturePermanent()));
this.getSpellAbility().addMode(new Mode(new ConniveTargetEffect()).addTarget(new TargetCreaturePermanent()));
// Target player returns a creature card from their graveyard to their hand.
this.getSpellAbility().addMode(new Mode(new ObscuraConfluenceReturnEffect()).addTarget(new TargetPlayer()));
@ -60,30 +59,6 @@ public final class ObscuraConfluence extends CardImpl {
}
}
class ObscuraConfluenceConniveEffect extends OneShotEffect {
ObscuraConfluenceConniveEffect() {
super(Outcome.Benefit);
staticText = "target creature connives. <i>(Draw a card, then discard a card. " +
"If you discarded a nonland card, put a +1/+1 counter on that creature.)</i>";
}
private ObscuraConfluenceConniveEffect(final ObscuraConfluenceConniveEffect effect) {
super(effect);
}
@Override
public ObscuraConfluenceConniveEffect copy() {
return new ObscuraConfluenceConniveEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
return ConniveSourceEffect.connive(permanent, 1, source, game);
}
}
class ObscuraConfluenceReturnEffect extends OneShotEffect {
ObscuraConfluenceReturnEffect() {

View file

@ -0,0 +1,47 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RampagingClassmate extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(StaticFilters.FILTER_ATTACKING_CREATURE, 1);
public RampagingClassmate(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.subtype.add(SubType.LIZARD);
this.subtype.add(SubType.BERSERKER);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
// Whenever this creature attacks, it gets +1/+0 until end of turn for each other attacking creature.
this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
xValue, StaticValue.get(0), Duration.EndOfTurn, "it"
)));
}
private RampagingClassmate(final RampagingClassmate card) {
super(card);
}
@Override
public RampagingClassmate copy() {
return new RampagingClassmate(this);
}
}

View file

@ -2,17 +2,16 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.keyword.ConniveSourceEffect;
import mage.abilities.condition.common.MorbidCondition;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.abilities.hint.common.MorbidHint;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.game.Game;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
@ -36,9 +35,9 @@ public final class ScorpionSeethingStriker extends CardImpl {
this.addAbility(DeathtouchAbility.getInstance());
// At the beginning of your end step, if a creature died this turn, target creature you control connives.
Ability ability = new BeginningOfEndStepTriggeredAbility(new ScorpionSeethingStrikerEffect());
Ability ability = new BeginningOfEndStepTriggeredAbility(new ConniveTargetEffect()).withInterveningIf(MorbidCondition.instance);
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
this.addAbility(ability.addHint(MorbidHint.instance));
}
private ScorpionSeethingStriker(final ScorpionSeethingStriker card) {
@ -50,27 +49,3 @@ public final class ScorpionSeethingStriker extends CardImpl {
return new ScorpionSeethingStriker(this);
}
}
class ScorpionSeethingStrikerEffect extends OneShotEffect {
ScorpionSeethingStrikerEffect() {
super(Outcome.Benefit);
staticText = "target creature you control connives";
}
private ScorpionSeethingStrikerEffect(final ScorpionSeethingStrikerEffect effect) {
super(effect);
}
@Override
public ScorpionSeethingStrikerEffect copy() {
return new ScorpionSeethingStrikerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return ConniveSourceEffect.connive(
game.getPermanent(getTargetPointer().getFirst(game, source)), 1, source, game
);
}
}

View file

@ -0,0 +1,38 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.keyword.MayhemAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SpiderIslanders extends CardImpl {
public SpiderIslanders(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.SPIDER);
this.subtype.add(SubType.HORROR);
this.subtype.add(SubType.CITIZEN);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
// Mayhem {1}{R}
this.addAbility(new MayhemAbility(this, "{1}{R}"));
}
private SpiderIslanders(final SpiderIslanders card) {
super(card);
}
@Override
public SpiderIslanders copy() {
return new SpiderIslanders(this);
}
}

View file

@ -0,0 +1,50 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SpiderMan2099MiguelOHara extends CardImpl {
public SpiderMan2099MiguelOHara(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
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(4);
// When Spider-Man 2099 enters, return up to one target creature to its owner's hand.
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1));
this.addAbility(ability);
// Whenever one or more creatures you control deal combat damage to a player, draw a card.
this.addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility(new DrawCardSourceControllerEffect(1)));
}
private SpiderMan2099MiguelOHara(final SpiderMan2099MiguelOHara card) {
super(card);
}
@Override
public SpiderMan2099MiguelOHara copy() {
return new SpiderMan2099MiguelOHara(this);
}
}

View file

@ -0,0 +1,83 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAloneControlledTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SpiderManNoir extends CardImpl {
public SpiderManNoir(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
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(4);
// Menace
this.addAbility(new MenaceAbility());
// Whenever a creature you control attacks alone, put a +1/+1 counter on it. Then surveil X, where X is the number of counters on it.
Ability ability = new AttacksAloneControlledTriggeredAbility(
new AddCountersTargetEffect(CounterType.P1P1.createInstance())
.setText("put a +1/+1 counter on it")
);
ability.addEffect(new SpiderManNoirEffect());
this.addAbility(ability);
}
private SpiderManNoir(final SpiderManNoir card) {
super(card);
}
@Override
public SpiderManNoir copy() {
return new SpiderManNoir(this);
}
}
class SpiderManNoirEffect extends OneShotEffect {
SpiderManNoirEffect() {
super(Outcome.Benefit);
staticText = "Then surveil X, where X is the number of counters on it";
}
private SpiderManNoirEffect(final SpiderManNoirEffect effect) {
super(effect);
}
@Override
public SpiderManNoirEffect copy() {
return new SpiderManNoirEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
return player != null
&& permanent != null
&& player.surveil(permanent.getCounters(game).getTotalCount(), source, game);
}
}

View file

@ -0,0 +1,57 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.DiscardSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class StegronTheDinosaurMan extends CardImpl {
public StegronTheDinosaurMan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.DINOSAUR);
this.subtype.add(SubType.VILLAIN);
this.power = new MageInt(5);
this.toughness = new MageInt(4);
// Menace
this.addAbility(new MenaceAbility());
// Dinosaur Formula -- {1}{R}, Discard this card: Until end of turn, target creature you control gets +3/+1 and becomes a Dinosaur in addition to its other types.
Ability ability = new SimpleActivatedAbility(
Zone.HAND,
new BoostTargetEffect(3, 1)
.setText("until end of turn, target creature you control gets +3/+1"),
new ManaCostsImpl<>("{1}{R}")
);
ability.addCost(new DiscardSourceCost());
ability.addEffect(new AddCardSubTypeTargetEffect(SubType.DINOSAUR, Duration.EndOfTurn)
.setText("and becomes a Dinosaur in addition to its other types"));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability.withFlavorWord("Dinosaur Formula"));
}
private StegronTheDinosaurMan(final StegronTheDinosaurMan card) {
super(card);
}
@Override
public StegronTheDinosaurMan copy() {
return new StegronTheDinosaurMan(this);
}
}

View file

@ -0,0 +1,52 @@
package mage.cards.t;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.CreaturesThatAttackedThisTurnCount;
import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheMaryJanes extends CardImpl {
public TheMaryJanes(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.BARD);
this.subtype.add(SubType.PERFORMER);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// This spell costs {1} less to cast for each creature that attacked this turn.
this.addAbility(new SimpleStaticAbility(
Zone.ALL,
new SpellCostReductionForEachSourceEffect(
1, CreaturesThatAttackedThisTurnCount.instance
)
).addHint(CreaturesThatAttackedThisTurnCount.getHint()));
// Menace
this.addAbility(new MenaceAbility());
}
private TheMaryJanes(final TheMaryJanes card) {
super(card);
}
@Override
public TheMaryJanes copy() {
return new TheMaryJanes(this);
}
}

View file

@ -0,0 +1,37 @@
package mage.cards.u;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.effects.keyword.ConniveTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.TargetPlayer;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class UnstableExperiment extends CardImpl {
public UnstableExperiment(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
// Target player draws a card, then up to one target creature you control connives.
this.getSpellAbility().addEffect(new DrawCardTargetEffect(1));
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new ConniveTargetEffect().setTargetPointer(new SecondTargetPointer()).concatBy(", then"));
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, 1));
}
private UnstableExperiment(final UnstableExperiment card) {
super(card);
}
@Override
public UnstableExperiment copy() {
return new UnstableExperiment(this);
}
}

View file

@ -0,0 +1,82 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VenomEddieBrock extends CardImpl {
public VenomEddieBrock(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SYMBIOTE);
this.subtype.add(SubType.VILLAIN);
this.power = new MageInt(6);
this.toughness = new MageInt(4);
// Menace
this.addAbility(new MenaceAbility());
// Whenever another creature dies, put a +1/+1 counter on Venom. If that creature was a Villain, draw a card.
Ability ability = new DiesCreatureTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true
);
ability.addEffect(new VenomEddieBrockEffect());
this.addAbility(ability);
}
private VenomEddieBrock(final VenomEddieBrock card) {
super(card);
}
@Override
public VenomEddieBrock copy() {
return new VenomEddieBrock(this);
}
}
class VenomEddieBrockEffect extends OneShotEffect {
VenomEddieBrockEffect() {
super(Outcome.Benefit);
staticText = "If that creature was a Villain, draw a card";
}
private VenomEddieBrockEffect(final VenomEddieBrockEffect effect) {
super(effect);
}
@Override
public VenomEddieBrockEffect copy() {
return new VenomEddieBrockEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Permanent permanent = (Permanent) getValue("creatureDied");
return player != null
&& permanent != null
&& permanent.hasSubtype(SubType.VILLAIN, game)
&& player.drawCards(1, source, game) > 0;
}
}

View file

@ -0,0 +1,58 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.ExileSourceFromGraveCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VenomEvilUnleashed extends CardImpl {
public VenomEvilUnleashed(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SYMBIOTE);
this.subtype.add(SubType.VILLAIN);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
// Deathtouch
this.addAbility(DeathtouchAbility.getInstance());
// {2}{B}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. It gains deathtouch until end of turn. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
Zone.GRAVEYARD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{2}{B}")
);
ability.addCost(new ExileSourceFromGraveCost());
ability.addTarget(new TargetCreaturePermanent());
ability.addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
.setText("It gains deathtouch until end of turn"));
this.addAbility(ability);
}
private VenomEvilUnleashed(final VenomEvilUnleashed card) {
super(card);
}
@Override
public VenomEvilUnleashed copy() {
return new VenomEvilUnleashed(this);
}
}

View file

@ -4,11 +4,15 @@ import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
import java.util.Arrays;
import java.util.List;
/**
* @author TheElk801
*/
public final class MarvelsSpiderMan extends ExpansionSet {
private static final List<String> unfinished = Arrays.asList("Electro's Bolt", "Spider-Islanders");
private static final MarvelsSpiderMan instance = new MarvelsSpiderMan();
public static MarvelsSpiderMan getInstance() {
@ -25,15 +29,19 @@ public final class MarvelsSpiderMan extends ExpansionSet {
cards.add(new SetCardInfo("Beetle, Legacy Criminal", 26, Rarity.COMMON, mage.cards.b.BeetleLegacyCriminal.class));
cards.add(new SetCardInfo("Daily Bugle Reporters", 6, Rarity.COMMON, mage.cards.d.DailyBugleReporters.class));
cards.add(new SetCardInfo("Doc Ock's Henchmen", 30, Rarity.COMMON, mage.cards.d.DocOcksHenchmen.class));
cards.add(new SetCardInfo("Doc Ock, Sinister Scientist", 29, Rarity.COMMON, mage.cards.d.DocOckSinisterScientist.class));
cards.add(new SetCardInfo("Eerie Gravestone", 163, Rarity.COMMON, mage.cards.e.EerieGravestone.class));
cards.add(new SetCardInfo("Electro's Bolt", 77, Rarity.COMMON, mage.cards.e.ElectrosBolt.class));
cards.add(new SetCardInfo("Flying Octobot", 31, Rarity.UNCOMMON, mage.cards.f.FlyingOctobot.class));
cards.add(new SetCardInfo("Forest", 198, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grow Extra Arms", 101, Rarity.COMMON, mage.cards.g.GrowExtraArms.class));
cards.add(new SetCardInfo("Guy in the Chair", 102, Rarity.COMMON, mage.cards.g.GuyInTheChair.class));
cards.add(new SetCardInfo("Island", 195, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kapow!", 103, Rarity.COMMON, mage.cards.k.Kapow.class));
cards.add(new SetCardInfo("Kraven's Cats", 104, Rarity.COMMON, mage.cards.k.KravensCats.class));
cards.add(new SetCardInfo("Lurking Lizards", 107, Rarity.COMMON, mage.cards.l.LurkingLizards.class));
cards.add(new SetCardInfo("Masked Meower", 82, Rarity.COMMON, mage.cards.m.MaskedMeower.class));
cards.add(new SetCardInfo("Mechanical Mobster", 168, Rarity.COMMON, mage.cards.m.MechanicalMobster.class));
cards.add(new SetCardInfo("Merciless Enforcers", 58, Rarity.COMMON, mage.cards.m.MercilessEnforcers.class));
cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Origin of Spider-Man", 9, Rarity.RARE, mage.cards.o.OriginOfSpiderMan.class));
@ -52,17 +60,24 @@ public final class MarvelsSpiderMan extends ExpansionSet {
cards.add(new SetCardInfo("Spider-Byte, Web Warden", 44, Rarity.UNCOMMON, mage.cards.s.SpiderByteWebWarden.class));
cards.add(new SetCardInfo("Spider-Gwen, Free Spirit", 90, Rarity.COMMON, mage.cards.s.SpiderGwenFreeSpirit.class));
cards.add(new SetCardInfo("Spider-Ham, Peter Porker", 114, Rarity.RARE, mage.cards.s.SpiderHamPeterPorker.class));
cards.add(new SetCardInfo("Spider-Islanders", 91, Rarity.COMMON, mage.cards.s.SpiderIslanders.class));
cards.add(new SetCardInfo("Spider-Man Noir", 67, Rarity.UNCOMMON, mage.cards.s.SpiderManNoir.class));
cards.add(new SetCardInfo("Spider-Man, Brooklyn Visionary", 115, Rarity.COMMON, mage.cards.s.SpiderManBrooklynVisionary.class));
cards.add(new SetCardInfo("Spider-Man, Web-Slinger", 16, Rarity.COMMON, mage.cards.s.SpiderManWebSlinger.class));
cards.add(new SetCardInfo("Spider-Rex, Daring Dino", 116, Rarity.COMMON, mage.cards.s.SpiderRexDaringDino.class));
cards.add(new SetCardInfo("Starling, Aerial Ally", 18, Rarity.COMMON, mage.cards.s.StarlingAerialAlly.class));
cards.add(new SetCardInfo("Stegron the Dinosaur Man", 95, Rarity.COMMON, mage.cards.s.StegronTheDinosaurMan.class));
cards.add(new SetCardInfo("Swamp", 196, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Taxi Driver", 97, Rarity.COMMON, mage.cards.t.TaxiDriver.class));
cards.add(new SetCardInfo("Thwip!", 20, Rarity.COMMON, mage.cards.t.Thwip.class));
cards.add(new SetCardInfo("Tombstone, Career Criminal", 70, Rarity.UNCOMMON, mage.cards.t.TombstoneCareerCriminal.class));
cards.add(new SetCardInfo("Unstable Experiment", 47, Rarity.COMMON, mage.cards.u.UnstableExperiment.class));
cards.add(new SetCardInfo("Venom's Hunger", 73, Rarity.COMMON, mage.cards.v.VenomsHunger.class));
cards.add(new SetCardInfo("Venom, Evil Unleashed", 71, Rarity.COMMON, mage.cards.v.VenomEvilUnleashed.class));
cards.add(new SetCardInfo("Web Up", 21, Rarity.COMMON, mage.cards.w.WebUp.class));
cards.add(new SetCardInfo("Whoosh!", 48, Rarity.COMMON, mage.cards.w.Whoosh.class));
cards.add(new SetCardInfo("Wild Pack Squad", 23, Rarity.COMMON, mage.cards.w.WildPackSquad.class));
cards.removeIf(setCardInfo -> unfinished.contains(setCardInfo.getName()));
}
}

View file

@ -22,21 +22,29 @@ public final class MarvelsSpiderManEternal extends ExpansionSet {
cards.add(new SetCardInfo("Alchemax Slayer-Bots", 5, Rarity.COMMON, mage.cards.a.AlchemaxSlayerBots.class));
cards.add(new SetCardInfo("Amateur Hero", 1, Rarity.COMMON, mage.cards.a.AmateurHero.class));
cards.add(new SetCardInfo("Amazing Alliance", 2, Rarity.RARE, mage.cards.a.AmazingAlliance.class));
cards.add(new SetCardInfo("Doc Ock, Evil Inventor", 24, Rarity.RARE, mage.cards.d.DocOckEvilInventor.class));
cards.add(new SetCardInfo("Double Trouble", 13, Rarity.RARE, mage.cards.d.DoubleTrouble.class));
cards.add(new SetCardInfo("Future Flight", 6, Rarity.RARE, mage.cards.f.FutureFlight.class));
cards.add(new SetCardInfo("Ghost-Spider, Gwen Stacy", 14, Rarity.MYTHIC, mage.cards.g.GhostSpiderGwenStacy.class));
cards.add(new SetCardInfo("Grasping Tentacles", 21, Rarity.RARE, mage.cards.g.GraspingTentacles.class));
cards.add(new SetCardInfo("Green Goblin, Nemesis", 23, Rarity.RARE, mage.cards.g.GreenGoblinNemesis.class));
cards.add(new SetCardInfo("Grendel, Spawn of Knull", 9, Rarity.UNCOMMON, mage.cards.g.GrendelSpawnOfKnull.class));
cards.add(new SetCardInfo("Lethal Protection", 10, Rarity.RARE, mage.cards.l.LethalProtection.class));
cards.add(new SetCardInfo("Lyla, Holographic Assistant", 7, Rarity.UNCOMMON, mage.cards.l.LylaHolographicAssistant.class));
cards.add(new SetCardInfo("MJ, Rising Star", 3, Rarity.UNCOMMON, mage.cards.m.MJRisingStar.class));
cards.add(new SetCardInfo("Prowler, Misguided Mentor", 17, Rarity.UNCOMMON, mage.cards.p.ProwlerMisguidedMentor.class));
cards.add(new SetCardInfo("Pumpkin Bombs", 26, Rarity.RARE, mage.cards.p.PumpkinBombs.class));
cards.add(new SetCardInfo("Rampaging Classmate", 16, Rarity.COMMON, mage.cards.r.RampagingClassmate.class));
cards.add(new SetCardInfo("Sensational Spider-Man", 25, Rarity.RARE, mage.cards.s.SensationalSpiderMan.class));
cards.add(new SetCardInfo("Spider-Man 2099, Miguel O'Hara", 8, Rarity.MYTHIC, mage.cards.s.SpiderMan2099MiguelOHara.class));
cards.add(new SetCardInfo("Spider-Man, Miles Morales", 18, Rarity.MYTHIC, mage.cards.s.SpiderManMilesMorales.class));
cards.add(new SetCardInfo("Spider-Man, Peter Parker", 4, Rarity.MYTHIC, mage.cards.s.SpiderManPeterParker.class));
cards.add(new SetCardInfo("Symbiote Spawn", 11, Rarity.COMMON, mage.cards.s.SymbioteSpawn.class));
cards.add(new SetCardInfo("The Mary Janes", 15, Rarity.UNCOMMON, mage.cards.t.TheMaryJanes.class));
cards.add(new SetCardInfo("Twisted Spider-Clone", 19, Rarity.COMMON, mage.cards.t.TwistedSpiderClone.class));
cards.add(new SetCardInfo("Venom Blast", 20, Rarity.RARE, mage.cards.v.VenomBlast.class));
cards.add(new SetCardInfo("Venom, Deadly Devourer", 22, Rarity.RARE, mage.cards.v.VenomDeadlyDevourer.class));
cards.add(new SetCardInfo("Venom, Eddie Brock", 12, Rarity.MYTHIC, mage.cards.v.VenomEddieBrock.class));
}
}

View file

@ -0,0 +1,44 @@
package mage.abilities.effects.keyword;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.game.Game;
import java.util.UUID;
/**
* @author TheElk801
*/
public class ConniveTargetEffect extends OneShotEffect {
public ConniveTargetEffect() {
super(Outcome.Benefit);
}
private ConniveTargetEffect(final ConniveTargetEffect effect) {
super(effect);
}
@Override
public ConniveTargetEffect copy() {
return new ConniveTargetEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
ConniveSourceEffect.connive(game.getPermanent(targetId), 1, source, game);
}
return true;
}
@Override
public String getText(Mode mode) {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
}
return this.getTargetPointer().describeTargets(mode.getTargets(), "it") + " connives";
}
}

View file

@ -0,0 +1,73 @@
package mage.abilities.keyword;
import mage.ApprovingObject;
import mage.MageIdentifier;
import mage.abilities.SpellAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.cards.Card;
import mage.constants.SpellAbilityType;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.watchers.common.CastSpellLastTurnWatcher;
import java.util.Set;
import java.util.UUID;
/**
* @author TheElk801
*/
public class MayhemAbility extends SpellAbility {
public static final String MAYHEM_ACTIVATION_VALUE_KEY = "mayhemActivation";
private final String rule;
public MayhemAbility(Card card, String manaString) {
super(card.getSpellAbility());
this.newId();
this.setCardName(card.getName() + " with Mayhem");
zone = Zone.GRAVEYARD;
spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
this.clearManaCosts();
this.clearManaCostsToPay();
this.addCost(new ManaCostsImpl<>(manaString));
this.setRuleAtTheTop(true);
this.rule = "Surge " + manaString +
" <i>(You may cast this card from your graveyard for "+manaString+
" if you discarded it this turn. Timing rules still apply.)</i>";
}
protected MayhemAbility(final MayhemAbility ability) {
super(ability);
this.rule = ability.rule;
}
@Override
public ActivationStatus canActivate(UUID playerId, Game game) {
// TODO: Implement this
return super.canActivate(playerId,game);
}
@Override
public boolean activate(Game game, Set<MageIdentifier> allowedIdentifiers, boolean noMana) {
if (!super.activate(game, allowedIdentifiers, noMana)) {
return false;
}
this.setCostsTag(MAYHEM_ACTIVATION_VALUE_KEY, null);
return true;
}
@Override
public MayhemAbility copy() {
return new MayhemAbility(this);
}
@Override
public String getRule() {
return rule;
}
}

View file

@ -16,7 +16,7 @@ import mage.target.common.TargetControlledPermanent;
import java.util.Set;
/**
* @author LevelX2
* @author TheElk801
*/
public class WebSlingingAbility extends SpellAbility {

View file

@ -84,6 +84,7 @@ Lifelink|instance|
Living metal|new|
Living weapon|new|
Madness|cost|
Mayhem|card, manaString|
Melee|new|
Menace|new|
Mentor|new|