K9-X
2 Level 9 monsters
While this card has material, it can attack a number of times each Battle Phase, up to the number of materials attached to it. When your opponent activates a card or effect (Quick Effect): You can detach 1 material from this card, then activate this effect depending on whose turn it is;
● Yours: Banish up to 1 card each from your opponent's field and GY.
● Opponent's: Look at your opponent's hand and banish 1 card from it face-up, until the End Phase.
You can only use this effect of "K9-X "Werewolf"" once per turn.
local s, id, o = GetID()
function s.initial_effect(c)
	--xyz summon
	aux.AddXyzProcedure(c, nil, 9, 2)
	c:EnableReviveLimit()
	--multi attack
	local e1 = Effect.CreateEffect(c)
	e1:SetType(EFFECT_TYPE_SINGLE)
	e1:SetCode(EFFECT_EXTRA_ATTACK)
	e1:SetCondition(s.racon)
	e1:SetValue(s.raval)
	c:RegisterEffect(e1)
	--remove
	local e2 = Effect.CreateEffect(c)
	e2:SetDescription(aux.Stringid(id, 0))
	e2:SetCategory(CATEGORY_REMOVE)
	e2:SetType(EFFECT_TYPE_QUICK_O)
	e2:SetCode(EVENT_CHAINING)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCountLimit(1, id)
	e2:SetCondition(s.rmcon)
	e2:SetCost(s.rmcost)
	e2:SetTarget(s.rmtg)
	e2:SetOperation(s.rmop)
	c:RegisterEffect(e2)
end
function s.racon(e)
	return e:GetHandler():GetOverlayCount() > 1
end
function s.raval(e, c)
	return e:GetHandler():GetOverlayCount() - 1
end
function s.rmcon(e, tp, eg, ep, ev, re, r, rp)
	return rp == 1 - tp
end
function s.rmcost(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		return e:GetHandler():CheckRemoveOverlayCard(tp, 1, REASON_COST)
	end
	e:GetHandler():RemoveOverlayCard(tp, 1, 1, REASON_COST)
end
function s.rmtg(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		if Duel.GetTurnPlayer() == tp then
			return Duel.IsExistingMatchingCard(Card.IsAbleToRemove, tp, 0, LOCATION_ONFIELD + LOCATION_GRAVE, 1, nil)
		else
			return Duel.GetFieldGroupCount(tp, 0, LOCATION_HAND) ~= 0 and Duel.IsExistingMatchingCard(Card.IsAbleToRemove, tp, 0, LOCATION_HAND, 1, nil)
		end
	end
	if Duel.GetTurnPlayer() == tp then
		Duel.SetOperationInfo(0, CATEGORY_REMOVE, nil, 1, 1 - tp, LOCATION_ONFIELD + LOCATION_GRAVE)
	else
		Duel.SetOperationInfo(0, CATEGORY_REMOVE, nil, 1, 1 - tp, LOCATION_HAND)
	end
end
function s.gcheck(g)
	return g:FilterCount(Card.IsLocation, nil, LOCATION_ONFIELD) <= 1 and g:FilterCount(Card.IsLocation, nil, LOCATION_GRAVE) <= 1
end
function s.rmop(e, tp, eg, ep, ev, re, r, rp)
	if Duel.GetTurnPlayer() == tp then
		local g1 = Duel.GetMatchingGroup(Card.IsAbleToRemove, tp, 0, LOCATION_ONFIELD, nil)
		local g2 = Duel.GetMatchingGroup(aux.NecroValleyFilter(Card.IsAbleToRemove), tp, 0, LOCATION_GRAVE, nil)
		g1:Merge(g2)
		if g1:GetCount() == 0 then
			return
		end
		aux.GCheckAdditional = s.gcheck
		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
		local sg = g1:SelectSubGroup(tp, aux.TRUE, false, 1, 2)
		aux.GCheckAdditional = nil
		Duel.HintSelection(sg)
		Duel.Remove(sg, POS_FACEUP, REASON_EFFECT)
	else
		local g0 = Duel.GetFieldGroup(tp, 0, LOCATION_HAND)
		Duel.ConfirmCards(tp, g0)
		local g = Duel.GetMatchingGroup(Card.IsAbleToRemove, tp, 0, LOCATION_HAND, nil)
		if g:GetCount() > 0 then
			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
			local sg = g:Select(tp, 1, 1, nil)
			local tc = sg:GetFirst()
			Duel.Remove(tc, POS_FACEUP, REASON_EFFECT)
			tc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD, 0, 1)
			local e1 = Effect.CreateEffect(e:GetHandler())
			e1:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS)
			e1:SetCode(EVENT_PHASE + PHASE_END)
			e1:SetCountLimit(1)
			e1:SetReset(RESET_PHASE + PHASE_END)
			e1:SetLabelObject(tc)
			e1:SetCondition(s.retcon)
			e1:SetOperation(s.retop)
			Duel.RegisterEffect(e1, tp)
		end
		Duel.ShuffleHand(1 - tp)
	end
end
function s.retcon(e, tp, eg, ep, ev, re, r, rp)
	local tc = e:GetLabelObject()
	if tc:GetFlagEffect(id) == 0 then
		e:Reset()
		return false
	else
		return true
	end
end
function s.retop(e, tp, eg, ep, ev, re, r, rp)
	local tc = e:GetLabelObject()
	Duel.SendtoHand(tc, 1 - tp, REASON_EFFECT)
end


