Page 2 of 5

Re: 4 Return to Ravnica cards

PostPosted: 14 Sep 2012, 08:47
by GeoffW
thefiremind wrote:If there's a creature on the battlefield and another copy of the same card in a graveyard, I think you have no way to distinguish them if you want to select only the one on the battlefield or only the one in the graveyard.
That sounds like a bug that needs to be fixed.

Re: 4 Return to Ravnica cards

PostPosted: 14 Sep 2012, 08:49
by thefiremind
GeoffW wrote:That sounds like a bug that needs to be fixed.
No, that sounds like an idea... Angel of Serenity hasn't been coded yet. :lol:

Re: 4 Return to Ravnica cards

PostPosted: 14 Sep 2012, 19:41
by BlindWillow
thefiremind wrote:If there's a creature on the battlefield and another copy of the same card in a graveyard, I think you have no way to distinguish them if you want to select only the one on the battlefield or only the one in the graveyard.
Then one could build two separate datachests with distinguishing text prompts, check to see how many targets have been chosen from the first (probably begin with on the battlefield) and if fewer than three have been chosen, continue to the second datachest.

Re: 61 Return to Ravnica cards

PostPosted: 19 Sep 2012, 18:18
by SoulStorm
Sumomole, you made my day! 61 RTR cards, someone has been busy. Angel of Serenity looked like a pain to code. Thanks for all the hard work!

Re: 61 Return to Ravnica cards

PostPosted: 20 Sep 2012, 08:34
by thefiremind
Nice idea making the card frames with the watermarks. It's a pity that there's no way to decide which cards should use them and which shouldn't: either you make them override the default ones, or you don't use them at all.

Re: 61 Return to Ravnica cards

PostPosted: 30 Sep 2012, 22:05
by PhilistineAu
Great work!

I'd like to have a go at making Staff of Nin but am not sure where to start. I'm looking at the XML files for Howling Mine and Jayemdae Tome - is that where you would start?

Should I be reading the LUA reference manual? I found the DOTP 2012 functions decoded thread - is that another place to start?

I know it would be a pain, but any chance you can provide some basic instructions on how to make cards? Things like what MULTIVERSEID and ARTID value to use?

Re: 61 Return to Ravnica cards

PostPosted: 30 Sep 2012, 23:55
by Dysgenics
Check out the card generator utility here: viewtopic.php?f=99&t=7692

It does most of the grunt work for you, and lets you just fill in the functionality.

For Staff of Nin, I think this should do the trick, but haven't tested:

Code: Select all
<?xml version='1.0'?>
<CARD_V2>
   <FILENAME text="STAFF_OF_NIN_249713" />
   <CARDNAME text="STAFF_OF_NIN" />
   <TITLE>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Staff of Nin]]></LOCALISED_TEXT>
   </TITLE>
   <MULTIVERSEID value="249713" />
   <ARTID value="249713" />
   <ARTIST name="Dan Scott" />
   <CASTING_COST cost="{6}" />
   <FLAVOURTEXT>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[“I have attuned the staff to your screams so that only I may benefit from your pain.”
—Volux, disciple of Nin]]></LOCALISED_TEXT>
   </FLAVOURTEXT>
   <TYPE metaname="Artifact" />
   <EXPANSION value="DPG" />
   <RARITY metaname="R" />
   <TRIGGERED_ABILITY auto_skip="1" filter_zone="ZONE_IN_PLAY">
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[At the beginning of your upkeep, draw a card.]]></LOCALISED_TEXT>
      <TRIGGER value="BEGINNING_OF_STEP" simple_qualifier="controller">
         return (EffectController():MyTurn() ~= 0) and (MTG():GetStep() == STEP_UPKEEP)
      </TRIGGER>
      <RESOLUTION_TIME_ACTION>
         EffectController():DrawCard()
      </RESOLUTION_TIME_ACTION>
   </TRIGGERED_ABILITY>
   <ACTIVATED_ABILITY filter_zone="ZONE_IN_PLAY">
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[{T}: Staff of Nin deals 1 damage to target creature or player.]]></LOCALISED_TEXT>
      <COST type="TapSelf" />
      <TARGET_DEFINITION id="0">
         local filter = Object():GetFilter()
         filter:Clear()
         filter:SetFilterType(FILTER_TYPE_CARDS + FILTER_TYPE_PLAYERS)
         filter:SetZone(ZONE_IN_PLAY)
         filter:SetHint(HINT_ENEMY_ONLY, EffectController())
         filter:AddCardType(CARD_TYPE_CREATURE)
      </TARGET_DEFINITION>
      <TARGET_DETERMINATION>
         return AtLeastOneTargetFromDefinition(0)
      </TARGET_DETERMINATION>
      <PLAY_TIME_ACTION target_choosing="1">
         EffectController():ChooseTarget(0, "CARD_QUERY_CHOOSE_DEAL_1_DAMAGE", EffectDC():Make_Targets(0))
      </PLAY_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         local target_creature = EffectDC():Get_Targets(0):Get_CardPtr(0)
         local target_player = EffectDC():Get_Targets(0):Get_PlayerPtr(0)
         if (target_creature ~= nil) then
            target_creature:DealDamage(1, Object())
         elseif (target_player ~= nil) then
            target_player:DealDamage(1, Object())
         end
      </RESOLUTION_TIME_ACTION>
      <AI_AVAILABILITY step="declare_blockers" />
      <AI_AVAILABILITY step="end_of_turn" turn="their_turn" />
      <AI_AVAILABILITY type="in_response_dangerous" />
   </ACTIVATED_ABILITY>
