Ryzeal
2+ Level 4 monsters
For each material this card has, monsters you control gain 100 ATK and monsters your opponent controls lose 100 ATK. You can only use each of the following effects of "Ryzeal Duo Drive" once per turn. If this card is Special Summoned: You can attach 1 "Ryzeal" monster from your GY to this card as material. During your Main Phase: You can detach 2 materials from a monster(s) you control, and if you do, add 2 "Ryzeal" cards with different names from your Deck to your hand.
local SETCARD_ID_0 = 0x1be --Ryzeal

local SETCARD_ID_0 = 0x1be --Ryzeal
local s, id, o = GetID()
function s.initial_effect(c)
	--xyz summon
	aux.AddXyzProcedure(c, nil, 4, 2, nil, nil, 99)
	c:EnableReviveLimit()
	--material
	local e1 = Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id, 0))
	e1:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
	e1:SetProperty(EFFECT_FLAG_DELAY)
	e1:SetCountLimit(1, id)
	e1:SetTarget(s.mttg)
	e1:SetOperation(s.mtop)
	c:RegisterEffect(e1)
	--atk up or atkdown
	local e2 = Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_FIELD)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCode(EFFECT_UPDATE_ATTACK)
	e2:SetTargetRange(LOCATION_MZONE, 0)
	e2:SetValue(s.val1)
	c:RegisterEffect(e2)
	local e3 = e2:Clone()
	e3:SetTargetRange(0, LOCATION_MZONE)
	e3:SetValue(s.val2)
	c:RegisterEffect(e3)
	--to hand
	local e4 = Effect.CreateEffect(c)
	e4:SetDescription(aux.Stringid(id, 1))
	e4:SetCategory(CATEGORY_SEARCH + CATEGORY_TOHAND)
	e4:SetType(EFFECT_TYPE_IGNITION)
	e4:SetRange(LOCATION_MZONE)
	e4:SetCountLimit(1, id + o)
	e4:SetTarget(s.thtg)
	e4:SetOperation(s.thop)
	c:RegisterEffect(e4)
end
function s.mtfilter(c, e)
	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and c:IsCanOverlay() and not (e and c:IsImmuneToEffect(e))
end
function s.mttg(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		return e:GetHandler():IsType(TYPE_XYZ) and Duel.IsExistingMatchingCard(s.mtfilter, tp, LOCATION_GRAVE, 0, 1, nil)
	end
	Duel.Hint(HINT_OPSELECTED, 1 - tp, e:GetDescription())
	Duel.SetOperationInfo(0, CATEGORY_LEAVE_GRAVE, nil, 1, 0, 0)
end
function s.mtop(e, tp, eg, ep, ev, re, r, rp)
	local c = e:GetHandler()
	if not c:IsRelateToEffect(e) then
		return
	end
	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_XMATERIAL)
	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.mtfilter), tp, LOCATION_GRAVE, 0, 1, 1, nil, e)
	if g:GetCount() > 0 then
		Duel.Overlay(c, g)
	end
end
function s.val1(e, c)
	return e:GetHandler():GetOverlayCount() * 100
end
function s.val2(e, c)
	return e:GetHandler():GetOverlayCount() * -100
end
function s.thfilter(c)
	return c:IsSetCard(SETCARD_ID_0) and c:IsAbleToHand()
end
function s.thtg(e, tp, eg, ep, ev, re, r, rp, chk)
	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
	if chk == 0 then
		return Duel.CheckRemoveOverlayCard(tp, 1, 0, 2, REASON_EFFECT) and g:GetClassCount(Card.GetCode) >= 2
	end
	Duel.Hint(HINT_OPSELECTED, 1 - tp, e:GetDescription())
	Duel.SetOperationInfo(0, CATEGORY_TOHAND, nil, 2, tp, LOCATION_DECK)
end
function s.thop(e, tp, eg, ep, ev, re, r, rp)
	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
	if Duel.RemoveOverlayCard(tp, 1, 0, 2, 2, REASON_EFFECT) ~= 0 and g:GetClassCount(Card.GetCode) >= 2 then
		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
		local tg = g:SelectSubGroup(tp, aux.dncheck, false, 2, 2)
		if tg:GetCount() > 0 then
			Duel.SendtoHand(tg, nil, REASON_EFFECT)
			Duel.ConfirmCards(1 - tp, tg)
		end
	end
