name: Taotao
card_text: If this card battles a monster, neither can be destroyed by that battle. If you take battle or effect damage: You can Special Summon 1 Level 3 or higher Illusion monster from your hand or GY, or, if you took 2000 or more damage, you can Special Summon it from your Deck or Extra Deck instead. You can only use this effect of "Taotao the Chanter" once per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--ind
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_INDESTRUCTABLE_BATTLE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetTargetRange(LOCATION_MZONE, LOCATION_MZONE)
  	e1:SetTarget(s.indtg)
  	e1:SetValue(1)
  	c:RegisterEffect(e1)
  	--special summon
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 0))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetCode(EVENT_DAMAGE)
  	e2:SetProperty(EFFECT_FLAG_DAMAGE_STEP + EFFECT_FLAG_DAMAGE_CAL + EFFECT_FLAG_DELAY)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id)
  	e2:SetCondition(s.spcon)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.indtg(e, c)
  	local tc = e:GetHandler()
  	return c == tc or c == tc:GetBattleTarget()
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return ep == tp and bit.band(r, REASON_BATTLE + REASON_EFFECT) ~= 0
  end
  function s.spfilter(c, e, tp)
  	return c:IsLevelAbove(3)
  		and c:IsRace(RACE_ILLUSION)
  		and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  		and (not c:IsLocation(LOCATION_EXTRA) and Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 or c:IsLocation(LOCATION_EXTRA) and Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local loc = LOCATION_HAND + LOCATION_GRAVE
  	if ev >= 2000 then
  		loc = loc + LOCATION_DECK + LOCATION_EXTRA
  	end
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.spfilter, tp, loc, 0, 1, nil, e, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, loc)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local loc = LOCATION_HAND + LOCATION_GRAVE
  	if ev >= 2000 then
  		loc = loc + LOCATION_DECK + LOCATION_EXTRA
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, loc, 0, 1, 1, nil, e, tp)
  	if g:GetCount() > 0 then
  		Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  
source_text: Taotao
  If this card battles a monster, neither can be destroyed by that battle. If you take battle or effect damage: You can Special Summon 1 Level 3 or higher Illusion monster from your hand or GY, or, if you took 2000 or more damage, you can Special Summon it from your Deck or Extra Deck instead. You can only use this effect of "Taotao the Chanter" once per turn.
target_text: -- Taotao
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--ind
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_INDESTRUCTABLE_BATTLE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetTargetRange(LOCATION_MZONE, LOCATION_MZONE)
  	e1:SetTarget(s.indtg)
  	e1:SetValue(1)
  	c:RegisterEffect(e1)
  	--special summon
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 0))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetCode(EVENT_DAMAGE)
  	e2:SetProperty(EFFECT_FLAG_DAMAGE_STEP + EFFECT_FLAG_DAMAGE_CAL + EFFECT_FLAG_DELAY)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id)
  	e2:SetCondition(s.spcon)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.indtg(e, c)
  	local tc = e:GetHandler()
  	return c == tc or c == tc:GetBattleTarget()
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return ep == tp and bit.band(r, REASON_BATTLE + REASON_EFFECT) ~= 0
  end
  function s.spfilter(c, e, tp)
  	return c:IsLevelAbove(3)
  		and c:IsRace(RACE_ILLUSION)
  		and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  		and (not c:IsLocation(LOCATION_EXTRA) and Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 or c:IsLocation(LOCATION_EXTRA) and Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local loc = LOCATION_HAND + LOCATION_GRAVE
  	if ev >= 2000 then
  		loc = loc + LOCATION_DECK + LOCATION_EXTRA
  	end
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.spfilter, tp, loc, 0, 1, nil, e, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, loc)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local loc = LOCATION_HAND + LOCATION_GRAVE
  	if ev >= 2000 then
  		loc = loc + LOCATION_DECK + LOCATION_EXTRA
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, loc, 0, 1, 1, nil, e, tp)
  	if g:GetCount() > 0 then
  		Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  