name: Rank-Down-Magic
card_text: Target 1 "Utopia" monster you control; Special Summon from your Extra Deck, 1 "Utopia" monster with a lower Rank than that monster you control, by using it as the Xyz Material. (This Special Summon is treated as an Xyz Summon. Xyz Materials attached to it also become Xyz Materials on the Summoned monster.) The monster Xyz Summoned by this effect gains this effect.
  ● If this card attacks, or is attacked by, an opponent's monster, the opponent's monster's effects are negated during the Battle Phase only.
external_ids: local SETCARD_ID_0 = 0x107f --Utopia
  
lua: local SETCARD_ID_0 = 0x107f --Utopia
  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:SetCode(EVENT_FREE_CHAIN)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.filter1(c, e, tp)
  	local rk = c:GetRank()
  	return rk > 1
  		and c:IsFaceup()
  		and c:IsSetCard(SETCARD_ID_0)
  		and Duel.IsExistingMatchingCard(s.filter2, tp, LOCATION_EXTRA, 0, 1, nil, e, tp, c, rk)
  		and aux.MustMaterialCheck(c, tp, EFFECT_MUST_BE_XMATERIAL)
  end
  function s.filter2(c, e, tp, mc, rk)
  	return c:IsRankBelow(rk - 1)
  		and c:IsSetCard(SETCARD_ID_0)
  		and mc:IsCanBeXyzMaterial(c)
  		and c:IsCanBeSpecialSummoned(e, SUMMON_TYPE_XYZ, tp, false, false)
  		and Duel.GetLocationCountFromEx(tp, tp, mc, c) > 0
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsControler(tp) and chkc:IsLocation(LOCATION_MZONE) and s.filter1(chkc, e, tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.filter1, tp, LOCATION_MZONE, 0, 1, nil, e, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	Duel.SelectTarget(tp, s.filter1, tp, LOCATION_MZONE, 0, 1, 1, nil, e, tp)
  	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 aux.MustMaterialCheck(tc, tp, EFFECT_MUST_BE_XMATERIAL) then
  		return
  	end
  	if tc:IsFacedown() or not tc:IsRelateToEffect(e) or tc:IsControler(1 - tp) or tc:IsImmuneToEffect(e) then
  		return
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, s.filter2, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp, tc, tc:GetRank())
  	local sc = g:GetFirst()
  	if sc then
  		local mg = tc:GetOverlayGroup()
  		if mg:GetCount() ~= 0 then
  			Duel.Overlay(sc, mg)
  		end
  		sc:SetMaterial(Group.FromCards(tc))
  		Duel.Overlay(sc, Group.FromCards(tc))
  		Duel.SpecialSummon(sc, SUMMON_TYPE_XYZ, tp, tp, false, false, POS_FACEUP)
  		sc:CompleteProcedure()
  		--disable
  		local e1 = Effect.CreateEffect(e:GetHandler())
  		e1:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS)
  		e1:SetCode(EVENT_ATTACK_ANNOUNCE)
  		e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
  		e1:SetOperation(s.disop)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e1)
  		local e2 = e1:Clone()
  		e2:SetCode(EVENT_BE_BATTLE_TARGET)
  		sc:RegisterEffect(e2)
  		local e3 = Effect.CreateEffect(e:GetHandler())
  		e3:SetType(EFFECT_TYPE_FIELD)
  		e3:SetCode(EFFECT_DISABLE)
  		e3:SetRange(LOCATION_MZONE)
  		e3:SetTargetRange(0, LOCATION_MZONE)
  		e3:SetTarget(s.distg)
  		e3:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e3)
  		local e4 = e3:Clone()
  		e4:SetCode(EFFECT_DISABLE_EFFECT)
  		e4:SetValue(RESET_TURN_SET)
  		sc:RegisterEffect(e4)
  		sc:RegisterFlagEffect(0, RESET_EVENT + RESETS_STANDARD, EFFECT_FLAG_CLIENT_HINT, 1, 0, aux.Stringid(id, 0))
  	end
  end
  function s.disop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local bc = c:GetBattleTarget()
  	if bc then
  		bc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_BATTLE, 0, 1)
  		Duel.AdjustInstantly(e:GetHandler())
  	end
  end
  function s.distg(e, c)
  	return c:GetFlagEffect(id) ~= 0
  end
  
  
