forked from External/mage
master #31
28 changed files with 1073 additions and 91 deletions
46
Mage.Sets/src/mage/cards/a/AmazingAlliance.java
Normal file
46
Mage.Sets/src/mage/cards/a/AmazingAlliance.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
69
Mage.Sets/src/mage/cards/d/DocOckSinisterScientist.java
Normal file
69
Mage.Sets/src/mage/cards/d/DocOckSinisterScientist.java
Normal 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);
|
||||
}
|
||||
}
|
||||
68
Mage.Sets/src/mage/cards/d/DoubleTrouble.java
Normal file
68
Mage.Sets/src/mage/cards/d/DoubleTrouble.java
Normal 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;
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/e/ElectrosBolt.java
Normal file
36
Mage.Sets/src/mage/cards/e/ElectrosBolt.java
Normal 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);
|
||||
}
|
||||
}
|
||||
58
Mage.Sets/src/mage/cards/g/GhostSpiderGwenStacy.java
Normal file
58
Mage.Sets/src/mage/cards/g/GhostSpiderGwenStacy.java
Normal 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);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/g/GrowExtraArms.java
Normal file
47
Mage.Sets/src/mage/cards/g/GrowExtraArms.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
40
Mage.Sets/src/mage/cards/l/LethalProtection.java
Normal file
40
Mage.Sets/src/mage/cards/l/LethalProtection.java
Normal 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);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/m/MechanicalMobster.java
Normal file
48
Mage.Sets/src/mage/cards/m/MechanicalMobster.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
47
Mage.Sets/src/mage/cards/r/RampagingClassmate.java
Normal file
47
Mage.Sets/src/mage/cards/r/RampagingClassmate.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
38
Mage.Sets/src/mage/cards/s/SpiderIslanders.java
Normal file
38
Mage.Sets/src/mage/cards/s/SpiderIslanders.java
Normal 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);
|
||||
}
|
||||
}
|
||||
50
Mage.Sets/src/mage/cards/s/SpiderMan2099MiguelOHara.java
Normal file
50
Mage.Sets/src/mage/cards/s/SpiderMan2099MiguelOHara.java
Normal 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);
|
||||
}
|
||||
}
|
||||
83
Mage.Sets/src/mage/cards/s/SpiderManNoir.java
Normal file
83
Mage.Sets/src/mage/cards/s/SpiderManNoir.java
Normal 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);
|
||||
}
|
||||
}
|
||||
57
Mage.Sets/src/mage/cards/s/StegronTheDinosaurMan.java
Normal file
57
Mage.Sets/src/mage/cards/s/StegronTheDinosaurMan.java
Normal 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);
|
||||
}
|
||||
}
|
||||
52
Mage.Sets/src/mage/cards/t/TheMaryJanes.java
Normal file
52
Mage.Sets/src/mage/cards/t/TheMaryJanes.java
Normal 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);
|
||||
}
|
||||
}
|
||||
37
Mage.Sets/src/mage/cards/u/UnstableExperiment.java
Normal file
37
Mage.Sets/src/mage/cards/u/UnstableExperiment.java
Normal 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);
|
||||
}
|
||||
}
|
||||
82
Mage.Sets/src/mage/cards/v/VenomEddieBrock.java
Normal file
82
Mage.Sets/src/mage/cards/v/VenomEddieBrock.java
Normal 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;
|
||||
}
|
||||
}
|
||||
58
Mage.Sets/src/mage/cards/v/VenomEvilUnleashed.java
Normal file
58
Mage.Sets/src/mage/cards/v/VenomEvilUnleashed.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
73
Mage/src/main/java/mage/abilities/keyword/MayhemAbility.java
Normal file
73
Mage/src/main/java/mage/abilities/keyword/MayhemAbility.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ import mage.target.common.TargetControlledPermanent;
|
|||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author LevelX2
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class WebSlingingAbility extends SpellAbility {
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ Lifelink|instance|
|
|||
Living metal|new|
|
||||
Living weapon|new|
|
||||
Madness|cost|
|
||||
Mayhem|card, manaString|
|
||||
Melee|new|
|
||||
Menace|new|
|
||||
Mentor|new|
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue