name: Gagaga
card_text: "Utopia" and "Utopic" Xyz Monsters you control whose original Attribute is LIGHT cannot be destroyed by card effects, also your opponent cannot target them with card effects. You can only use each of the following effects of "Gagaga Utopic Tactics" once per turn. You can declare a Level from 1 to 12, then target 2 face-up monsters you control, including a "Gagaga" monster; they become that Level. If you Xyz Summon a "Utopia" or "Utopic" Xyz Monster whose original Attribute is LIGHT: You can target 1 card your opponent controls; destroy it.
external_ids: local SETCARD_ID_0 = 0x7f --Utopic
  
lua: local SETCARD_ID_0 = 0x7f --Utopic
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	c:RegisterEffect(e1)
  	--cannot be destroy
  	local e2 = Effect.CreateEffect(c)
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
  	e2:SetRange(LOCATION_SZONE)
  	e2:SetTargetRange(LOCATION_MZONE, 0)
  	e2:SetTarget(s.target)
  	e2:SetValue(1)
  	c:RegisterEffect(e2)
  	--cannot be target
  	local e3 = e2:Clone()
  	e3:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e3:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e3:SetValue(aux.tgoval)
  	c:RegisterEffect(e3)
  	--lv
  	local e4 = Effect.CreateEffect(c)
  	e4:SetDescription(aux.Stringid(id, 1))
  	e4:SetType(EFFECT_TYPE_IGNITION)
  	e4:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e4:SetRange(LOCATION_SZONE)
  	e4:SetCountLimit(1, id)
  	e4:SetTarget(s.lvtg)
  	e4:SetOperation(s.lvop)
  	c:RegisterEffect(e4)
  	--destroy
  	local e5 = Effect.CreateEffect(c)
  	e5:SetDescription(aux.Stringid(id, 2))
  	e5:SetCategory(CATEGORY_DESTROY)
  	e5:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e5:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e5:SetRange(LOCATION_SZONE)
  	e5:SetProperty(EFFECT_FLAG_CARD_TARGET + EFFECT_FLAG_DELAY)
  	e5:SetCountLimit(1, id + o)
  	e5:SetCondition(s.descon)
  	e5:SetTarget(s.destg)
  	e5:SetOperation(s.desop)
  	c:RegisterEffect(e5)
  end
  function s.target(e, c)
  	return c:GetOriginalAttribute() & ATTRIBUTE_LIGHT ~= 0 and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_XYZ)
  end
  function s.lvcfilter(c, e)
  	return c:IsFaceup() and c:IsLevelAbove(1) and c:IsCanBeEffectTarget(e)
  end
  function s.fselect(g, lv)
  	if lv and g:IsExists(Card.IsLevel, 1, nil, lv) then
  		return false
  	end
  	return g:IsExists(Card.IsSetCard, 1, nil, 0x54)
  end
  function s.lvtg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return false
  	end
  	local rg = Duel.GetMatchingGroup(s.lvcfilter, tp, LOCATION_MZONE, 0, nil, e)
  	if chk == 0 then
  		return rg:CheckSubGroup(s.fselect, 2, 2)
  	end
  	local lvt = {}
  	local pc = 1
  	for i = 1, 12 do
  		if rg:CheckSubGroup(s.fselect, 2, 2, i) then
  			lvt[i] = nil
  			lvt[pc] = i
  			pc = pc + 1
  		end
  	end
  	lvt[pc] = nil
  	Duel.Hint(HINT_SELECTMSG, tp, aux.Stringid(id, 3))
  	local lv = Duel.AnnounceNumber(tp, table.unpack(lvt))
  	e:SetLabel(lv)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	local sg = rg:SelectSubGroup(tp, s.fselect, false, 2, 2, lv)
  	Duel.SetTargetCard(sg)
  end
  function s.lvop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local g = Duel.GetChainInfo(0, CHAININFO_TARGET_CARDS)
  	local tg = g:Filter(Card.IsRelateToChain, nil):Filter(Card.IsFaceup, nil)
  	for tc in aux.Next(tg) do
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CHANGE_LEVEL)
  		e1:SetValue(e:GetLabel())
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		tc:RegisterEffect(e1)
  	end
  end
  function s.cfilter(c, tp)
  	return c:IsFaceup() and c:GetOriginalAttribute() & ATTRIBUTE_LIGHT ~= 0 and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_XYZ) and c:IsSummonPlayer(tp) and c:IsSummonType(SUMMON_TYPE_XYZ)
  end
  function s.descon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp)
  end
  function s.destg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsOnField() and chkc:IsControler(1 - tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(aux.TRUE, tp, 0, LOCATION_ONFIELD, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  	local g = Duel.SelectTarget(tp, aux.TRUE, tp, 0, LOCATION_ONFIELD, 1, 1, nil)
  	Duel.SetOperationInfo(0, CATEGORY_DESTROY, g, g:GetCount(), 0, 0)
  end
  function s.desop(e, tp, eg, ep, ev, re, r, rp)
  	local tc = Duel.GetFirstTarget()
  	if tc and tc:IsRelateToChain() then
  		Duel.Destroy(tc, REASON_EFFECT)
  	end
  end
  
  
source_text: Gagaga
  "Utopia" and "Utopic" Xyz Monsters you control whose original Attribute is LIGHT cannot be destroyed by card effects, also your opponent cannot target them with card effects. You can only use each of the following effects of "Gagaga Utopic Tactics" once per turn. You can declare a Level from 1 to 12, then target 2 face-up monsters you control, including a "Gagaga" monster; they become that Level. If you Xyz Summon a "Utopia" or "Utopic" Xyz Monster whose original Attribute is LIGHT: You can target 1 card your opponent controls; destroy it.
target_text: -- Gagaga
  local SETCARD_ID_0 = 0x7f --Utopic
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	c:RegisterEffect(e1)
  	--cannot be destroy
  	local e2 = Effect.CreateEffect(c)
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
  	e2:SetRange(LOCATION_SZONE)
  	e2:SetTargetRange(LOCATION_MZONE, 0)
  	e2:SetTarget(s.target)
  	e2:SetValue(1)
  	c:RegisterEffect(e2)
  	--cannot be target
  	local e3 = e2:Clone()
  	e3:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e3:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e3:SetValue(aux.tgoval)
  	c:RegisterEffect(e3)
  	--lv
  	local e4 = Effect.CreateEffect(c)
  	e4:SetDescription(aux.Stringid(id, 1))
  	e4:SetType(EFFECT_TYPE_IGNITION)
  	e4:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e4:SetRange(LOCATION_SZONE)
  	e4:SetCountLimit(1, id)
  	e4:SetTarget(s.lvtg)
  	e4:SetOperation(s.lvop)
  	c:RegisterEffect(e4)
  	--destroy
  	local e5 = Effect.CreateEffect(c)
  	e5:SetDescription(aux.Stringid(id, 2))
  	e5:SetCategory(CATEGORY_DESTROY)
  	e5:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e5:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e5:SetRange(LOCATION_SZONE)
  	e5:SetProperty(EFFECT_FLAG_CARD_TARGET + EFFECT_FLAG_DELAY)
  	e5:SetCountLimit(1, id + o)
  	e5:SetCondition(s.descon)
  	e5:SetTarget(s.destg)
  	e5:SetOperation(s.desop)
  	c:RegisterEffect(e5)
  end
  function s.target(e, c)
  	return c:GetOriginalAttribute() & ATTRIBUTE_LIGHT ~= 0 and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_XYZ)
  end
  function s.lvcfilter(c, e)
  	return c:IsFaceup() and c:IsLevelAbove(1) and c:IsCanBeEffectTarget(e)
  end
  function s.fselect(g, lv)
  	if lv and g:IsExists(Card.IsLevel, 1, nil, lv) then
  		return false
  	end
  	return g:IsExists(Card.IsSetCard, 1, nil, 0x54)
  end
  function s.lvtg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return false
  	end
  	local rg = Duel.GetMatchingGroup(s.lvcfilter, tp, LOCATION_MZONE, 0, nil, e)
  	if chk == 0 then
  		return rg:CheckSubGroup(s.fselect, 2, 2)
  	end
  	local lvt = {}
  	local pc = 1
  	for i = 1, 12 do
  		if rg:CheckSubGroup(s.fselect, 2, 2, i) then
  			lvt[i] = nil
  			lvt[pc] = i
  			pc = pc + 1
  		end
  	end
  	lvt[pc] = nil
  	Duel.Hint(HINT_SELECTMSG, tp, aux.Stringid(id, 3))
  	local lv = Duel.AnnounceNumber(tp, table.unpack(lvt))
  	e:SetLabel(lv)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TARGET)
  	local sg = rg:SelectSubGroup(tp, s.fselect, false, 2, 2, lv)
  	Duel.SetTargetCard(sg)
  end
  function s.lvop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local g = Duel.GetChainInfo(0, CHAININFO_TARGET_CARDS)
  	local tg = g:Filter(Card.IsRelateToChain, nil):Filter(Card.IsFaceup, nil)
  	for tc in aux.Next(tg) do
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CHANGE_LEVEL)
  		e1:SetValue(e:GetLabel())
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD)
  		tc:RegisterEffect(e1)
  	end
  end
  function s.cfilter(c, tp)
  	return c:IsFaceup() and c:GetOriginalAttribute() & ATTRIBUTE_LIGHT ~= 0 and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_XYZ) and c:IsSummonPlayer(tp) and c:IsSummonType(SUMMON_TYPE_XYZ)
  end
  function s.descon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp)
  end
  function s.destg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsOnField() and chkc:IsControler(1 - tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(aux.TRUE, tp, 0, LOCATION_ONFIELD, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  	local g = Duel.SelectTarget(tp, aux.TRUE, tp, 0, LOCATION_ONFIELD, 1, 1, nil)
  	Duel.SetOperationInfo(0, CATEGORY_DESTROY, g, g:GetCount(), 0, 0)
  end
  function s.desop(e, tp, eg, ep, ev, re, r, rp)
  	local tc = Duel.GetFirstTarget()
  	if tc and tc:IsRelateToChain() then
  		Duel.Destroy(tc, REASON_EFFECT)
  	end
  end
  
  