It is currently 13 May 2025, 10:57
   
Text Size

Adding new cards with Groovy

Moderators: ubeefx, beholder, melvin, ShawnieBoy, Lodici, CCGHQ Admins

Re: Adding new cards with Groovy

Postby hong yie » 25 Aug 2013, 10:29

how to apply script for
"search your library ...then put into hand" instead of onto battlefield?
User avatar
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

Postby melvin » 25 Aug 2013, 10:51

Typically those require a "reveal" action which is not yet implemented.
User avatar
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

Postby melvin » 25 Aug 2013, 12:28

Image

Magarena/scripts/Path_to_Exile.txt
Code: Select all
name=Path to Exile
url=http://magiccards.info/mma/en/25.html
image=http://magiccards.info/scans/en/mma/25.jpg
removal=5
rarity=U
type=Instant
cost={W}
timing=removal
requires_groovy_code
Magarena/scripts/Path_to_Exile.groovy
Code: Select all
[
    new MagicSpellCardEvent() {
        @Override
        public MagicEvent getEvent(final MagicCardOnStack cardOnStack, final MagicPayedCost payedCost) {
            return new MagicEvent(
                cardOnStack,
                MagicTargetChoice.NEG_TARGET_CREATURE,
                MagicExileTargetPicker.create(),
                this,
                "Exile target creature\$. " +
                "Its controller may search his or her library for a basic land card, put that card onto the battlefield tapped, then shuffle his or her library."
            );
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            event.processTargetPermanent(game,new MagicPermanentAction() {
                public void doAction(final MagicPermanent creature) {
                    game.doAction(new MagicRemoveFromPlayAction(creature,MagicLocationType.Exile));
                    game.addEvent(new MagicSearchOntoBattlefieldEvent(
                        event.getSource(),
                        creature.getController(),
                        new MagicMayChoice(
                            "Search for a basic land card?",
                            MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
                        ),
                        MagicPlayMod.TAPPED
                    ));
                }
            });
        }
    }
]
User avatar
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

Postby hong yie » 25 Aug 2013, 14:07

Need some testing...
Image
Perilous_Forays.txt
Code: Select all
name=Perilous Forays
url=http://magiccards.info/rav/en/176.html
image=http://magiccards.info/scans/en/rav/176.jpg
value=3.731
rarity=U
type=Enchantment
cost={3}{G}{G}
timing=enchantment
requires_groovy_code
Perilous_Forays.groovy
Code: Select all
[
    new MagicPermanentActivation(
        new MagicActivationHints(MagicTiming.Removal),
        "Damage"
    ) {

        @Override
        public MagicEvent[] getCostEvent(final MagicPermanent source) {
            return [
                new MagicPayManaCostTapEvent("{1}"),
            new MagicSacrificePermanentEvent(
                    source,
                    MagicTargetChoice.SACRIFICE_CREATURE
                )
            ];
        }

        @Override
        public MagicEvent getPermanentEvent(final MagicPermanent source, final MagicPayedCost payedCost) {
            return new MagicEvent(
                permanent,
                this,
                "PN searches his or her library for a basic land card and put that card onto the battlefield tapped. Then shuffle PN's library."
            );
      }

        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.addEvent(new MagicEvent(
                event.getSource(),
                MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY,
                {
                    final MagicGame G, final MagicEvent E ->
                    E.processTargetCard(G, {
                        final MagicCard card ->
                        G.doAction(new MagicRemoveCardAction(card,MagicLocationType.OwnersLibrary));
                        G.doAction(new MagicPlayCardAction(card,event.getPlayer(),MagicPlayMod.TAPPED));
                        G.doAction(new MagicShuffleLibraryAction(event.getPlayer()));
                    } as MagicCardAction);
                } as MagicEventAction,
                "Selected basic land card\$."
            ));
        }
    }
]
User avatar
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

Postby ember hauler » 25 Aug 2013, 19:56

melvin wrote:Library search!
Oh, yes!
You made my day, man.
Keep up the good work! :)
ember hauler
 
Posts: 79
Joined: 14 Aug 2013, 08:13
Has thanked: 27 times
Been thanked: 14 times

Re: Adding new cards with Groovy

Postby melvin » 26 Aug 2013, 13:52

ember hauler wrote:Oh, yes!
You made my day, man.
Keep up the good work! :)
Thanks for the encouragement!

Image

