name: Magicolloidal
card_text: If a monster(s) is Special Summoned by your Trap effect (except during the Damage Step): You can Special Summon this card from your hand or GY, but if you Summon it from the GY, banish it when it leaves the field. During your opponent's Battle Phase (Quick Effect): You can activate 1 of these effects;
  ● Immediately after this effect resolves, Synchro Summon using this card you control.
  ● Immediately after this effect resolves, Xyz Summon using this card you control.
  You can only use each effect of "Magicolloidal Sol" once per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--special Summon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e1:SetProperty(EFFECT_FLAG_DELAY)
  	e1:SetRange(LOCATION_HAND + LOCATION_GRAVE)
  	e1:SetCountLimit(1, id)
  	e1:SetCondition(s.spcon)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  	--synchro&xyz effect
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_QUICK_O)
  	e2:SetCode(EVENT_FREE_CHAIN)
  	e2:SetHintTiming(0, TIMINGS_CHECK_MONSTER + TIMING_BATTLE_START + TIMING_BATTLE_END)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(s.sccon)
  	e2:SetTarget(s.sctarg)
  	e2:SetOperation(s.scop)
  	c:RegisterEffect(e2)
  end
  function s.cfilter(c, tp)
  	local typ, se, sp = c:GetSpecialSummonInfo(SUMMON_INFO_TYPE, SUMMON_INFO_REASON_EFFECT, SUMMON_INFO_REASON_PLAYER)
  	return se and typ & TYPE_TRAP ~= 0 and se:IsActivated() and sp == tp
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) and aux.NecroValleyFilter()(c) and Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP) > 0 and c:IsSummonLocation(LOCATION_GRAVE) then
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
  		e1:SetCode(EFFECT_LEAVE_FIELD_REDIRECT)
  		e1:SetValue(LOCATION_REMOVED)
  		e1:SetReset(RESET_EVENT + RESETS_REDIRECT)
  		c:RegisterEffect(e1, true)
  	end
  end
  function s.sccon(e, tp, eg, ep, ev, re, r, rp)
  	if Duel.GetTurnPlayer() == tp then
  		return false
  	end
  	local ph = Duel.GetCurrentPhase()
  	return ph >= PHASE_BATTLE_START and ph <= PHASE_BATTLE
  end
  function s.exgfilter(c, mg, mc)
  	return mg:CheckSubGroup(s.exgselect, 1, #mg, c, mc)
  end
  function s.exgselect(g, exc, mc)
  	return g:IsContains(mc) and exc:IsXyzSummonable(g, #g, #g)
  end
  function s.sctarg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	local mg = Duel.GetMatchingGroup(Card.IsFaceup, tp, LOCATION_MZONE, 0, nil)
  	local exg = Duel.GetMatchingGroup(s.exgfilter, tp, LOCATION_EXTRA, 0, nil, mg, c)
  	local b1 = Duel.IsExistingMatchingCard(Card.IsSynchroSummonable, tp, LOCATION_EXTRA, 0, 1, nil, c)
  	local b2 = #exg > 0
  	if chk == 0 then
  		return b1 or b2
  	end
  	local op = 0
  	if b1 and b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2), aux.Stringid(id, 3))
  	elseif b1 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2))
  	else
  		op = Duel.SelectOption(tp, aux.Stringid(id, 3)) + 1
  	end
  	e:SetLabel(op)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA)
  end
  function s.scop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsControler(1 - tp) or not c:IsRelateToEffect(e) or c:IsFacedown() then
  		return
  	end
  	if e:GetLabel() == 0 then
  		local g = Duel.GetMatchingGroup(Card.IsSynchroSummonable, tp, LOCATION_EXTRA, 0, nil, c)
  		if g:GetCount() > 0 then
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  			local sg = g:Select(tp, 1, 1, nil)
  			Duel.SynchroSummon(tp, sg:GetFirst(), c)
  		end
  	else
  		local mg = Duel.GetMatchingGroup(Card.IsFaceup, tp, LOCATION_MZONE, 0, nil)
  		local exg = Duel.GetMatchingGroup(s.exgfilter, tp, LOCATION_EXTRA, 0, nil, mg, c)
  		if exg:GetCount() > 0 then
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  			local sc = exg:Select(tp, 1, 1, nil):GetFirst()
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_XMATERIAL)
  			local msg = mg:SelectSubGroup(tp, s.exgselect, false, 1, #mg, sc, c)
  			Duel.XyzSummon(tp, sc, msg, #msg, #msg)
  		end
  	end
  end
  
  
source_text: Magicolloidal
  If a monster(s) is Special Summoned by your Trap effect (except during the Damage Step): You can Special Summon this card from your hand or GY, but if you Summon it from the GY, banish it when it leaves the field. During your opponent's Battle Phase (Quick Effect): You can activate 1 of these effects;
  ● Immediately after this effect resolves, Synchro Summon using this card you control.
  ● Immediately after this effect resolves, Xyz Summon using this card you control.
  You can only use each effect of "Magicolloidal Sol" once per turn.
target_text: -- Magicolloidal
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--special Summon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e1:SetProperty(EFFECT_FLAG_DELAY)
  	e1:SetRange(LOCATION_HAND + LOCATION_GRAVE)
  	e1:SetCountLimit(1, id)
  	e1:SetCondition(s.spcon)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  	--synchro&xyz effect
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_QUICK_O)
  	e2:SetCode(EVENT_FREE_CHAIN)
  	e2:SetHintTiming(0, TIMINGS_CHECK_MONSTER + TIMING_BATTLE_START + TIMING_BATTLE_END)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(s.sccon)
  	e2:SetTarget(s.sctarg)
  	e2:SetOperation(s.scop)
  	c:RegisterEffect(e2)
  end
  function s.cfilter(c, tp)
  	local typ, se, sp = c:GetSpecialSummonInfo(SUMMON_INFO_TYPE, SUMMON_INFO_REASON_EFFECT, SUMMON_INFO_REASON_PLAYER)
  	return se and typ & TYPE_TRAP ~= 0 and se:IsActivated() and sp == tp
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) and aux.NecroValleyFilter()(c) and Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP) > 0 and c:IsSummonLocation(LOCATION_GRAVE) then
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
  		e1:SetCode(EFFECT_LEAVE_FIELD_REDIRECT)
  		e1:SetValue(LOCATION_REMOVED)
  		e1:SetReset(RESET_EVENT + RESETS_REDIRECT)
  		c:RegisterEffect(e1, true)
  	end
  end
  function s.sccon(e, tp, eg, ep, ev, re, r, rp)
  	if Duel.GetTurnPlayer() == tp then
  		return false
  	end
  	local ph = Duel.GetCurrentPhase()
  	return ph >= PHASE_BATTLE_START and ph <= PHASE_BATTLE
  end
  function s.exgfilter(c, mg, mc)
  	return mg:CheckSubGroup(s.exgselect, 1, #mg, c, mc)
  end
  function s.exgselect(g, exc, mc)
  	return g:IsContains(mc) and exc:IsXyzSummonable(g, #g, #g)
  end
  function s.sctarg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	local mg = Duel.GetMatchingGroup(Card.IsFaceup, tp, LOCATION_MZONE, 0, nil)
  	local exg = Duel.GetMatchingGroup(s.exgfilter, tp, LOCATION_EXTRA, 0, nil, mg, c)
  	local b1 = Duel.IsExistingMatchingCard(Card.IsSynchroSummonable, tp, LOCATION_EXTRA, 0, 1, nil, c)
  	local b2 = #exg > 0
  	if chk == 0 then
  		return b1 or b2
  	end
  	local op = 0
  	if b1 and b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2), aux.Stringid(id, 3))
  	elseif b1 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2))
  	else
  		op = Duel.SelectOption(tp, aux.Stringid(id, 3)) + 1
  	end
  	e:SetLabel(op)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA)
  end
  function s.scop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsControler(1 - tp) or not c:IsRelateToEffect(e) or c:IsFacedown() then
  		return
  	end
  	if e:GetLabel() == 0 then
  		local g = Duel.GetMatchingGroup(Card.IsSynchroSummonable, tp, LOCATION_EXTRA, 0, nil, c)
  		if g:GetCount() > 0 then
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  			local sg = g:Select(tp, 1, 1, nil)
  			Duel.SynchroSummon(tp, sg:GetFirst(), c)
  		end
  	else
  		local mg = Duel.GetMatchingGroup(Card.IsFaceup, tp, LOCATION_MZONE, 0, nil)
  		local exg = Duel.GetMatchingGroup(s.exgfilter, tp, LOCATION_EXTRA, 0, nil, mg, c)
  		if exg:GetCount() > 0 then
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  			local sc = exg:Select(tp, 1, 1, nil):GetFirst()
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_XMATERIAL)
  			local msg = mg:SelectSubGroup(tp, s.exgselect, false, 1, #mg, sc, c)
  			Duel.XyzSummon(tp, sc, msg, #msg, #msg)
  		end
  	end
  end
  
  