</CARD_V2>

Re: 61 Return to Ravnica cards

PostPosted: 06 Oct 2012, 14:28
by BlindWillow
I have to say, awesome work with Angel of Serenity. I would not have thought to use target definitions and determinations so creatively.

I notice Aleksi has the full artwork up for her. I've attached my formatted crop for your usage, if you so desire.

Re: 61 Return to Ravnica cards

PostPosted: 07 Oct 2012, 16:03
by PhilistineAu
Thanks!!! I'll give that a shot sometime this week and see if I can get it to work.

How is the numbering system defined? For example, the Staff of Nin text you posted has the file name "Staff of Nin 249713". Is 249713 randomly generated or is it tied to a set number in some way?

Thanks,

Phil

Re: 61 Return to Ravnica cards

PostPosted: 07 Oct 2012, 17:33
by RiiakShiNal
PhilistineAu wrote:How is the numbering system defined? For example, the Staff of Nin text you posted has the file name "Staff of Nin 249713". Is 249713 randomly generated or is it tied to a set number in some way?
249713 is the Multiverse ID of the card (as defined by Wizards of the Coast and accessible via Gatherer).

As to how to get the Multiverse ID, look up the card on Gatherer and look at the address (below is the address for Staff of Nin):
http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=249713
At the end of the address you see "multiverseid=249713" this is where we get the Multiverse IDs from.

Re: 61 Return to Ravnica cards

PostPosted: 13 Oct 2012, 16:50
by AlexSanchez
It is possible to have this cards in game? my return to ravnica cards are not like this ones...I suppose we have to replace the tdx of the old ones with this new ones isnt it? however, I dont know how to do it

Re: 61 Return to Ravnica cards

PostPosted: 13 Oct 2012, 20:54
by RiiakShiNal
AlexSanchez wrote:It is possible to have this cards in game? my return to ravnica cards are not like this ones...I suppose we have to replace the tdx of the old ones with this new ones isnt it? however, I dont know how to do it
If Staff of Nin is also in Return to Ravnica, then it will eventually be given its own Multiverse ID and place on Gatherer. A card that is re-printed in many sets will have many Multiverse IDs each one referring to the specific set.

If you want to make a card from a set with which we do not know the Multiverse IDs, you can simply make the card without a Multiverse ID. If you want to have an ID with it you can make one up following some rule you make (though I generally advise against random numbers). For example you could make the ID (for filename, art id, etc...) RTR0045 if it is the 45th card alphabetically in the Return to Ravnica set which would be a fairly unique identifier that would be relatively easy to keep up with.

Re: 61 Return to Ravnica cards

PostPosted: 01 Nov 2012, 12:28
by thefiremind
I'm starting to look at possible decks with RTR cards, now that I can have access to any picture thanks to the HQCG team.

