Re: Adding new cards with Groovy
how to apply script for
"search your library ...then put into hand" instead of onto battlefield?
"search your library ...then put into hand" instead of onto battlefield?
High Quality Resources for Collectible Card Games and Home of the CCGHQ Team
https://www.slightlymagic.net/forum/
https://www.slightlymagic.net/forum/viewtopic.php?f=82&t=10323

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
[
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
));
}
});
}
}
]

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[
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\$."
));
}
}
]Oh, yes!melvin wrote:Library search!
Thanks for the encouragement!ember hauler wrote:Oh, yes!
You made my day, man.
Keep up the good work!

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
[
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")
));
}
}
]

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
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
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[
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;
}
}
]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.hong yie wrote:how to apply script for
"search your library ...then put into hand" instead of onto battlefield?

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
[
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
));
}
}
]

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[
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
));
}
}
]
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
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[
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
));
}
}
]
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[
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
));
}
}
}
]
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[
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));
}
}
}
]
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[
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
));
}
}
]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

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
[
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));
}
});
}
}
]