First, active_zone="ZONE_GRAVEYARD" is wrong: that means that the ability would trigger only when the card itself is in a graveyard, that's not what we want.
About how to code "one or more", it's the first time I have to deal with this kind of problem, so I would go by trial and error as much as you. Basically what should happen is that each effect should trigger this once, and then no more until another effect kicks in. I would suggest trying something along those lines:
- Code: Select all
<TRIGGERED_ABILITY linked_ability_group="1">
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever one or more creature cards are put into your graveyard from your library, put a 2/2 black Zombie creature token onto the battlefield.]]></LOCALISED_TEXT>
<TRIGGER value="ZONECHANGE_END" to_zone="ZONE_GRAVEYARD" from_zone="ZONE_LIBRARY">
if LinkedDC():Get_Int(0) == 0 and TriggerObject():GetOwner() == EffectController() and TriggerObject():GetCardType():Test(CARD_TYPE_CREATURE) then
LinkedDC():Set_Int(0, 1) -- disable this trigger
return true
end
return false
</TRIGGER>
<RESOLUTION_TIME_ACTION>
MTG():PutTokensOntoBattlefield( "TOKEN_ZOMBIE_2_2_B_...", 1, EffectController() )
</RESOLUTION_TIME_ACTION>
</TRIGGERED_ABILITY>
<TRIGGERED_ABILITY replacement_effect="1" linked_ability_group="1">
<TRIGGER value="STACK_PUSHED" />
<RESOLUTION_TIME_ACTION>
LinkedDC():Set_Int(0, 0) -- re-enable the other trigger
</RESOLUTION_TIME_ACTION>
</TRIGGERED_ABILITY>
Note: I have never used STACK_PUSHED before, so it's just an idea that probably won't work, and even if it worked as I imagine, it would probably fail when the milling effect is done through an internal (replacement_effect or replacement_query) trigger, such as dredge. I don't have any better ideas, though. At least it's a starting point.
EDIT: Another trigger that might be worth trying is STATE_BASED_EFFECTS... does anyone think that state-based are checked while multiple cards change zone at once?