source_text: Rank-Down-Magic
  Target 1 "Utopia" monster you control; Special Summon from your Extra Deck, 1 "Utopia" monster with a lower Rank than that monster you control, by using it as the Xyz Material. (This Special Summon is treated as an Xyz Summon. Xyz Materials attached to it also become Xyz Materials on the Summoned monster.) The monster Xyz Summoned by this effect gains this effect.
  ● If this card attacks, or is attacked by, an opponent's monster, the opponent's monster's effects are negated during the Battle Phase only.
target_text: -- Rank-Down-Magic
  local SETCARD_ID_0 = 0x107f --Utopia
  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:SetCode(EVENT_FREE_CHAIN)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.filter1(c, e, tp)
  	local rk = c:GetRank()
  	return rk > 1
  		and c:IsFaceup()
  		and c:IsSetCard(SETCARD_ID_0)
  		and Duel.IsExistingMatchingCard(s.filter2, tp, LOCATION_EXTRA, 0, 1, nil, e, tp, c, rk)
  		and aux.MustMaterialCheck(c, tp, EFFECT_MUST_BE_XMATERIAL)
  end
  function s.filter2(c, e, tp, mc, rk)
  	return c:IsRankBelow(rk - 1)
  		and c:IsSetCard(SETCARD_ID_0)
  		and mc:IsCanBeXyzMaterial(c)
  		and c:IsCanBeSpecialSummoned(e, SUMMON_TYPE_XYZ, tp, false, false)
  		and Duel.GetLocationCountFromEx(tp, tp, mc, c) > 0
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsControler(tp) and chkc:IsLocation(LOCATION_MZONE) and s.filter1(chkc, e, tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.filter1, tp, LOCATION_MZONE, 0, 1, nil, e, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	Duel.SelectTarget(tp, s.filter1, tp, LOCATION_MZONE, 0, 1, 1, nil, e, tp)
  	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 aux.MustMaterialCheck(tc, tp, EFFECT_MUST_BE_XMATERIAL) then
  		return
  	end
  	if tc:IsFacedown() or not tc:IsRelateToEffect(e) or tc:IsControler(1 - tp) or tc:IsImmuneToEffect(e) then
  		return
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g = Duel.SelectMatchingCard(tp, s.filter2, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp, tc, tc:GetRank())
  	local sc = g:GetFirst()
  	if sc then
  		local mg = tc:GetOverlayGroup()
  		if mg:GetCount() ~= 0 then
  			Duel.Overlay(sc, mg)
  		end
  		sc:SetMaterial(Group.FromCards(tc))
  		Duel.Overlay(sc, Group.FromCards(tc))
  		Duel.SpecialSummon(sc, SUMMON_TYPE_XYZ, tp, tp, false, false, POS_FACEUP)
  		sc:CompleteProcedure()
  		--disable
  		local e1 = Effect.CreateEffect(e:GetHandler())
  		e1:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS)
  		e1:SetCode(EVENT_ATTACK_ANNOUNCE)
  		e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
  		e1:SetOperation(s.disop)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e1)
  		local e2 = e1:Clone()
  		e2:SetCode(EVENT_BE_BATTLE_TARGET)
  		sc:RegisterEffect(e2)
  		local e3 = Effect.CreateEffect(e:GetHandler())
  		e3:SetType(EFFECT_TYPE_FIELD)
  		e3:SetCode(EFFECT_DISABLE)
  		e3:SetRange(LOCATION_MZONE)
  		e3:SetTargetRange(0, LOCATION_MZONE)
  		e3:SetTarget(s.distg)
  		e3:SetReset(RESET_EVENT + RESETS_STANDARD)
  		sc:RegisterEffect(e3)
  		local e4 = e3:Clone()
  		e4:SetCode(EFFECT_DISABLE_EFFECT)
  		e4:SetValue(RESET_TURN_SET)
  		sc:RegisterEffect(e4)
  		sc:RegisterFlagEffect(0, RESET_EVENT + RESETS_STANDARD, EFFECT_FLAG_CLIENT_HINT, 1, 0, aux.Stringid(id, 0))
  	end
  end
  function s.disop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local bc = c:GetBattleTarget()
  	if bc then
  		bc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_BATTLE, 0, 1)
  		Duel.AdjustInstantly(e:GetHandler())
  	end
  end
  function s.distg(e, c)
  	return c:GetFlagEffect(id) ~= 0
  end
  
  