end


Ryzeal
2+ Level 4 monsters
For each material this card has, monsters you control gain 100 ATK and monsters your opponent controls lose 100 ATK. You can only use each of the following effects of "Ryzeal Duo Drive" once per turn. If this card is Special Summoned: You can attach 1 "Ryzeal" monster from your GY to this card as material. During your Main Phase: You can detach 2 materials from a monster(s) you control, and if you do, add 2 "Ryzeal" cards with different names from your Deck to your hand.
-- Ryzeal
local SETCARD_ID_0 = 0x1be --Ryzeal
local s, id, o = GetID()
function s.initial_effect(c)
	--xyz summon
	aux.AddXyzProcedure(c, nil, 4, 2, nil, nil, 99)
	c:EnableReviveLimit()
	--material
	local e1 = Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id, 0))
	e1:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
	e1:SetProperty(EFFECT_FLAG_DELAY)
	e1:SetCountLimit(1, id)
	e1:SetTarget(s.mttg)
	e1:SetOperation(s.mtop)
	c:RegisterEffect(e1)
	--atk up or atkdown
	local e2 = Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_FIELD)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCode(EFFECT_UPDATE_ATTACK)
	e2:SetTargetRange(LOCATION_MZONE, 0)
	e2:SetValue(s.val1)
	c:RegisterEffect(e2)
	local e3 = e2:Clone()
	e3:SetTargetRange(0, LOCATION_MZONE)
	e3:SetValue(s.val2)
	c:RegisterEffect(e3)
	--to hand
	local e4 = Effect.CreateEffect(c)
	e4:SetDescription(aux.Stringid(id, 1))
	e4:SetCategory(CATEGORY_SEARCH + CATEGORY_TOHAND)
	e4:SetType(EFFECT_TYPE_IGNITION)
	e4:SetRange(LOCATION_MZONE)
	e4:SetCountLimit(1, id + o)
	e4:SetTarget(s.thtg)
	e4:SetOperation(s.thop)
	c:RegisterEffect(e4)
end
function s.mtfilter(c, e)
	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and c:IsCanOverlay() and not (e and c:IsImmuneToEffect(e))
end
function s.mttg(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		return e:GetHandler():IsType(TYPE_XYZ) and Duel.IsExistingMatchingCard(s.mtfilter, tp, LOCATION_GRAVE, 0, 1, nil)
	end
	Duel.Hint(HINT_OPSELECTED, 1 - tp, e:GetDescription())
	Duel.SetOperationInfo(0, CATEGORY_LEAVE_GRAVE, nil, 1, 0, 0)
end
function s.mtop(e, tp, eg, ep, ev, re, r, rp)
	local c = e:GetHandler()
	if not c:IsRelateToEffect(e) then
		return
	end
	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_XMATERIAL)
	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.mtfilter), tp, LOCATION_GRAVE, 0, 1, 1, nil, e)
	if g:GetCount() > 0 then
		Duel.Overlay(c, g)
	end
end
function s.val1(e, c)
	return e:GetHandler():GetOverlayCount() * 100
end
function s.val2(e, c)
	return e:GetHandler():GetOverlayCount() * -100
end
function s.thfilter(c)
	return c:IsSetCard(SETCARD_ID_0) and c:IsAbleToHand()
end
function s.thtg(e, tp, eg, ep, ev, re, r, rp, chk)
	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
	if chk == 0 then
		return Duel.CheckRemoveOverlayCard(tp, 1, 0, 2, REASON_EFFECT) and g:GetClassCount(Card.GetCode) >= 2
	end
	Duel.Hint(HINT_OPSELECTED, 1 - tp, e:GetDescription())
	Duel.SetOperationInfo(0, CATEGORY_TOHAND, nil, 2, tp, LOCATION_DECK)
end
function s.thop(e, tp, eg, ep, ev, re, r, rp)
	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
	if Duel.RemoveOverlayCard(tp, 1, 0, 2, 2, REASON_EFFECT) ~= 0 and g:GetClassCount(Card.GetCode) >= 2 then
		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
		local tg = g:SelectSubGroup(tp, aux.dncheck, false, 2, 2)
		if tg:GetCount() > 0 then
			Duel.SendtoHand(tg, nil, REASON_EFFECT)
			Duel.ConfirmCards(1 - tp, tg)
		end
	end
end

