Add more cards:

Angel of Fury
Angrath, the Flame-Chained
Bloodspore Thrinax
Din of the Fireherd (+5_5_black_and_red_Elemental_creature_token)
Erayo, Soratami Ascendant / Erayo's Essence
Ezuri, Claw of Progress
Grief Tyrant
Grunn, the Lonely King
Guardian of the Ages
Hellion Eruption (+4/4 red Hellion creature token)
Kalemne, Disciple of Iroas
Kumano's Blessing
Lightning Coils
Morbid Bloom
Nezumi Shortfang / Stabwhisker the Odious
The Immortal Sun
Urgoros, the Empty One
Wash Out
master
Bilbo 2018-10-24 23:40:41 +02:00 committed by Melvin Zhang
parent 2f7f188a52
commit 9cc1dac5aa
43 changed files with 561 additions and 70 deletions

View File

@ -0,0 +1,10 @@
name=4/4 red Hellion creature token
token=Hellion
image=https://img.scryfall.com/cards/normal/en/tpca/12.jpg
image_updated=2015-11-12
value=4
type=Creature
subtype=Hellion
color=r
pt=4/4

View File

@ -0,0 +1,8 @@
name=5/5 black and red Elemental creature token
token=Elemental
image=https://img.scryfall.com/cards/normal/en/tshm/9.jpg
value=5
type=Creature
subtype=Elemental
color=rb
pt=5/5

View File

@ -6,9 +6,7 @@ type=Creature
subtype=Angel
cost={4}{W}{W}
pt=3/5
ability=Flying;\
When SN dies, you may shuffle it into its owner's library.
ability=Flying
timing=main
oracle=Flying\nWhen Angel of Fury dies, you may shuffle it into its owner's library.
status=needs groovy
#Parses but graveyard -> library, not battlefield -> library
requires_groovy_code=Guan Yu, Sainted Warrior

View File

@ -0,0 +1,46 @@
[
new MagicPlaneswalkerActivation(-3) {
@Override
public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
return new MagicEvent(
source,
NEG_TARGET_CREATURE,
MagicExileTargetPicker.create(),
this,
"PN untaps target creature\$ and gains control of it until end of turn. " +
"That creature gains haste until end of turn. "+
"Sacrifice it at the beginning of the next end step if it has converted mana cost 3 or less."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetPermanent(game, {
game.doAction(new GainControlAction(event.getPlayer(),it,MagicStatic.UntilEOT));
game.doAction(new UntapAction(it));
game.doAction(new GainAbilityAction(it,MagicAbility.Haste));
if (it.getConvertedCost() <= 3) {
game.doAction(new AddTriggerAction(it, AtEndOfTurnTrigger.Sacrifice));
}
});
}
},
new MagicPlaneswalkerActivation(-8) {
@Override
public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
return new MagicEvent(
source,
this,
"Each opponent loses life equal to the number of cards in his or her graveyard."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
final int amount=CARD_FROM_GRAVEYARD.filter(event.getSource().getOpponent()).size();
game.logAppendValue(player,amount);
game.doAction(new ChangeLifeAction(player.getOpponent(),-amount));
}
}
]

View File

@ -6,8 +6,7 @@ type=Legendary,Planeswalker
subtype=Angrath
cost={3}{B}{R}
loyalty=4
ability=+1: Each opponent discards a card and loses 2 life.;\
3: Gain control of target creature until end of turn. Untap it. It gains haste until end of turn. Sacrifice it at the beginning of the next end step if it has converted mana cost 3 or less.;\
8: Each opponent loses life equal to the number of cards in his or her graveyard.
ability=+1: Each opponent discards a card~and each opponent loses 2 life.
timing=main
requires_groovy_code
oracle=+1: Each opponent discards a card and loses 2 life.\n3: Gain control of target creature until end of turn. Untap it. It gains haste until end of turn. Sacrifice it at the beginning of the next end step if it has converted mana cost 3 or less.\n8: Each opponent loses life equal to the number of cards in his or her graveyard.

View File

@ -0,0 +1,20 @@
[
new OtherEntersBattlefieldTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicPermanent otherPermanent) {
if (otherPermanent != permanent &&
otherPermanent.isCreature() &&
otherPermanent.isFriend(permanent)) {
final int amount = permanent.getCounters(MagicCounterType.PlusOne);
if (amount > 0 ) {
game.doAction(new ChangeCountersAction(permanent.getController(), otherPermanent, MagicCounterType.PlusOne, amount));
game.logAppendMessage(
permanent.getController(),
"${otherPermanent.getName()} enters the battlefield with an additional ${amount} +1/+1 counters on it."
);
}
}
return MagicEvent.NONE;
}
}
]

View File

@ -7,8 +7,7 @@ type=Creature
subtype=Lizard
cost={2}{G}{G}
pt=2/2
ability=Devour 1;\
Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on SN.
ability=Devour 1;
timing=fmain
oracle=Devour 1\nEach other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspore Thrinax.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,40 @@
def action = {
final MagicGame game, final MagicEvent event ->
event.processTargetPlayer(game, {
final MagicPlayer player = event.getPlayer();
final int BC = BLACK_CREATURE_YOU_CONTROL.filter(player).size();
game.logAppendValue(player,BC)
for (int i = 0; i < BC; i++) {
game.addEvent(new MagicSacrificePermanentEvent(event.getSource(), it, SACRIFICE_CREATURE));
}
final int RC = RED_CREATURE_YOU_CONTROL.filter(player).size();
game.logAppendValue(player,RC)
for (int i = 0; i < RC; i++) {
game.addEvent(new MagicSacrificePermanentEvent(event.getSource(), it, SACRIFICE_LAND));
}
});
}
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
this,
"PN create a 5/5 black and red Elemental creature token."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new PlayTokensAction(event.getPlayer(), CardDefinitions.getToken("5/5 black and red Elemental creature token"), 1));
game.doAction(new PutItemOnStackAction(new MagicTriggerOnStack(new MagicEvent(
event.getSource(),
TARGET_OPPONENT,
action,
"Target opponent\$ sacrifices a creature for each black creature PN control, "+
"then sacrifices a land for each red creature PN control."
))));
}
}
]

View File

@ -4,7 +4,6 @@ value=3.939
rarity=R
type=Sorcery
cost={5}{B/R}{B/R}{B/R}
effect=Create a 5/5 black and red Elemental creature token. Target opponent sacrifices a creature for each black creature you control, then sacrifices a land for each red creature you control.
timing=main
oracle=Create a 5/5 black and red Elemental creature token. Target opponent sacrifices a creature for each black creature you control, then sacrifices a land for each red creature you control.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,21 @@
[
new OtherSpellIsCastTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicCardOnStack cardOnStack) {
return (game.getSpellsCast() == 3) ?
new MagicEvent(
permanent,
cardOnStack,
this,
"Whenever the fourth spell of a turn is cast, flip SN."
)
:
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new FlipAction(event.getPermanent()));
}
}
]

View File

@ -6,9 +6,9 @@ type=Legendary,Creature
subtype=Moonfolk,Monk
cost={1}{U}
pt=1/1
ability=Flying;\
Whenever the fourth spell of a turn is cast, flip SN.
ability=Flying
flip=Erayo's Essence
timing=main
requires_groovy_code
oracle=Flying\nWhenever the fourth spell of a turn is cast, flip Erayo, Soratami Ascendant.
status=needs groovy

View File

@ -0,0 +1,22 @@
[
new OtherSpellIsCastTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicCardOnStack cardOnStack) {
return (permanent.isOpponent(cardOnStack.getController()) && permanent.getOpponent().getSpellsCast() == 0) ?
new MagicEvent(
permanent,
cardOnStack,
this,
"Whenever an opponent casts his or her first spell each turn, counter that spell.RN"
)
:
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new CounterItemOnStackAction(event.getRefCardOnStack()));
}
}
]

View File

@ -4,9 +4,9 @@ value=4.211
rarity=R
type=Legendary,Enchantment
cost={1}{U}
ability=Whenever an opponent casts his or her first spell each turn, counter that spell.
flip=Erayo, Soratami Ascendant
timing=enchantment
hidden
requires_groovy_code
oracle=Whenever an opponent casts his or her first spell each turn, counter that spell.
status=needs groovy

View File

@ -0,0 +1,30 @@
def choice = MagicTargetChoice.Positive("another target creature you control")
[
new AtBeginOfCombatTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPlayer turnPlayer) {
return permanent.getController().getExperience() > 0;
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPlayer attackingPlayer) {
return permanent.getController() == attackingPlayer ?
new MagicEvent(
permanent,
choice,
this,
"PN puts X +1/+1 counters on another target creature he or she control\$, where X is the number of experience counters PN have."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetPermanent(game, {
final int X = event.getPlayer().getExperience();
game.logAppendX(event.getPlayer(), X);
game.doAction(new ChangeCountersAction(event.getPlayer(), it, MagicCounterType.PlusOne, X));
});
}
}
]

View File

@ -7,8 +7,8 @@ type=Legendary,Creature
subtype=Elf,Warrior
cost={2}{G}{U}
pt=3/3
ability=Whenever a creature with power 2 or less enters the battlefield under your control, you get an experience counter.;\
At the beginning of combat on your turn, put X +1/+1 counters on another target creature you control, where X is the number of experience counters you have.
ability=Whenever a creature with power 2 or less enters the battlefield under your control, you get an experience counter.
timing=fmain
requires_groovy_code
oracle=Whenever a creature with power 2 or less enters the battlefield under your control, you get an experience counter.\nAt the beginning of combat on your turn, put X +1/+1 counters on another target creature you control, where X is the number of experience counters you have.
status=needs groovy

View File

@ -0,0 +1,21 @@
[
new ThisDiesTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent diedPermanent) {
final int amount = permanent.getCounters(MagicCounterType.MinusOne);
return new MagicEvent(
permanent,
NEG_TARGET_CREATURE,
amount,
this,
"PN put ${amount} -1/-1 counter(s) on target creature\$."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetPermanent(game, {
game.doAction(new ChangeCountersAction(event.getPlayer(),it, MagicCounterType.MinusOne, event.getRefInt()));
});
}
}
]

View File

@ -6,8 +6,7 @@ type=Creature
subtype=Horror
cost={5}{B/R}
pt=8/8
ability=SN enters the battlefield with four -1/-1 counters on it.;\
When SN dies, put a -1/-1 counter on target creature for each -1/-1 counter on SN.
ability=SN enters the battlefield with four -1/-1 counters on it.
timing=main
oracle=Grief Tyrant enters the battlefield with four -1/-1 counters on it.\nWhen Grief Tyrant dies, put a -1/-1 counter on target creature for each -1/-1 counter on Grief Tyrant.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,32 @@
[
new EntersWithCounterTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) {
if (payedCost.isKicked()) {
game.doAction(new ChangeCountersAction(permanent.getController(),permanent,MagicCounterType.PlusOne,5));
}
return MagicEvent.NONE;
}
},
new ThisAttacksTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPermanent attacker) {
return super.accept(permanent, attacker) && attacker.getController().getNrOfAttackers() == 1;
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent attacker) {
return new MagicEvent(
permanent,
this,
"Double SN's power and toughness until end of turn."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final int power = event.getPermanent().getPower();
final int toughness = event.getPermanent().getToughness();
game.doAction(new ChangeTurnPTAction(event.getPermanent(), power, toughness));
}
}
]

View File

@ -6,8 +6,7 @@ type=Legendary,Creature
subtype=Ape,Warrior
cost={4}{G}{G}
pt=5/5
ability=Kicker {3};\
If SN was kicked, it enters the battlefield with five +1/+1 counters on it.;\
Whenever Grunn attacks alone, double its power and toughness until end of turn.
ability=Kicker {3}
timing=main
requires_groovy_code
oracle=Kicker {3}\nIf Grunn, the Lonely King was kicked, it enters the battlefield with five +1/+1 counters on it.\nWhenever Grunn attacks alone, double its power and toughness until end of turn.

View File

@ -0,0 +1,20 @@
[
new AttacksTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPermanent creature) {
return permanent.isEnemy(creature) && permanent.hasAbility(MagicAbility.Defender) ?
new MagicEvent(
permanent,
this,
"SN loses defender and gains trample."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPermanent perm = event.getPermanent();
game.doAction(new LoseAbilityAction(perm,MagicAbility.Defender, MagicStatic.Forever));
game.doAction(new GainAbilityAction(perm,MagicAbility.Trample, MagicStatic.Forever));
}
}
]

View File

@ -6,8 +6,7 @@ type=Artifact,Creature
subtype=Golem
cost={7}
pt=7/7
ability=Defender;\
When a creature attacks you or a planeswalker you control, if SN has defender, it loses defender and gains trample.
ability=Defender
timing=smain
oracle=Defender\nWhen a creature attacks you or a planeswalker you control, if Guardian of the Ages has defender, it loses defender and gains trample.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,25 @@
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
this,
"PN sacrifice all creatures he or she controls. " +
"Then creates that many 4/4 red Hellion creature tokens."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final Collection<MagicPermanent> targets = CREATURE_YOU_CONTROL.filter(event);
for (final MagicPermanent target : targets) {
game.doAction(new SacrificeAction(target))
}
game.doAction(new PlayTokensAction(
event.getPlayer(),
CardDefinitions.getToken("4/4 red Hellion creature token"),
targets.size()
));
}
}
]

View File

@ -4,7 +4,7 @@ value=3.000
rarity=R
type=Sorcery
cost={5}{R}
effect=Sacrifice all creatures you control, then create that many 4/4 red Hellion creature tokens.
timing=main
requires_groovy_code
oracle=Sacrifice all creatures you control, then create that many 4/4 red Hellion creature tokens.
status=needs groovy

View File

@ -0,0 +1,25 @@
[
new OtherSpellIsCastTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicCardOnStack spell) {
return spell.isFriend(permanent) && spell.hasType(MagicType.Creature) && spell.getConvertedCost() >= 5 ?
new MagicEvent(
permanent,
this,
"PN gets an experience counter."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new ChangeCountersAction(event.getPlayer(),event.getPlayer(),MagicCounterType.Experience, 1));
}
},
new MagicStatic(MagicLayer.ModPT) {
@Override
public void modPowerToughness(final MagicPermanent source, final MagicPermanent permanent, final MagicPowerToughness pt) {
int amount = permanent.getController().getExperience();
pt.add(amount,amount);
}
}
]

View File

@ -7,9 +7,8 @@ type=Legendary,Creature
subtype=Giant,Soldier
cost={2}{R}{W}
pt=3/3
ability=Double strike, vigilance;\
Whenever you cast a creature spell with converted mana cost 5 or greater, you get an experience counter.;\
SN gets +1/+1 for each experience counter you have.
ability=Double strike, vigilance
timing=main
requires_groovy_code
oracle=Double strike, vigilance\nWhenever you cast a creature spell with converted mana cost 5 or greater, you get an experience counter.\nKalemne, Disciple of Iroas gets +1/+1 for each experience counter you have.
status=needs groovy

View File

@ -0,0 +1,19 @@
[
new DamageIsDealtTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
return damage.getSource() == permanent.getEnchantedPermanent() && damage.getTarget().isCreaturePermanent() ?
new MagicEvent(
permanent,
damage.getTargetPermanent(),
this,
"If RN would die this turn, exile it instead."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new AddTurnTriggerAction(event.getRefPermanent(),ThisLeavesBattlefieldTrigger.IfDieExileInstead));
}
}
]

View File

@ -6,9 +6,8 @@ type=Enchantment
subtype=Aura
cost={2}{R}
ability=Flash;\
Enchant creature;\
If a creature dealt damage by enchanted creature this turn would die, exile it instead.
Enchant creature.
timing=flash
enchant=default,creature
enchant=pump,pos creature
oracle=Flash\nEnchant creature\nIf a creature dealt damage by enchanted creature this turn would die, exile it instead.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,49 @@
def trigger = new AtEndOfTurnTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPlayer eotPlayer) {
return new MagicEvent(
permanent,
this,
"Exile SN."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new RemoveFromPlayAction(event.getPermanent(), MagicLocationType.Exile));
}
}
def playMod = {
final MagicPermanent perm ->
final MagicGame game = perm.getGame();
game.doAction(new AddTurnTriggerAction(perm, trigger));
}
[
new AtYourUpkeepTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPlayer upkeepPlayer) {
final int counters = permanent.getCounters(MagicCounterType.Charge);
return permanent.getCounters(MagicCounterType.Charge) >= 5 ?
new MagicEvent(
permanent,
counters,
this,
"PN remove all charge counters from SN and creates RN 3/1 red Elemental creature tokens with haste. "+
"Exile them at the beginning of the next end step."
) :
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new ChangeCountersAction(event.getPlayer(),event.getPermanent(),MagicCounterType.Charge,-event.getRefInt()));
event.getRefInt().times {
game.doAction(new PlayTokenAction(
event.getPlayer(),
CardDefinitions.getToken("3/1 red Elemental creature token with haste"),
playMod
));
}
}
}
]

