name: Chain
card_text: If you control 2 or more face-up Xyz Monsters: Target the one with the lowest Rank (your choice, if tied); Special Summon 1 Xyz Monster from your Extra Deck, whose Rank is lower than that Xyz Monster, but the Special Summoned monster cannot attack directly, also return it to the Extra Deck during the End Phase.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.cfilter(c)
  	return c:IsFaceup() and c:IsType(TYPE_XYZ)
  end
  function s.filter(c, e, tp, rk)
  	return c:IsType(TYPE_XYZ) and c:GetRank() < rk and c:IsCanBeSpecialSummoned(e, 0, tp, false, false) and Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	local g = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_MZONE, 0, nil)
  	local rg, rk = g:GetMinGroup(Card.GetRank)
  	if chkc then
  		return rg:IsContains(chkc)
  	end
  	if chk == 0 then
  		return g:GetCount() >= 2 and rg:IsExists(Card.IsCanBeEffectTarget, 1, nil, e) and Duel.IsExistingMatchingCard(s.filter, tp, LOCATION_EXTRA, 0, 1, nil, e, tp, rk)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	local sg = rg:FilterSelect(tp, Card.IsCanBeEffectTarget, 1, 1, nil, e)
  	Duel.SetTargetCard(sg)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local tc = Duel.GetFirstTarget()
  	if not tc:IsRelateToEffect(e) or tc:IsFacedown() then
  		return
  	end
  	local rk = tc:GetRank()
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, s.filter, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp, rk)
  	local sc = g:GetFirst()
  	if sc and Duel.SpecialSummon(sc, 0, tp, tp, false, false, POS_FACEUP) ~= 0 then
  		local e1 = Effect.CreateEffect(e:GetHandler())
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CANNOT_DIRECT_ATTACK)
  		e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e1, true)
  		sc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD, 0, 1)
  		local e2 = Effect.CreateEffect(e:GetHandler())
  		e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS)
  		e2:SetCode(EVENT_PHASE + PHASE_END)
  		e2:SetCountLimit(1)
  		e2:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  		e2:SetLabelObject(sc)
  		e2:SetCondition(s.retcon)
  		e2:SetOperation(s.retop)
  		Duel.RegisterEffect(e2, tp)
  	end
  end
  function s.retcon(e, tp, eg, ep, ev, re, r, rp)
  	local tc = e:GetLabelObject()
  	if tc:GetFlagEffect(id) ~= 0 then
  		return true
  	else
  		e:Reset()
  		return false
  	end
  end
  function s.retop(e, tp, eg, ep, ev, re, r, rp)
  	local tc = e:GetLabelObject()
  	Duel.SendtoDeck(tc, nil, SEQ_DECKSHUFFLE, REASON_EFFECT)
  end
  
  
source_text: Chain
  If you control 2 or more face-up Xyz Monsters: Target the one with the lowest Rank (your choice, if tied); Special Summon 1 Xyz Monster from your Extra Deck, whose Rank is lower than that Xyz Monster, but the Special Summoned monster cannot attack directly, also return it to the Extra Deck during the End Phase.
target_text: -- Chain
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.cfilter(c)
  	return c:IsFaceup() and c:IsType(TYPE_XYZ)
  end
  function s.filter(c, e, tp, rk)
  	return c:IsType(TYPE_XYZ) and c:GetRank() < rk and c:IsCanBeSpecialSummoned(e, 0, tp, false, false) and Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	local g = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_MZONE, 0, nil)
  	local rg, rk = g:GetMinGroup(Card.GetRank)
  	if chkc then
  		return rg:IsContains(chkc)
  	end
  	if chk == 0 then
  		return g:GetCount() >= 2 and rg:IsExists(Card.IsCanBeEffectTarget, 1, nil, e) and Duel.IsExistingMatchingCard(s.filter, tp, LOCATION_EXTRA, 0, 1, nil, e, tp, rk)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	local sg = rg:FilterSelect(tp, Card.IsCanBeEffectTarget, 1, 1, nil, e)
  	Duel.SetTargetCard(sg)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local tc = Duel.GetFirstTarget()
  	if not tc:IsRelateToEffect(e) or tc:IsFacedown() then
  		return
  	end
  	local rk = tc:GetRank()
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, s.filter, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp, rk)
  	local sc = g:GetFirst()
  	if sc and Duel.SpecialSummon(sc, 0, tp, tp, false, false, POS_FACEUP) ~= 0 then
  		local e1 = Effect.CreateEffect(e:GetHandler())
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CANNOT_DIRECT_ATTACK)
  		e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e1, true)
  		sc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD, 0, 1)
  		local e2 = Effect.CreateEffect(e:GetHandler())
  		e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS)
  		e2:SetCode(EVENT_PHASE + PHASE_END)
  		e2:SetCountLimit(1)
  		e2:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  		e2:SetLabelObject(sc)
  		e2:SetCondition(s.retcon)
  		e2:SetOperation(s.retop)
  		Duel.RegisterEffect(e2, tp)
  	end
  end
  function s.retcon(e, tp, eg, ep, ev, re, r, rp)
  	local tc = e:GetLabelObject()
  	if tc:GetFlagEffect(id) ~= 0 then
  		return true
  	else
  		e:Reset()
  		return false
  	end
  end
  function s.retop(e, tp, eg, ep, ev, re, r, rp)
  	local tc = e:GetLabelObject()
  	Duel.SendtoDeck(tc, nil, SEQ_DECKSHUFFLE, REASON_EFFECT)
  end
  
  