mirror of
https://github.com/correl/mage.git
synced 2024-12-01 03:00:09 +00:00
[ONE] Implement Nissa, Ascended Animist
This commit is contained in:
parent
7996e08286
commit
43c9a98ecd
5 changed files with 151 additions and 12 deletions
106
Mage.Sets/src/mage/cards/n/NissaAscendedAnimist.java
Normal file
106
Mage.Sets/src/mage/cards/n/NissaAscendedAnimist.java
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
package mage.cards.n;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.LoyaltyAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
|
import mage.constants.*;
|
||||||
|
import mage.abilities.keyword.CompleatedAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.token.PhyrexianHorrorGreenToken;
|
||||||
|
import mage.game.permanent.token.PhyrexianHorrorRedToken;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class NissaAscendedAnimist extends CardImpl {
|
||||||
|
|
||||||
|
private static final DynamicValue xValue
|
||||||
|
= new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.FOREST));
|
||||||
|
private static final Hint hint = new ValueHint("Forests you control", xValue);
|
||||||
|
|
||||||
|
public NissaAscendedAnimist(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}{G}{G/P}{G/P}");
|
||||||
|
|
||||||
|
this.addSuperType(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.NISSA);
|
||||||
|
this.setStartingLoyalty(7);
|
||||||
|
|
||||||
|
// Compleated
|
||||||
|
this.addAbility(CompleatedAbility.getInstance());
|
||||||
|
|
||||||
|
// +1: Create an X/X green Phyrexian Horror creature token, where X is Nissa, Ascended Animist's loyalty.
|
||||||
|
this.addAbility(new LoyaltyAbility(new NissaAscendedAnimistEffect(), 1));
|
||||||
|
|
||||||
|
// -1: Destroy target artifact or enchantment.
|
||||||
|
Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), -1);
|
||||||
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// -7: Until end of turn, creatures you control get +1/+1 for each Forest you control and gain trample.
|
||||||
|
ability = new LoyaltyAbility(new BoostControlledEffect(
|
||||||
|
xValue, xValue, Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURE,
|
||||||
|
false, true
|
||||||
|
).setText("until end of turn, creatures you control get +1/+1 for each Forest you control"), -7);
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
TrampleAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||||
|
).setText("and gain trample"));
|
||||||
|
this.addAbility(ability.addHint(hint));
|
||||||
|
}
|
||||||
|
|
||||||
|
private NissaAscendedAnimist(final NissaAscendedAnimist card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NissaAscendedAnimist copy() {
|
||||||
|
return new NissaAscendedAnimist(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NissaAscendedAnimistEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
NissaAscendedAnimistEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "create an X/X green Phyrexian Horror creature token, where X is {this}'s loyalty";
|
||||||
|
}
|
||||||
|
|
||||||
|
private NissaAscendedAnimistEffect(final NissaAscendedAnimistEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NissaAscendedAnimistEffect copy() {
|
||||||
|
return new NissaAscendedAnimistEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
int loyalty = Optional
|
||||||
|
.ofNullable(source.getSourcePermanentOrLKI(game))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(permanent -> permanent.getCounters(game))
|
||||||
|
.map(counters -> counters.getCount(CounterType.LOYALTY))
|
||||||
|
.orElse(0);
|
||||||
|
return new PhyrexianHorrorGreenToken(loyalty).putOntoBattlefield(1, game, source);
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,8 +8,6 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
|
||||||
import mage.abilities.effects.common.SacrificeEffect;
|
|
||||||
import mage.abilities.effects.common.SacrificeTargetEffect;
|
import mage.abilities.effects.common.SacrificeTargetEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
@ -17,12 +15,10 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.TargetController;
|
import mage.constants.TargetController;
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.token.PhyrexianHorrorToken;
|
import mage.game.permanent.token.PhyrexianHorrorRedToken;
|
||||||
import mage.game.permanent.token.Token;
|
import mage.game.permanent.token.Token;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
|
||||||
import mage.target.targetpointer.FixedTargets;
|
import mage.target.targetpointer.FixedTargets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,7 +73,7 @@ class UrabrasksForgeEffect extends OneShotEffect {
|
||||||
.map(permanent -> permanent.getCounters(game))
|
.map(permanent -> permanent.getCounters(game))
|
||||||
.map(counters -> counters.getCount(CounterType.OIL))
|
.map(counters -> counters.getCount(CounterType.OIL))
|
||||||
.orElse(0);
|
.orElse(0);
|
||||||
Token token = new PhyrexianHorrorToken(amount);
|
Token token = new PhyrexianHorrorRedToken(amount);
|
||||||
token.putOntoBattlefield(1, game, source);
|
token.putOntoBattlefield(1, game, source);
|
||||||
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
|
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
|
||||||
new SacrificeTargetEffect().setText("sacrifice it")
|
new SacrificeTargetEffect().setText("sacrifice it")
|
||||||
|
|
|
@ -42,6 +42,7 @@ public final class PhyrexiaAllWillBeOne extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Mirrex", 254, Rarity.RARE, mage.cards.m.Mirrex.class));
|
cards.add(new SetCardInfo("Mirrex", 254, Rarity.RARE, mage.cards.m.Mirrex.class));
|
||||||
cards.add(new SetCardInfo("Monument to Perfection", 233, Rarity.RARE, mage.cards.m.MonumentToPerfection.class));
|
cards.add(new SetCardInfo("Monument to Perfection", 233, Rarity.RARE, mage.cards.m.MonumentToPerfection.class));
|
||||||
cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Nissa, Ascended Animist", 175, Rarity.MYTHIC, mage.cards.n.NissaAscendedAnimist.class));
|
||||||
cards.add(new SetCardInfo("Norn's Wellspring", 24, Rarity.RARE, mage.cards.n.NornsWellspring.class));
|
cards.add(new SetCardInfo("Norn's Wellspring", 24, Rarity.RARE, mage.cards.n.NornsWellspring.class));
|
||||||
cards.add(new SetCardInfo("Ovika, Enigma Goliath", 213, Rarity.RARE, mage.cards.o.OvikaEnigmaGoliath.class));
|
cards.add(new SetCardInfo("Ovika, Enigma Goliath", 213, Rarity.RARE, mage.cards.o.OvikaEnigmaGoliath.class));
|
||||||
cards.add(new SetCardInfo("Phyrexian Arena", 104, Rarity.RARE, mage.cards.p.PhyrexianArena.class));
|
cards.add(new SetCardInfo("Phyrexian Arena", 104, Rarity.RARE, mage.cards.p.PhyrexianArena.class));
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package mage.game.permanent.token;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.keyword.HasteAbility;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class PhyrexianHorrorGreenToken extends TokenImpl {
|
||||||
|
|
||||||
|
public PhyrexianHorrorGreenToken(int xValue) {
|
||||||
|
super("Phyrexian Horror Token", "X/X green Phyrexian Horror creature token");
|
||||||
|
cardType.add(CardType.CREATURE);
|
||||||
|
color.setGreen(true);
|
||||||
|
subtype.add(SubType.PHYREXIAN);
|
||||||
|
subtype.add(SubType.HORROR);
|
||||||
|
power = new MageInt(xValue);
|
||||||
|
toughness = new MageInt(xValue);
|
||||||
|
|
||||||
|
availableImageSetCodes = Arrays.asList("ONE");
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhyrexianHorrorGreenToken(final PhyrexianHorrorGreenToken token) {
|
||||||
|
super(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PhyrexianHorrorGreenToken copy() {
|
||||||
|
return new PhyrexianHorrorGreenToken(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,10 +11,10 @@ import java.util.Arrays;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class PhyrexianHorrorToken extends TokenImpl {
|
public final class PhyrexianHorrorRedToken extends TokenImpl {
|
||||||
|
|
||||||
public PhyrexianHorrorToken(int xValue) {
|
public PhyrexianHorrorRedToken(int xValue) {
|
||||||
super("Phyrexian Token", "X/1 red Phyrexian Horror creature token with trample and haste");
|
super("Phyrexian Horror Token", "X/1 red Phyrexian Horror creature token with trample and haste");
|
||||||
cardType.add(CardType.CREATURE);
|
cardType.add(CardType.CREATURE);
|
||||||
color.setRed(true);
|
color.setRed(true);
|
||||||
subtype.add(SubType.PHYREXIAN);
|
subtype.add(SubType.PHYREXIAN);
|
||||||
|
@ -28,12 +28,12 @@ public final class PhyrexianHorrorToken extends TokenImpl {
|
||||||
availableImageSetCodes = Arrays.asList("ONE");
|
availableImageSetCodes = Arrays.asList("ONE");
|
||||||
}
|
}
|
||||||
|
|
||||||
public PhyrexianHorrorToken(final PhyrexianHorrorToken token) {
|
public PhyrexianHorrorRedToken(final PhyrexianHorrorRedToken token) {
|
||||||
super(token);
|
super(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PhyrexianHorrorToken copy() {
|
public PhyrexianHorrorRedToken copy() {
|
||||||
return new PhyrexianHorrorToken(this);
|
return new PhyrexianHorrorRedToken(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue