Adding new cards with Groovy
by ubeefx
Moderators: ubeefx, beholder, melvin, ShawnieBoy, Lodici, CCGHQ Admins
Re: Adding new cards with Groovy
by ember hauler » 05 Nov 2013, 15:40
No problem, here it is:
- Code: Select all
Abilities format:
-----------------
ability=<ability1>;<ability2>;\
<ability3>;<ability4>
Static, triggered and activated <ability> keywords:
---------------------------------------------------
ally grow - Whenever this card or another Ally enters the battlefield under your control, you may put a +1/+1 counter on this card.
annihilator <n>
attacks each turn if able
attacks pump <pt change>
battle cry
bestow <mana cost>
blocked by pump <pt change> - Triggers for each creature blocking this card
blocked pump <pt change> - Triggers once when this card becomes blocked.
blocks or blocked pump <pt change>
bloodthirst <n>
bushido <n>
can block creatures with shadow
can't attack or block
can't be blocked by <color> creatures
can't be blocked by creatures with flying
can't be blocked except by creatures with flying
can't be blocked except by creatures with flying or reach
can't be countered
can't block
can't block creatures without flying
champion <creature/subtype/subtype or subtype>
changeling
combat damage discard card
combat damage grow <creature/player> - Whenever this card deals combat damage to a creature/player, put a +1/+1 counter on it.
cumulative upkeep <mana cost>
damage discard card
damage grow <creature/player> - Whenever this card deals damage to a creature/player, put a +1/+1 counter on it.
damage opponent discard random card
deathtouch
defender
devour <n>
die draw card
die may draw card
doesn't untap during untap step
double strike
each upkeep <effect>
echo <mana cost> - when you omit the mana cost parameter, it will be equal to the casting cost
enters damage target [creature/player] <n> - When the first argument is omitted the target is a creature or player.
enters destroy {target}
enters draw card
enters gain life <n>
enters lose life <n>
enters tapped
enters tapped unless <subtype1> <subtype2> - Enters the battlefield tapped unless you control a land of subtype1 or subtype2.
enters tapped unless two - Enters the battlefield tapped unless you control two or fewer other lands.
enters with +1/+1 <n>
enters with +1/+1 for each kick <mana cost> - This card enters the battlefield with a +1/+1 counter on it for each time it was kicked.
enters with -1/-1 <n>
enters with arrowhead <n>
enters with charge <n>
enters with mining <n>
exalted
fading <n>
fear
first strike
flanking
flash (also need to set timing=flash)
flying
forestwalk
haste
heroic effect <effect>
hexproof
indestructible
infect
intimidate
islandwalk
landfall pump <pt change> - Whenever a land enters the battlefield under your control, this card gets pt change until end of turn.
leaves damage target [creature/player] <n> - When the first argument is omitted the target is a creature or player.
leaves gain life <n>
leaves lose life <n>
leaves return exile - When this card leaves the battlefield, return exiled card.
level up <mana cost> <max level> - max level is used by the AI
lifelink
living weapon
miracle <mana cost>
modular <n>
monstrosity <n> <mana cost>
mountainwalk
persist
ping <n> - Tap: this card deals n damage to target creature or player
plainswalk
protection from <color/monocolored/all colors>
protection from <creatures/Demons/Dragons/Vampires/Werewolves/Zombies>
pump <mana cost> <pt change>
rampage <n>
reach
regenerate <mana cost>
sac add mana <mana type/any> - Sacrifice this card: Add one mana of mana type to your mana pool
scry <n> - will be implemented in Magarena 1.44
shadow
shock land - You may pay 2 life. If you don't, this card enters the battlefield tapped.
shroud
soulbond
soulshift <n>
swampwalk
tap add mana <mana type/any> - e.g. tap add mana {1} or {U}
tap drain add mana <mana type/any> - Remove a charge counter from this card: Add one mana of mana type to your mana pool
tap pain add mana <mana type/any> - Tap: Add <mana type/any> to your mana pool. Source deals 1 damage to you.
tap sac add mana <mana type/any> - Tap and sacrifice this card: Add one mana of mana type to your mana pool
totem armor
trample
unblockable
undying
vanishing <n>
vigilance
wither
Not implemented yet:
--------------------
Amplify
Banding
Convoke
Delve
Dredge
Entwine {2}
Flashback
Fuse
Graft
Horsemanship
Madness
Monstrosity
Morph
Phasing
Proliferate
Provoke
Recover
Ripple
Scavenge
Suspend X
Transfigure
Transmute
Unearth
Activated ability with cost:
----------------------------
pay <cost1>[, <cost2>]*: <effect>
Ability <cost>:
---------------
{T} = Tap this permanent
{S} = Sacrifice this permanent
{E} = Exile this permanent
{C} = Remove a charge counter
{C3} = Remove three charge counters
{+1/+1} = Remove a +1/+1 counter
{O} = Activate this ability only once each turn
{Q} = ?
Pay 1 life
Sacrifice a creature
Sacrifice an artifact
Sacrifice a <creature type>
Sacrifice a land
Discard a card
Discard two cards
{B}{G}{U}{W}{R} = mana colors
{n} = any mana
Ability <effect> examples:
--------------------------
Counter target instant or sorcery spell unless its controller pays {1}.
Counter target noncreature spell.
Counter target spell unless its controller pays {1}.
Counter target spell with {X} in its mana cost unless its controller pays {3}.
Counter target spell.
Creatures PN controls gain indestructible until end of turn.
Creatures PN controls get +1/+0 until end of turn.
Destroy target artifact or enchantment.
Destroy target artifact.
Destroy target creature or enchantment.
Destroy target creature with power 4 or greater.
Destroy target creature with shadow.
Destroy target creature.
Destroy target land.
Destroy target nonbasic land.
Destroy target nonblack creature.
Destroy target tapped creature.
Exile target creature.
Exile target enchantment.
PN draws a card, then discards a card.
PN draws a card.
PN draws two cards.
PN gains 2 life.
PN puts a 1/1 colorless Myr artifact creature token onto the battlefield.
PN puts a 1/1 green Elf Warrior creature token onto the battlefield.
PN puts a 5/5 red Dragon creature token with flying onto the battlefield.
PN puts a legendary 2/2 green and white Wolf creature token named Voja onto the battlefield.
PN puts an 8/8 Beast creature token that's red, green, and white onto the battlefield.
Prevent the next 1 damage that would be dealt to target creature or player this turn.
Prevent the next 1 damage that would be dealt to target player this turn.
Prevent the next 1 damage that would be dealt to target Sliver creature or player this turn.
Prevent the next 2 damage that would be dealt to target artifact creature this turn.
Put a +1/+1 counter on SN.
Put a charge counter on SN.
Red creatures and white creatures PN controls gain first strike until end of turn.
Return SN to its owner's hand.
Return target permanent you control to its owner's hand.
Samurai creatures PN controls gain double strike until end of turn.
SN deals 1 damage to target attacking or blocking creature.
SN deals 1 damage to target attacking or blocking Spirit.
SN deals 1 damage to target creature or player.
SN deals 1 damage to target player.
SN deals 4 damage to target attacking creature with flying.
SN gets -1/+1 until end of turn.
Tap target artifact or creature.
Tap target artifact, creature, or land.
Tap target creature with flying.
Tap target creature without flying.
Tap target creature.
Tap target non-Human creature.
Tap target permanent.
Target Assembly-Worker creature gets +1/+1 until end of turn.
Target attacking creature gets +1/+1 until end of turn.
Target creature gains first strike until end of turn.
Target creature gets -2/-2 until end of turn.
Target creature you control gains deathtouch until end of turn.
Target Knight creature gets +1/+1 until end of turn.
Untap SN.
Untap target creature.
Untap target Elf.
Untap target Forest.
Untap target Gate.
Untap target land.
Untap target permanent.
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by jerichopumpkin » 13 Nov 2013, 11:21
For some reason, I could not submit this on Firemind.ch

Magarena/scripts/Sydri__Galvanic_Genius.txt

Magarena/scripts/Sydri__Galvanic_Genius.txt
- Code: Select all
name=Sydri, Galvanic Genius
url=http://magiccards.info/c13/en/220.html
image=http://magiccards.info/scans/en/c13/220.jpg
value=4.423
rarity=M
type=Legendary,Creature
subtype=Human,Artificer
cost={W}{U}{B}
pt=2/2
ability=pay {W}{B}:Target artifact creature gains deathtouch and lifelink until end of turn.
timing=main
requires_groovy_code
- Code: Select all
def PT = new MagicStatic(MagicLayer.SetPT, MagicStatic.UntilEOT) {
@Override
public void modPowerToughness(final MagicPermanent source,final MagicPermanent permanent,final MagicPowerToughness pt) {
final int cmc = permanent.getConvertedCost();
pt.set(cmc,cmc);
}
};
def ST = new MagicStatic(MagicLayer.Type, MagicStatic.UntilEOT) {
@Override
public int getTypeFlags(final MagicPermanent permanent,final int flags) {
return flags|MagicType.Artifact.getMask()|MagicType.Creature.getMask();
}
};
def TP = new MagicTargetPicker<MagicPermanent>() {
@Override
protected int getTargetScore(final MagicGame game,final MagicPlayer player,final MagicPermanent permanent) {
final MagicPowerToughness pt=permanent.getPowerToughness();
final int power = permanent.getConvertedCost();
final int toughness = permanent.getConvertedCost();
final int score = (pt.power()-power)*2+(pt.toughness()-toughness);
return permanent.getController() == player ? -score:score;
}
};
[
new MagicPermanentActivation(
new MagicActivationHints(MagicTiming.Animate),
"Animate"
) {
@Override
public Iterable<MagicEvent> getCostEvent(final MagicPermanent source) {
return [new MagicPayManaCostEvent(source,"{U}")];
}
@Override
public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
return new MagicEvent(
source,
MagicTargetChoice.POS_TARGET_NONCREATURE_ARTIFACT,
TP,
this,
"Target noncreature artifact\$ becomes an artifact creature with " +
"power and toughness each equal to its converted mana cost until end of turn"
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetPermanent(game, {
final MagicPermanent creature ->
game.doAction(new MagicBecomesCreatureAction(creature,PT,ST));
} as MagicPermanentAction);
}
}
]
- jerichopumpkin
- Posts: 212
- Joined: 12 Sep 2013, 11:21
- Has thanked: 19 times
- Been thanked: 13 times
Re: Adding new cards with Groovy
by jerichopumpkin » 23 Nov 2013, 17:27
I've done Pernicious Deed, and while testing, I've noticed that you can't choose zero as value for X. I know the cases are very limited, but I'd like to be able to do it (especially with this one)

Pernicious_Deed.txt

Pernicious_Deed.txt
- Code: Select all
name=Pernicious Deed
url=http://magiccards.info/ap/en/114.html
image=http://magiccards.info/scans/en/ap/114.jpg
value=4.519
rarity=R
type=Enchantment
cost={1}{B}{G}
timing=enchantment
requires_groovy_code
- Code: Select all
def TARGET_ARTIFACT_OR_CREATURE_OR_ENCHANTMENT = new MagicPermanentFilterImpl () {
public boolean accept(final MagicGame game,final MagicPlayer player,final MagicPermanent target) {
return target.isArtifact() ||
target.isEnchantment() ||
target.isCreature();
}
};
[
new MagicPermanentActivation(
new MagicActivationHints(MagicTiming.Removal),
"Destroy"
) {
@Override
public Iterable<MagicEvent> getCostEvent(final MagicPermanent source) {
return [
new MagicPayManaCostTapEvent(source,"{X}"),
new MagicSacrificeEvent(source)
];
}
@Override
public MagicEvent getPermanentEvent(final MagicPermanent source, final MagicPayedCost payedCost) {
final int amount=payedCost.getX();
return new MagicEvent(
source,
amount,
this,
"Destroy each artifact, creature and enchantment with converted mana cost RN or less."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPermanent source = event.getPermanent();
final int amount = event.getRefInt();
final Collection<MagicPermanent> targets=
game.filterPermanents(
source.getController(),
new MagicTargetFilter.MagicCMCPermanentFilter(
TARGET_ARTIFACT_OR_CREATURE_OR_ENCHANTMENT,
MagicTargetFilter.Operator.LESS_THAN_OR_EQUAL,
amount
)
);
game.doAction(new MagicDestroyAction(targets));
}
}
]
- jerichopumpkin
- Posts: 212
- Joined: 12 Sep 2013, 11:21
- Has thanked: 19 times
- Been thanked: 13 times
Re: Adding new cards with Groovy
by ember hauler » 24 Nov 2013, 16:11
Trying to make Body Double.
I guess it's almost like Clone, so I took Clone script and changed MagicTargetChoice.CREATURE to MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS.
Unfortunately, it's not that easy, game crashed with error "Exception from controller.runGame: magic.model.MagicCard cannot be cast to magic.model.MagicPermanent"
Is there an easy way to correct this?
I guess it's almost like Clone, so I took Clone script and changed MagicTargetChoice.CREATURE to MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS.
Unfortunately, it's not that easy, game crashed with error "Exception from controller.runGame: magic.model.MagicCard cannot be cast to magic.model.MagicPermanent"
Is there an easy way to correct this?
- Code: Select all
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
new MagicMayChoice(MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS),
MagicCopyTargetPicker.create(),
this,
"Put SN onto the battlefield. You may\$ have SN enter the battlefield as a copy of any creature\$ card in a graveyard."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
event.processTargetPermanent(game, {
final MagicPermanent chosen ->
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen
));
} as MagicPermanentAction);
} else {
game.doAction(new MagicPlayCardFromStackAction(
event.getCardOnStack()
));
}
}
}
]
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by melvin » 25 Nov 2013, 03:03
This issue is the executeEvent assumes that the chosen object is a permanent as it uses event.processTargetPermanent and MagicPermanentAction.
So to use a card as the chosen object, you should change to event.processTargetCard and MagicCardAction.
There is a version of the EnterAsCopy that accepts a card definition. So your executeEvent in the "Yes" block should look something like the following:
So to use a card as the chosen object, you should change to event.processTargetCard and MagicCardAction.
There is a version of the EnterAsCopy that accepts a card definition. So your executeEvent in the "Yes" block should look something like the following:
- Code: Select all
event.processTargetCard(game, {
final MagicCard chosen ->
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen.getCardDefinition()
));
} as MagicCardAction);
-
melvin - AI Programmer
- Posts: 1062
- Joined: 21 Mar 2010, 12:26
- Location: Singapore
- Has thanked: 36 times
- Been thanked: 459 times
Re: Adding new cards with Groovy
by ember hauler » 26 Nov 2013, 17:21
Unfortunately, it still crashes with Body Double:
Body_Double.groovy: 19: [Static type checking] - Cannot find matching method java.lang.Class#EnterAsCopy(magic.model.stack.MagicCardOnStack, magic.model.MagicCardDefinition). Please check if the declared type is right and if the method exists.
The code is:
Body_Double.groovy: 19: [Static type checking] - Cannot find matching method java.lang.Class#EnterAsCopy(magic.model.stack.MagicCardOnStack, magic.model.MagicCardDefinition). Please check if the declared type is right and if the method exists.
The code is:
- Code: Select all
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
new MagicMayChoice(MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS),
MagicCopyTargetPicker.create(),
this,
"Put SN onto the battlefield. You may\$ have SN enter the battlefield as a copy of any creature\$ card in a graveyard."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
event.processTargetCard(game, {
final MagicCard chosen ->
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen.getCardDefinition()
));
} as MagicCardAction);
} else {
game.doAction(new MagicPlayCardFromStackAction(
event.getCardOnStack()
));
}
}
}
]
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by melvin » 27 Nov 2013, 02:26
Oops, silly me. Actually the EnterAsCopy accepts MagicCard as the second parameter. So it should be:
- Code: Select all
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen
));
-
melvin - AI Programmer
- Posts: 1062
- Joined: 21 Mar 2010, 12:26
- Location: Singapore
- Has thanked: 36 times
- Been thanked: 459 times
Re: Adding new cards with Groovy
by jeffwadsworth » 27 Nov 2013, 14:56

Last edited by jeffwadsworth on 29 Nov 2013, 17:28, edited 1 time in total.
- jeffwadsworth
- Super Tester Elite
- Posts: 1172
- Joined: 20 Oct 2010, 04:47
- Location: USA
- Has thanked: 287 times
- Been thanked: 70 times
Re: Adding new cards with Groovy
by ember hauler » 28 Nov 2013, 15:35
Sorry to say, but it crashes nevertheless, this time with:
Exception from controller.runGame: magic.model.MagicCard cannot be cast to magic.model.MagicPermanent
The full code is:
Exception from controller.runGame: magic.model.MagicCard cannot be cast to magic.model.MagicPermanent
The full code is:
- Code: Select all
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
new MagicMayChoice(MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS),
MagicCopyTargetPicker.create(),
this,
"Put SN onto the battlefield. You may\$ have SN enter the battlefield as a copy of any creature\$ card in a graveyard."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
event.processTargetCard(game, {
final MagicCard chosen ->
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen
));
} as MagicCardAction);
} else {
game.doAction(new MagicPlayCardFromStackAction(
event.getCardOnStack()
));
}
}
}
]
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by melvin » 29 Nov 2013, 02:00
My fault really, I should have tested with the AI as well. Anyway the crash is when the AI tried to use the target picker, which is MagicCopyTargetPicker.create() in the implementation but that also assumes the target is a permanent. Will change the name of that class to reflect that assumption in the next release.ember hauler wrote:Sorry to say, but it crashes nevertheless, this time with:
[i]Exception from controller.runGame: magic.model.MagicCard cannot be cast to magic.model.MagicPermanent
The fix is to use MagicGraveyardTargetPicker.PutOntoBattlefield instead.
Thanks for sticking through with this, now we'll have a brand new effect not seen before in Magarena.
-
melvin - AI Programmer
- Posts: 1062
- Joined: 21 Mar 2010, 12:26
- Location: Singapore
- Has thanked: 36 times
- Been thanked: 459 times
Re: Adding new cards with Groovy
by ember hauler » 29 Nov 2013, 18:16
Thanks melvin, it is working now.
I was worried to be too insistent.
Submitted the script thru Firemind.
I was worried to be too insistent.
Submitted the script thru Firemind.
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by melvin » 30 Nov 2013, 01:55
Thanks, will be including it in 1.44! I'm including it here to showcase the interesting Groovy script for this card.

Magarena/scripts/Body_Double.txt

Magarena/scripts/Body_Double.txt
- Code: Select all
name=Body Double
url=http://magiccards.info/plc/en/35.html
image=http://magiccards.info/scans/en/pc/35.jpg
value=4.258
rarity=R
type=Creature
subtype=Shapeshifter
cost={4}{U}
pt=0/0
timing=main
requires_groovy_code
- Code: Select all
[
new MagicSpellCardEvent() {
@Override
public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
return new MagicEvent(
cardOnStack,
new MagicMayChoice(MagicTargetChoice.TARGET_CREATURE_CARD_FROM_ALL_GRAVEYARDS),
MagicGraveyardTargetPicker.PutOntoBattlefield,
this,
"Put SN onto the battlefield. You may\$ have SN enter the battlefield as a copy of any creature\$ card in a graveyard."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
event.processTargetCard(game, {
final MagicCard chosen ->
game.doAction(MagicPlayCardFromStackAction.EnterAsCopy(
event.getCardOnStack(),
chosen
));
} as MagicCardAction);
} else {
game.doAction(new MagicPlayCardFromStackAction(
event.getCardOnStack()
));
}
}
}
]
-
melvin - AI Programmer
- Posts: 1062
- Joined: 21 Mar 2010, 12:26
- Location: Singapore
- Has thanked: 36 times
- Been thanked: 459 times
Re: Adding new cards with Groovy
by ember hauler » 06 Dec 2013, 07:40
Now I'm trying to make Hidden Horror:

Any hints?
Thanks!

- Code: Select all
name=Hidden Horror
url=http://magiccards.info/pd3/en/2.html
image=http://magiccards.info/scans/en/pd3/2.jpg
value=3.911
rarity=U
type=Creature
subtype=Horror
cost={1}{B}{B}
pt=4/4
timing=main
requires_groovy_code
- Code: Select all
[
new MagicWhenComesIntoPlayTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPayedCost payedCost) {
final MagicPlayer player = permanent.getController();
return player.getHandSize() > 0 ?
new MagicEvent(
permanent,
new MagicMayChoice(),
this,
"PN may\$ discard a creature card. " +
"If you don't, sacrifice SN."
):
new MagicEvent(
permanent,
{
final MagicGame G, final MagicEvent E ->
G.doAction(new MagicSacrificeAction(E.getPermanent()));
},
"Sacrifice SN."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isNo()) {
game.doAction(new MagicSacrificeAction(event.getPermanent()));
} else {
game.addEvent(new MagicDiscardEvent(event.getPermanent(), event.getPlayer(), 1));
}
}
}
]
Any hints?
Thanks!
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Re: Adding new cards with Groovy
by hong yie » 09 Dec 2013, 07:21
i tried to script this one too, but failed. have posted an issue as issue 404Now I'm trying to make Hidden Horror:
http://code.google.com/p/magarena/issues/detail?id=404&q=cost&sort=id
anyway, i really love this card, have 4 of them in my graveyard deck. i even collect 4 copies of real foil cards and older edition of this horror.

-
hong yie - Programmer
- Posts: 216
- Joined: 10 Mar 2013, 06:44
- Location: Jakarta
- Has thanked: 75 times
- Been thanked: 9 times
Re: Adding new cards with Groovy
by ember hauler » 09 Dec 2013, 09:41
True.
Unfinished Business in DotP 2014 is a great fun to play with, so I compiled even better deck in Magarena. Hidden Horror is essential for this type of Reanimator.
Unfinished Business in DotP 2014 is a great fun to play with, so I compiled even better deck in Magarena. Hidden Horror is essential for this type of Reanimator.
- ember hauler
- Posts: 79
- Joined: 14 Aug 2013, 08:13
- Has thanked: 27 times
- Been thanked: 14 times
Who is online
Users browsing this forum: No registered users and 4 guests