K9-X
2 Level 9 monsters
While this card has material, it can attack a number of times each Battle Phase, up to the number of materials attached to it. When your opponent activates a card or effect (Quick Effect): You can detach 1 material from this card, then activate this effect depending on whose turn it is;
● Yours: Banish up to 1 card each from your opponent's field and GY.
● Opponent's: Look at your opponent's hand and banish 1 card from it face-up, until the End Phase.
You can only use this effect of "K9-X "Werewolf"" once per turn.
-- K9-X
local s, id, o = GetID()
function s.initial_effect(c)
	--xyz summon
	aux.AddXyzProcedure(c, nil, 9, 2)
	c:EnableReviveLimit()
	--multi attack
	local e1 = Effect.CreateEffect(c)
	e1:SetType(EFFECT_TYPE_SINGLE)
	e1:SetCode(EFFECT_EXTRA_ATTACK)
	e1:SetCondition(s.racon)
	e1:SetValue(s.raval)
	c:RegisterEffect(e1)
	--remove
	local e2 = Effect.CreateEffect(c)
	e2:SetDescription(aux.Stringid(id, 0))
	e2:SetCategory(CATEGORY_REMOVE)
	e2:SetType(EFFECT_TYPE_QUICK_O)
	e2:SetCode(EVENT_CHAINING)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCountLimit(1, id)
	e2:SetCondition(s.rmcon)
	e2:SetCost(s.rmcost)
	e2:SetTarget(s.rmtg)
	e2:SetOperation(s.rmop)
	c:RegisterEffect(e2)
end
function s.racon(e)
	return e:GetHandler():GetOverlayCount() > 1
end
function s.raval(e, c)
	return e:GetHandler():GetOverlayCount() - 1
end
function s.rmcon(e, tp, eg, ep, ev, re, r, rp)
	return rp == 1 - tp
end
function s.rmcost(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		return e:GetHandler():CheckRemoveOverlayCard(tp, 1, REASON_COST)
	end
	e:GetHandler():RemoveOverlayCard(tp, 1, 1, REASON_COST)
end
function s.rmtg(e, tp, eg, ep, ev, re, r, rp, chk)
	if chk == 0 then
		if Duel.GetTurnPlayer() == tp then
			return Duel.IsExistingMatchingCard(Card.IsAbleToRemove, tp, 0, LOCATION_ONFIELD + LOCATION_GRAVE, 1, nil)
		else
			return Duel.GetFieldGroupCount(tp, 0, LOCATION_HAND) ~= 0 and Duel.IsExistingMatchingCard(Card.IsAbleToRemove, tp, 0, LOCATION_HAND, 1, nil)
		end
	end
	if Duel.GetTurnPlayer() == tp then
		Duel.SetOperationInfo(0, CATEGORY_REMOVE, nil, 1, 1 - tp, LOCATION_ONFIELD + LOCATION_GRAVE)
	else
		Duel.SetOperationInfo(0, CATEGORY_REMOVE, nil, 1, 1 - tp, LOCATION_HAND)
	end
end
function s.gcheck(g)
	return g:FilterCount(Card.IsLocation, nil, LOCATION_ONFIELD) <= 1 and g:FilterCount(Card.IsLocation, nil, LOCATION_GRAVE) <= 1
end
function s.rmop(e, tp, eg, ep, ev, re, r, rp)
	if Duel.GetTurnPlayer() == tp then
		local g1 = Duel.GetMatchingGroup(Card.IsAbleToRemove, tp, 0, LOCATION_ONFIELD, nil)
		local g2 = Duel.GetMatchingGroup(aux.NecroValleyFilter(Card.IsAbleToRemove), tp, 0, LOCATION_GRAVE, nil)
		g1:Merge(g2)
		if g1:GetCount() == 0 then
			return
		end
		aux.GCheckAdditional = s.gcheck
		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
		local sg = g1:SelectSubGroup(tp, aux.TRUE, false, 1, 2)
		aux.GCheckAdditional = nil
		Duel.HintSelection(sg)
		Duel.Remove(sg, POS_FACEUP, REASON_EFFECT)
	else
		local g0 = Duel.GetFieldGroup(tp, 0, LOCATION_HAND)
		Duel.ConfirmCards(tp, g0)
		local g = Duel.GetMatchingGroup(Card.IsAbleToRemove, tp, 0, LOCATION_HAND, nil)
		if g:GetCount() > 0 then
			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
			local sg = g:Select(tp, 1, 1, nil)
			local tc = sg:GetFirst()
			Duel.Remove(tc, POS_FACEUP, REASON_EFFECT)
			tc:RegisterFlagEffect(id, RESET_EVENT + RESETS_STANDARD, 0, 1)
			local e1 = Effect.CreateEffect(e:GetHandler())
			e1:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS)
			e1:SetCode(EVENT_PHASE + PHASE_END)
			e1:SetCountLimit(1)
			e1:SetReset(RESET_PHASE + PHASE_END)
			e1:SetLabelObject(tc)
			e1:SetCondition(s.retcon)
			e1:SetOperation(s.retop)
			Duel.RegisterEffect(e1, tp)
		end
		Duel.ShuffleHand(1 - tp)
	end
end
function s.retcon(e, tp, eg, ep, ev, re, r, rp)
	local tc = e:GetLabelObject()
	if tc:GetFlagEffect(id) == 0 then
		e:Reset()
		return false
	else
		return true
	end
end
function s.retop(e, tp, eg, ep, ev, re, r, rp)
	local tc = e:GetLabelObject()
	Duel.SendtoHand(tc, 1 - tp, REASON_EFFECT)
end