Did anyone test the AI's reaction to the unleash mechanic? I made just a quick test duel, and the AI always chose to add the +1/+1 counter. Maybe it was a coincidence.
EDIT: I answer by myself: the AI chooses to add the +1/+1 counter really often, but it can also choose not to add it, so the mechanic works perfectly.

A warning about one of the cards coded by sumomole: Wild Beastmaster contains the "Mutilate bug"... what I mean is that if Wild Beastmaster changes his power after his ability resolved, the other creatures will be updated in real time, which is wrong. This is the correct code:
Code: Select all
  <TRIGGERED_ABILITY LKI_shield_effect_source="1" filter_zone="ZONE_IN_PLAY">
    <TRIGGER value="ATTACKING" simple_qualifier="self" />
    <FILTER>
    return OtherCreaturesInPlayYouControl()
    </FILTER>
    <RESOLUTION_TIME_ACTION ignore_filter="1">
    local source = EffectSource()
    if source == nil then
       source = Object()
    end
    EffectDC():Set_Int( 1, source:GetCurrentPower() )
    </RESOLUTION_TIME_ACTION>
    <CONTINUOUS_ACTION layer="7C">
    if EffectDC() ~= nil and FilteredCard() ~= nil then
       local characteristics = FilteredCard():GetCurrentCharacteristics()
       local power = EffectDC():Get_Int(1)
       if characteristics ~= nil then
          characteristics:Power_Add( power )
          characteristics:Toughness_Add( power )
       end
    end
    </CONTINUOUS_ACTION>
    <DURATION simple_duration="UntilEOT" />
  </TRIGGERED_ABILITY>
------------

EDIT 2: I just invented a super-performant TARGET_DETERMINATION for Jarad, Golgari Lich Lord's "return" ability (Sacrifice a Swamp and a Forest: Return Jarad from your graveyard to your hand). It's totally without "for" iterations. Unbelievable? :wink:
Code: Select all
      <TARGET_DETERMINATION>
      local filter = Object():GetFilter()
      filter:Clear()
      filter:AddSubType( LAND_TYPE_SWAMP )
      filter:SetController( EffectController() )
      filter:SetZone( ZONE_IN_PLAY )
      filter:NotTargetted()
      local filter_s = filter:EvaluateObjects()
      if filter_s &gt; 0 then
         local swamp = filter:GetNthEvaluatedObject(0)
         filter:Clear()
         filter:AddSubType( LAND_TYPE_FOREST )
         filter:SetController( EffectController() )
         filter:SetZone( ZONE_IN_PLAY )
         filter:NotTargetted()
         local filter_f = filter:EvaluateObjects()
         if filter_f &gt; 0 then
            if (filter_f &gt; 1 and filter_s &gt; 1) or (filter_f ~= filter_s) or (filter:GetNthEvaluatedObject(0) ~= swamp) then
               -- A. more than 1 forest and more than 1 swamp: I'm sure I have enough
               -- B. different quantities of swamps and forests: that means at least 1 forest isn't a swamp or vice versa, so I have enough
               -- C. only scenario still uncovered: exactly 1 swamp and exactly 1 forest: if they are different cards, I have enough
               return 1
            end
         end
      end
      return 0
      </TARGET_DETERMINATION>
Read the comments in the code and you'll notice that I covered all the possible scenarios without having to iterate through all the Swamps and/or through all the Forests. I enjoyed the challenge of inventing this code. :lol:

Slaughter Games

PostPosted: 29 Nov 2012, 03:07
by sumomole
Slaughter Games.png

Re: 77 Return to Ravnica cards

PostPosted: 30 Nov 2012, 00:13
by kpruss
If you guys still needed a code for angel of serenity, (sorry, just skimmed over the topic) here's one I found and have been using for the past month (credit to whoever made it)