Magarena/scripts/Young_Pyromancer.txt
Code: Select all
name=Young Pyromancer
url=http://magiccards.info/m14/en/163.html
image=http://magiccards.info/scans/en/m14/163.jpg
value=3.717
rarity=U
type=Creature
subtype=Human,Shaman
cost={1}{R}
pt=2/1
timing=main
requires_groovy_code
Magarena/scripts/Young_Pyromancer.groovy
Code: Select all
[
    new MagicWhenOtherSpellIsCastTrigger() {
        @Override
        public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicCardOnStack cardOnStack) {
            return cardOnStack.isFriend(permanent) && cardOnStack.isInstantOrSorcery() ?
                new MagicEvent(
                    permanent,
                    this,
                    "PN puts a 1/1 red Elemental creature token onto the battlefield."
                ) :
                MagicEvent.NONE;
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.doAction(new MagicPlayTokenAction(
                event.getPlayer(),
                TokenCardDefinitions.get("R Elemental")
            ));
        }
    }
]
User avatar
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

Postby hong yie » 26 Aug 2013, 16:32

Image
Darksteel_Colossus.txt
Code: Select all
name=Darksteel Colossus
url=http://magiccards.info/m10/en/208.html
image=http://magiccards.info/scans/en/m10/208.jpg
value=4.604
ability=trample,indestructible,graveyard to library
rarity=M
type=Artifact,Creature
subtype=Golem
cost={11}
pt=11/11
timing=main
Image
Code: Select all
name=Blightsteel Colossus
url=http://magiccards.info/mbs/en/99.html
image=http://magiccards.info/scans/en/mbs/99.jpg
value=4.055
ability=trample,infect,indestructible,graveyard to library
rarity=M
type=Artifact,Creature
subtype=Golem
cost={12}
pt=11/11
timing=main
Image
Progenitus.txt
Code: Select all
name=Progenitus
url=http://magiccards.info/mma/en/182.html
image=http://magiccards.info/scans/en/mma/182.jpg
value=4.315
rarity=M
type=Legendary,Creature
subtype=Hydra,Avatar
cost={W}{W}{U}{U}{B}{B}{R}{R}{G}{G}
pt=10/10
ability=unblockable,shroud,graveyard to library
timing=main
requires_groovy_code
Progenitus.groovy
Code: Select all
[
    new MagicIfDamageWouldBeDealtTrigger(MagicTrigger.PREVENT_DAMAGE) {
        @Override
        public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
            if (damage.getTarget()==permanent) {
                damage.prevent();
            }
            return MagicEvent.NONE;
        }
    }
]
User avatar
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

Postby melvin » 28 Aug 2013, 08:16

hong yie wrote:how to apply script for
"search your library ...then put into hand" instead of onto battlefield?
Now that I think about it again, we should just go ahead and have some cards with this effect but leave out the reveal part for now. Seems to be not so easy to track revealed cards for the purpose of the AI, will need more time to iron it out.

Here is something I put together to test this effect, uses a new event MagicSearchIntoHandEvent

Image

Magarena/scripts/Sylvan_Scrying.txt
Code: Select all
name=Sylvan Scrying
url=http://magiccards.info/10e/en/302.html
image=http://magiccards.info/scans/en/10e/302.jpg
value=4.638
rarity=U
type=Sorcery
cost={1}{G}
timing=main
requires_groovy_code
Magarena/scripts/Sylvan_Scrying.groovy
Code: Select all
[
    new MagicSpellCardEvent() {
        @Override
        public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) {
            return new MagicEvent(
                cardOnStack,
                this,
                "PN searches his or her library for a land card, reveal it, and put it into his or her hand. Then shuffle PN's library."
            );
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.addEvent(new MagicSearchIntoHandEvent(
                event,
                MagicTargetChoice.LAND_CARD_FROM_LIBRARY
            ));
        }
    }
]
User avatar
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

Postby hong yie » 28 Aug 2013, 22:48

Image
Civic_Wayfinder.txt
Code: Select all
name=Civic Wayfinder
url=http://magiccards.info/dpa/en/56.html
image=http://magiccards.info/scans/en/dpa/56.jpg
value=3.524
rarity=C
type=Creature
subtype=Elf,Warrior,Druid
cost={2}{G}
pt=2/2
timing=main
requires_groovy_code
Civic_Wayfinder.groovy
Code: Select all
[
    new MagicWhenComesIntoPlayTrigger() {
        @Override
        public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) {     
            return new MagicEvent(
                permanent,
                this,
                "PN searches his or her library for a land card, reveal it, and put it into his or her hand. Then shuffle PN's library."
            );
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.addEvent(new MagicSearchIntoHandEvent(
                event,
                MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
            ));           
        }
    }
]
Image
Borderland_Ranger.txt
Code: Select all
name=Borderland Ranger
url=http://magiccards.info/avr/en/169.html
image=http://magiccards.info/scans/en/avr/169.jpg
value=3.593
rarity=C
type=Creature
subtype=Human,Scout
cost={2}{G}
pt=2/2
timing=main
requires_groovy_code=Civic Wayfinder
Image
Primeval_Titan.txt
Code: Select all
name=Primeval Titan
url=http://magiccards.info/m12/en/188.html
image=http://magiccards.info/scans/en/m12/188.jpg
value=4.416
ability=trample
rarity=M
type=Creature
subtype=Giant
cost={4}{G}{G}
pt=6/6
timing=main
requires_groovy_code
Primeval_Titan.groovy
Code: Select all
[
    new MagicWhenComesIntoPlayTrigger() {
        @Override
        public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) {     
            return new MagicEvent(
            permanent,
            this,
            "PN may search his or her library for up to two basic land cards and put them onto the battlefield tapped, then shuffle his or her library."
         );
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.addEvent(new MagicSearchOntoBattlefieldEvent(
                event,
                new MagicMayChoice(
                    "Search for a basic land card?",
                    MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
                ),
                MagicPlayMod.TAPPED
            ));
            game.addEvent(new MagicSearchOntoBattlefieldEvent(
                event,
                new MagicMayChoice(
                    "Search for a basic land card?",
                    MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
                ),
                MagicPlayMod.TAPPED
            ));
        }
    },
    new MagicWhenAttacksTrigger() {
        @Override
        public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPermanent creature) {
            return (permanent == creature) ?
            new MagicEvent(
               permanent,
               this,
               "PN may search his or her library for up to two basic land cards and put them onto the battlefield tapped, then shuffle his or her library."
            ):
         MagicEvent.NONE;      
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            game.addEvent(new MagicSearchOntoBattlefieldEvent(
                event,
                new MagicMayChoice(
                    "Search for a basic land card?",
                    MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
                ),
                MagicPlayMod.TAPPED
            ));
            game.addEvent(new MagicSearchOntoBattlefieldEvent(
                event,
                new MagicMayChoice(
                    "Search for a basic land card?",
                    MagicTargetChoice.BASIC_LAND_CARD_FROM_LIBRARY
                ),
                MagicPlayMod.TAPPED
            ));
        }
    }      
]
User avatar
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

Postby melvin » 29 Aug 2013, 01:42

@hong yie: Looks good! Don't forget to submit on http://www.firemind.ch/card_script_submissions/new
User avatar
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

Postby hong yie » 29 Aug 2013, 04:40

submitted. :)
User avatar
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

Postby hong yie » 29 Aug 2013, 15:13

Image
Thorn_Elemental.txt
Code: Select all
name=Thorn Elemental
url=http://magiccards.info/8e/en/283.html
image=http://magiccards.info/scans/en/8e/283.jpg
value=4.487
rarity=R
type=Creature
subtype=Elemental
cost={5}{G}{G}
pt=7/7
timing=main
requires_groovy_code
Thorn_Elemental.groovy
Code: Select all
[
    new MagicWhenBecomesBlockedTrigger() {
        @Override
        public MagicEvent executeTrigger(
                final MagicGame game,
                final MagicPermanent permanent,
                final MagicPermanent attacker) {
            return (permanent == attacker) ?
                new MagicEvent(
                    permanent,
                    new MagicMayChoice(),
                    this,
                    "PN may\$ have SN deal its combat damage " +
                    "to defending player as though it weren't blocked."
                ):
                MagicEvent.NONE;
        }

        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            if (event.isYes()) {
                final MagicPermanent permanent = event.getPermanent();
                final MagicDamage damage = MagicDamage.Combat(
                    permanent,
                    event.getPlayer().getOpponent(),
                    permanent.getPower()
                );
                game.doAction(new MagicDealDamageAction(damage));
                game.doAction(MagicChangeStateAction.Set(
                    permanent,
                    MagicPermanentState.NoCombatDamage
                ));
            }
        }
    }
]
Image
Pestilence_Demon.txt
Code: Select all
name=Pestilence Demon
url=http://magiccards.info/roe/en/124.html
image=http://magiccards.info/scans/en/roe/124.jpg
value=4.387
rarity=R
type=Creature
subtype=Demon
cost={5}{B}{B}{B}
pt=7/6
ability=flying
timing=main
requires_groovy_code
Pestilence_demon.groovy
Code: Select all
[
    new MagicPermanentActivation(
        new MagicActivationHints(MagicTiming.None),"Damage"
    ) {
        @Override
        public MagicEvent[] getCostEvent(final MagicPermanent source) {
            return [
                new MagicPayManaCostEvent(source,"{B}")
            ];
        }

        @Override
        public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
            return new MagicEvent(
                source,
                this,
                "SN deals 1 damage to all creatures and players."
            );
        }

        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            final Collection<MagicPermanent> targets =
                game.filterPermanents(event.getPlayer(),MagicTargetFilter.TARGET_CREATURE);
            for (final MagicPermanent target : targets) {
                final MagicDamage damage=new MagicDamage(event.getSource(),target,1);
                game.doAction(new MagicDealDamageAction(damage));
            }
            for (final MagicPlayer player : game.getPlayers()) {
                final MagicDamage damage=new MagicDamage(event.getSource(),player,1);
                game.doAction(new MagicDealDamageAction(damage));
            }
        }
    }
]
User avatar
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