View File

@ -4,8 +4,7 @@ value=3.755
rarity=R
type=Artifact
cost={3}
ability=Whenever a nontoken creature you control dies, put a charge counter on SN.;\
At the beginning of your upkeep, if SN has five or more charge counters on it, remove all of them from it and create that many 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step.
ability=Whenever a nontoken creature you control dies, put a charge counter on SN.
timing=artifact
oracle=Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.\nAt the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it and create that many 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step.
status=needs groovy
requires_groovy_code

View File

@ -0,0 +1,25 @@
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS,
MagicGraveyardTargetPicker.PutOntoBattlefield,
this,
"Exile target creature card\$ from a graveyard. "+
"PN creates X 1/1 green Saproling creature tokens, where X is the exiled creature card's toughness."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetCard(game, {
final int amount = it.getToughness();
final MagicPlayer player = event.getPlayer();
game.logAppendValue(player,amount);
game.doAction(new ShiftCardAction(it, MagicLocationType.Graveyard, MagicLocationType.Exile));
game.doAction(new PlayTokensAction(player,CardDefinitions.getToken("1/1 green Saproling creature token"),amount));
});
}
}
]

View File

@ -4,7 +4,6 @@ value=2.894
rarity=U
type=Sorcery
cost={4}{B}{G}
effect=Exile target creature card from a graveyard, then create X 1/1 green Saproling creature tokens, where X is the exiled card's toughness.
timing=main
requires_groovy_code
oracle=Exile target creature card from a graveyard, then create X 1/1 green Saproling creature tokens, where X is the exiled card's toughness.
status=needs groovy

View File

@ -0,0 +1,44 @@
def action = {
final MagicGame game, final MagicEvent event ->
final int hand = event.getPlayer().getHandSize();
if (hand == 0) {
game.doAction(new FlipAction(event.getPermanent()));
}
}
[
new MagicPermanentActivation(
new MagicActivationHints(MagicTiming.Removal),
"Discard"
) {
@Override
public Iterable<? extends MagicEvent> getCostEvent(final MagicPermanent source) {
return [
new MagicTapEvent(source),
new MagicPayManaCostEvent(source, "{1}{B}")
];
}
@Override
public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
return new MagicEvent(
source,
TARGET_OPPONENT,
this,
"Target opponent\$ discards a card. Then if that player has no cards in hand, flip SN."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetPlayer(game,{
game.addEvent(new MagicDiscardEvent(event.getSource(),it));
game.addEvent(new MagicEvent(
event.getSource(),
it,
action,
""
));
});
}
}
]

View File

@ -6,8 +6,8 @@ type=Creature
subtype=Rat,Rogue
cost={1}{B}
pt=1/1
ability={1}{B}, {T}: Target opponent discards a card. Then if that player has no cards in hand, flip SN.
flip=Stabwhisker the Odious
timing=main
oracle={1}{B}, {T}: Target opponent discards a card. Then if that player has no cards in hand, flip Nezumi Shortfang.
status=needs groovy
requires_groovy_code

View File

@ -38,9 +38,8 @@ def choice = new MagicTargetChoice("a nonland permanent to sacrifice");
game.addEvent(discard);
} else {
game.doAction(new ChangeLifeAction(event.getPlayer(), -3));
}
}
}
}
}
]

View File

@ -0,0 +1,24 @@
[
new AtUpkeepTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return permanent.isOpponent(upkeepPlayer) ?
new MagicEvent(
permanent,
permanent.getController(),
upkeepPlayer,
this,
"RN loses 1 life for each card fewer than three in RN's hand."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getRefPlayer();
final int loss = 3 - player.getHandSize();
if (loss > 0) {
game.doAction(new ChangeLifeAction(player, -loss));
}
}
}
]

View File

@ -6,9 +6,9 @@ type=Legendary,Creature
subtype=Rat,Shaman
cost={1}{B}
pt=3/3
ability=At the beginning of each opponent's upkeep, that player loses 1 life for each card fewer than three in his or her hand.
flip=Nezumi Shortfang
timing=main
hidden
oracle=At the beginning of each opponent's upkeep, that player loses 1 life for each card fewer than three in his or her hand.
status=needs groovy
requires_groovy_code