Code: Select all
<?xml version='1.0'?>
<CARD_V2>
  <FILENAME text="ANGEL_OF_SERENITY_38253627" />
  <CARDNAME text="ANGEL_OF_SERENITY" />
  <TITLE>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Angel of Serenity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Engel der Reinheit]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Angel of Serenity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Ange de la sérénité]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Angelo della Serenità]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[静穏の天使]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[평온의 천사]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Ангел Безмятежности]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Anjo da Serenidade]]></LOCALISED_TEXT>
  </TITLE>
  <MULTIVERSEID value="38253627" />
  <ARTID value="38253627" />
  <ARTIST name="Aleksi Briclot" />
  <CASTING_COST cost="{4}{W}{W}{W}" />
  <TYPE metaname="Creature" />
  <SUB_TYPE metaname="Angel" />
  <EXPANSION value="DPG" />
  <RARITY metaname="M" />
  <POWER value="5" />
  <TOUGHNESS value="6" />
  <STATIC_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Flying]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Vol]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Vuela.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Fliegend]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Volare]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[飛行]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[비행]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Полет]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Voar]]></LOCALISED_TEXT>
    <CONTINUOUS_ACTION>
    local characteristics = Object():GetCurrentCharacteristics()
    characteristics:Characteristic_Set( CHARACTERISTIC_FLYING, 1 )
    </CONTINUOUS_ACTION>
  </STATIC_ABILITY>
  <TRIGGERED_ABILITY dangerous="1" filter_zone="ZONE_IN_PLAY">
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[When Angel of Serenity enters the battlefield, you may exile up to three other target creatures from the battlefield and/or creature cards from graveyards.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Quand l’Ange de la sérénité arrive sur le champ de bataille, vous pouvez exiler jusqu’à trois autres créatures ciblées du champ de bataille et/ou cartes de créature des cimetières.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Cuando el Ángel de serenidad entre al campo de batalla, puedes exiliar hasta tres otras criaturas del campo de batalla y/o cartas de criatura objetivo de cementerios.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Wenn der Engel der Reinheit ins Spiel kommt, kannst du bis zu drei andere Kreaturen deiner Wahl aus dem Spiel und/oder Kreaturenkarten deiner Wahl aus Friedhöfen ins Exil schicken.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Quando l’Angelo della Serenità entra nel campo di battaglia, puoi esiliare fino a tre altre creature bersaglio dal campo di battaglia e/o carte creatura dai cimiteri.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[静穏の天使が戦場に出たとき、あなたは戦場にある他のクリーチャーかいずれかの墓地にあるクリーチャー・カード、あるいはその両方から最大3つまでを対象とし、それらを追放してもよい。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[평온의 천사가 전장에 들어올 때, 전장에 있는 다른 생물과 무덤에 있는 생물 카드 중에서 목표를 최대 세 개까지 정한다. 당신은 그 목표들을 추방할 수 있다.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Когда Ангел Безмятежности выходит на поле битвы, вы можете изгнать до трех других целевых существ с поля битвы и (или) карт существ из кладбищ.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Quando Anjo da Serenidade entra no campo de batalha, você pode exilar até três outras criaturas alvo do campo de batalha e/ou cards de criatura de cemitérios.]]></LOCALISED_TEXT>
    <TRIGGER value="ZONECHANGE_END" simple_qualifier="self" to_zone="ZONE_IN_PLAY" />
    <TARGET_DEFINITION id="0">
    local filter = Object():GetFilter()
    filter:Clear()
    filter:May()
    filter:AddCardType( CARD_TYPE_CREATURE )
    filter:SetZone( ZONE_IN_PLAY )
    filter:SetHint( HINT_ENEMY, EffectController() )
    filter:SetCardInstance( Object() )
    filter:AddExtra( FILTER_EXTRA_FLIP_CARD_INSTANCE )
    if EffectController():IsAI() ~= 0 then
       filter:SetCardRef( Object():GetSpec() )
       filter:AddExtra(FILTER_EXTRA_FLIP_CARD_REF)
    end
    </TARGET_DEFINITION>
    <TARGET_DEFINITION id="1">
    local filter = Object():GetFilter()
    filter:Clear()
    filter:May()
    filter:AddCardType( CARD_TYPE_CREATURE )
    filter:SetZone( ZONE_GRAVEYARD )
    filter:SetHint( HINT_ENEMY, EffectController() )
    </TARGET_DEFINITION>
    <TARGET_DEFINITION id="2">
    local filter = Object():GetFilter()
    filter:Clear()
    filter:May()
    filter:AddCardType( CARD_TYPE_CREATURE )
    filter:SetZone( ZONE_GRAVEYARD )
    filter:SetHint( HINT_ENEMY, EffectController() )
    if EffectDC() ~= nil and EffectDC():Get_Targets(1) ~= nil then
      local target_one = EffectDC():Get_Targets(1):Get_CardPtr(0)
      if target_one ~= nil then
         filter:SetCardInstance( target_one )
         filter:AddExtra( FILTER_EXTRA_FLIP_CARD_INSTANCE )
      end
    end
    </TARGET_DEFINITION>
    <TARGET_DEFINITION id="3">
    local filter = Object():GetFilter()
    filter:Clear()
    filter:May()
    filter:AddCardType( CARD_TYPE_CREATURE )
    filter:SetZone( ZONE_GRAVEYARD )
    filter:SetHint( HINT_ENEMY, EffectController() )
    if EffectDC() ~= nil and EffectDC():Get_Targets(1) ~= nil then
      local target_one = EffectDC():Get_Targets(1):Get_CardPtr(0)
      if target_one ~= nil then
         filter:SetCardInstance( target_one )
         filter:AddExtra( FILTER_EXTRA_FLIP_CARD_INSTANCE )
      end
    end
    if EffectDC() ~= nil and EffectDC():Get_Targets(2) ~= nil then
      local target_two = EffectDC():Get_Targets(2):Get_CardPtr(0)
      if target_two ~= nil then
         filter:SetSecondCardInstance( target_two )
         filter:AddExtra( FILTER_EXTRA_FLIP_CARD_INSTANCE )
      end
    end
    </TARGET_DEFINITION>
    <TARGET_DETERMINATION>
    return AtLeastOneTargetFromDefinition(0) + AtLeastOneTargetFromDefinition(1)
    </TARGET_DETERMINATION>
    <PLAY_TIME_ACTION target_choosing="1">
    local filter = Object():LoadTargetDefinition(0)
    local total = filter:CountStopAt(3)
    local player = EffectController()
    player:SetTargetCount( total )
    for i=0,total-1 do
       player:SetTargetPrompt( i, "CARD_QUERY_CHOOSE_CREATURE_TO_EXILE" )
    end
    player:ChooseTargetsWithFlags( 0, EffectDC():Make_Targets(0), QUERY_FLAG_CAN_BE_FINISHED_EARLY + QUERY_FLAG_CAN_BE_FINISHED_EARLY_FOR_AI_AS_WELL )
    </PLAY_TIME_ACTION>
    <PLAY_TIME_ACTION>
    if EffectDC():Get_Targets(0) ~= nil then
      for i=0,2 do
        local target = EffectDC():Get_Targets(0):Get_CardPtr(i)
        if target ~= nil then        
           EffectDC():Int_Inc(4)
        end
      end
    end
    </PLAY_TIME_ACTION>
    <PLAY_TIME_ACTION target_choosing="1">
    if EffectDC():Get_Int(4) &lt; 3 then
      EffectController():ChooseTargetWithFlags( 1, "CARD_QUERY_CHOOSE_CARD_TO_EXILE", EffectDC():Make_Targets(1), QUERY_FLAG_CAN_BE_FINISHED_EARLY + QUERY_FLAG_CAN_BE_FINISHED_EARLY_FOR_AI_AS_WELL )
    end
    </PLAY_TIME_ACTION>
    <PLAY_TIME_ACTION target_choosing="1">
    if EffectDC():Get_Int(4) &lt; 2 then
      EffectController():ChooseTargetWithFlags( 2, "CARD_QUERY_CHOOSE_CARD_TO_EXILE", EffectDC():Make_Targets(2), QUERY_FLAG_CAN_BE_FINISHED_EARLY + QUERY_FLAG_CAN_BE_FINISHED_EARLY_FOR_AI_AS_WELL )
    end
    </PLAY_TIME_ACTION>
    <PLAY_TIME_ACTION target_choosing="1">
    if EffectDC():Get_Int(4) == 0 then
      EffectController():ChooseTargetWithFlags( 3, "CARD_QUERY_CHOOSE_CARD_TO_EXILE", EffectDC():Make_Targets(3), QUERY_FLAG_CAN_BE_FINISHED_EARLY + QUERY_FLAG_CAN_BE_FINISHED_EARLY_FOR_AI_AS_WELL )
    end
    </PLAY_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    ObjectDC():Set_Int( 0, 0 )
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local source = EffectSource()
    if EffectDC():Get_Targets(0) ~= nil then
      for i = 0,2 do
         local target = EffectDC():Get_Targets(0):Get_CardPtr(i)
         if target ~= nil then
           if source ~= nil then
              local count_so_far = ObjectDC():Get_Int(0)          
              ObjectDC():Set_CardPtr(1 + count_so_far, target)
              ObjectDC():Protect_CardPtr(1 + count_so_far)          
              ObjectDC():Set_Int(0, count_so_far + 1)
           end
          target:RemoveFromGame()
         end
       end
    end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local source = EffectSource()
    for i = 1,3 do
      if EffectDC():Get_Targets(i) ~= nil then
         local target = EffectDC():Get_Targets(i):Get_CardPtr(0)
         if target ~= nil then
           if source ~= nil then
              local count_so_far = ObjectDC():Get_Int(0)          
              ObjectDC():Set_CardPtr(1 + count_so_far, target)
              ObjectDC():Protect_CardPtr(1 + count_so_far)          
              ObjectDC():Set_Int(0, count_so_far + 1)
           end
          target:RemoveFromGame()
         end
       end
    end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local source = EffectSource()
    local amount = ObjectDC():Get_Int(0)
    if amount &gt; 0 then
       for i = 1,amount do
        local target = ObjectDC():Get_CardPtr(i)
          if target ~= nil and source ~= nil then
           target:NailOnto(source)
          end
       end
    end
    </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[When Angel of Serenity leaves the battlefield, return the exiled cards to their owner’s hands.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Quand l’Ange de la sérénité quitte le champ de bataille, renvoyez les cartes exilées dans les mains de leurs propriétaires.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Cuando el Ángel de serenidad deje el campo de batalla, regresa las cartas exiliadas a las manos de sus propietarios.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Wenn der Engel der Reinheit das Spiel verlässt, bringe die ins Exil geschickten Karten auf die Hand ihrer Besitzer zurück.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Quando l’Angelo della Serenità lascia il campo di battaglia, fai tornare le carte esiliate in mano ai rispettivi proprietari.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[静穏の天使が戦場を離れたとき、その追放されたカードをオーナーの手札に戻す。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[평온의 천사가 전장을 떠날 때, 추방된 카드들을 각각 소유자의 손으로 되돌린다.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Когда Ангел Безмятежности покидает поле битвы, верните изгнанные карты в руки их владельцев.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Quando Anjo da Serenidade deixar o campo de batalha, devolva os cards exilados para as mãos de seus donos.]]></LOCALISED_TEXT>
    <TRIGGER value="ZONECHANGE_BEGIN" simple_qualifier="self" to_zone="ZONE_ANY" from_zone="ZONE_IN_PLAY" />
    <RESOLUTION_TIME_ACTION>
    local target_count = ObjectDC():Get_Int(0)
    for i=1,target_count do   
       local card = ObjectDC():Get_CardPtr(i)
       if card ~= nil then
         card:GuidedReveal( ZONE_REMOVED_FROM_GAME, ZONE_HAND )
         card:PutInHand()
       end
    end
    </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
  <HELP title="MORE_INFO_BADGE_TITLE_10" body="MORE_INFO_BADGE_BODY_10" zone="ZONE_ANY" />
  <SFX text="COMBAT_ANGEL_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
  <SFX text="COMBAT_ANGEL_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
  <AI_BASE_SCORE score="900" zone="ZONE_IN_PLAY" />
  <AI_BASE_SCORE score="1200" zone="ZONE_HAND" />
</CARD_V2>
it works perfectly imo. When it enters the battlefield, it lets you choose if you want to exile a creature from the field, then it asks you to exile cards in your opponent's graveyard, then yours. And when it dies or w/e, the cards go into the hands with that reveal card animation so it looks correct. This card is just ridiculous btw, man some cards can just be evil.