Postby hong yie » 29 Aug 2013, 15:58

Image
Vinelasher_Kudzu.txt
Code: Select all
name=Vinelasher Kudzu
url=http://magiccards.info/rav/en/189.html
image=http://magiccards.info/scans/en/rav/189.jpg
value=4.470
rarity=R
type=Creature
subtype=Plant
cost={1}{G}
pt=1/1
timing=main
requires_groovy_code
Vinelasher_Kudzu.groovy
Code: Select all
[
    new MagicLandfallTrigger() {
        @Override
        public MagicEvent getEvent(final MagicPermanent permanent) {
            return new MagicEvent(
                permanent,
                this,
                "PN put a +1/+1 counter on SN."
            );
        }
        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
         game.doAction(new MagicChangeCountersAction(
            event.getPermanent(),
            MagicCounterType.PlusOne,
            1,
            true
         ));
        }
    }
]
User avatar
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

Postby melvin » 30 Aug 2013, 01:03

Thanks! I've merged them in from firemind.

Thorn Elemental's groovy script looks the same as Rhox, in that case it is better to refer to Rhox's script in Thorn Elemental's card script like so to reduce duplication.

Code: Select all
name=Thorn Elemental
url=http://magiccards.info/8e/en/283.html
image=http://magiccards.info/scans/en/8e/283.jpg
value=4.487
rarity=R
type=Creature
subtype=Elemental
cost={5}{G}{G}
pt=7/7
timing=main
requires_groovy_code=Rhox
User avatar
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

Postby melvin » 01 Sep 2013, 05:30

Note the use of lord effect in ability property of card script.

Image

Magarena/scripts/Balthor_the_Stout.txt
Code: Select all
name=Balthor the Stout
url=http://magiccards.info/tr/en/91.html
image=http://magiccards.info/scans/en/tr/91.jpg
value=4.238
rarity=R
type=Legendary,Creature
subtype=Dwarf,Barbarian
cost={1}{R}{R}
pt=2/2
ability=lord other barbarian creatures get +1/+1
static=all
timing=main
requires_groovy_code
Magarena/scripts/Balthor_the_Stout.groovy
Code: Select all
[
    new MagicPermanentActivation(
        new MagicActivationHints(MagicTiming.Pump),
        "Pump"
    ) {

        @Override
        public Iterable<MagicEvent> getCostEvent(final MagicPermanent source) {
            return [new MagicPayManaCostEvent(source,"{R}")];
        }

        @Override
        public MagicEvent getPermanentEvent(final MagicPermanent source,final MagicPayedCost payedCost) {
            final MagicTargetChoice targetChoice = new MagicTargetChoice(
                new MagicOtherPermanentTargetFilter(
                    MagicTargetFilter.TARGET_BARBARIAN,
                    source
                ),
                true,
                MagicTargetHint.Positive,
                "another target Barbarian"
            );
            return new MagicEvent(
                source,
                targetChoice,
                MagicPumpTargetPicker.create(),
                this,
                "Another target Barbarian creature\$ gets +1/+0 until end of turn."
            );
        }

        @Override
        public void executeEvent(final MagicGame game, final MagicEvent event) {
            event.processTargetPermanent(game,new MagicPermanentAction() {
                public void doAction(final MagicPermanent creature) {
                    game.doAction(new MagicChangeTurnPTAction(creature, 1, 0));
                }
            });
        }
    }
]
User avatar
melvin
AI Programmer
 
Posts: 1062
Joined: 21 Mar 2010, 12:26
Location: Singapore
Has thanked: 36 times
Been thanked: 459 times

PreviousNext

Return to Magarena

Who is online

Users browsing this forum: No registered users and 7 guests


Who is online

In total there are 7 users online :: 0 registered, 0 hidden and 7 guests (based on users active over the past 10 minutes)
Most users ever online was 4143 on 23 Jan 2024, 08:21

Users browsing this forum: No registered users and 7 guests

Login Form