View File

@ -1,32 +1,32 @@
def action = {
final MagicGame game, final MagicEvent event ->
if (event.isYes()) {
for (final MagicPlayer player : game.getAPNAP()) {
final int x = event.getCardOnStack().getX();
game.doAction(new PlayTokensAction(player,CardDefinitions.getToken("1/1 red Elemental creature token with haste"),x));
}
if (event.isYes()) {
for (final MagicPlayer player : game.getAPNAP()) {
final int x = event.getCardOnStack().getX();
game.doAction(new PlayTokensAction(player, CardDefinitions.getToken("1/1 red Elemental creature token with haste"), x));
}
}
}
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
public MagicEvent getEvent(final MagicCardOnStack cardOnStack, final MagicPayedCost payedCost) {
final int x=payedCost.getX();
return new MagicEvent(
cardOnStack,
this,
"PN creates "+x+" 1/1 red Elemental creature tokens with haste."
"PN creates " + x + " 1/1 red Elemental creature tokens with haste."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final int x = event.getCardOnStack().getX();
game.doAction(new PlayTokensAction(event.getPlayer(),CardDefinitions.getToken("1/1 red Elemental creature token with haste"),x));
game.addEvent(new MagicEvent(event.getSource(),event.cardOnStack.getOpponent(),new MagicMayChoice("Create tokens?"),action,
"PN may\$ creates "+x+" 1/1 red Elemental creature tokens with haste. "+
"If PN does, "+event.getPlayer()+" creates "+x+" 1/1 red Elemental creature tokens with haste."
game.doAction(new PlayTokensAction(event.getPlayer(), CardDefinitions.getToken("1/1 red Elemental creature token with haste"), x));
game.addEvent(new MagicEvent(event.getSource(), event.cardOnStack.getOpponent(), new MagicMayChoice("Create tokens?"), action,
"PN may\$ creates " + x + " 1/1 red Elemental creature tokens with haste. " +
"If PN does, " + event.getPlayer() + " creates " + x + " 1/1 red Elemental creature tokens with haste."
));
}
}
]
]

View File

@ -4,7 +4,7 @@ value=2.500
rarity=M
type=Legendary,Artifact
cost={6}
ability=Players can't activate planeswalkers' loyalty abilities.;\
ability=Planeswalkers can't activate abilities.;\
At the beginning of your draw step, draw an additional card.;\
Spells you cast cost {1} less to cast.;\
Creatures you control get +1/+1.

View File

@ -20,7 +20,7 @@ def action = {
game.addEvent(discard);
} else {
game.doAction(new ChangeLifeAction(event.getPlayer(), -3));
}
}
}
}
@ -58,4 +58,3 @@ def action = {
}
}
]

View File

@ -20,7 +20,7 @@ def action = {
game.addEvent(discard);
} else {
game.doAction(new ChangeLifeAction(event.getPlayer(), -3));
}
}
}
}
@ -57,4 +57,3 @@ def action = {
}
}
]

View File

@ -7,6 +7,6 @@ subtype=Specter
cost={4}{B}{B}
pt=4/3
ability=Flying;\
Whenever SN deals combat damage to a player, that player discards a card at random. If the player can't, you draw a card.
Whenever SN deals combat damage to a player, that player discards a card at random.~If that player has no cards in hand, you draw a card.
timing=main
oracle=Flying\nWhenever Urgoros, the Empty One deals combat damage to a player, that player discards a card at random. If the player can't, you draw a card.

View File

@ -0,0 +1,26 @@
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
MagicColorChoice.UNSUMMON_INSTANCE,
this,
"PN choose a color\$, " +
"return all permanents of that color to their owner's hand."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicColor color=event.getChosenColor();
final MagicPermanentList all = new MagicPermanentList();
PERMANENT.filter(event) each {
if (it.hasColor(color)) {
all.add(it);
}
}
game.doAction(new RemoveAllFromPlayAction(all, MagicLocationType.OwnersHand));
}
}
]

View File

@ -4,7 +4,6 @@ value=4.294
rarity=U
type=Sorcery
cost={3}{U}
effect=Return all permanents of the color of your choice to their owners' hands.
timing=main
oracle=Return all permanents of the color of your choice to their owners' hands.
status=needs groovy
requires_groovy_code