name: Xyz
card_text: Send 1 "Xyz" card from your Deck to the GY, except "Xyz Force", or if an Xyz Monster is on the field that has an Xyz Monster as material, you can add the "Xyz" card to your hand instead. During your Main Phase, except the turn this card was sent to the GY: You can banish this card from your GY; detach 1 material from an Xyz Monster on either field, then if the detached material was an Xyz Monster, you can Special Summon that monster from your GY or your banishment, in Defense Position. You can only use each effect of "Xyz Force" once per turn.
external_ids: local SETCARD_ID_0 = 0x73 --Xyz
  
lua: local SETCARD_ID_0 = 0x73 --Xyz
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_TOGRAVE + CATEGORY_SEARCH + CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  	--
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_GRAVE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(aux.exccon)
  	e2:SetCost(aux.bfgcost)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.tgfilter(c, b)
  	return not c:IsCode(id) and c:IsSetCard(SETCARD_ID_0) and (c:IsAbleToGrave() or b and c:IsAbleToHand())
  end
  function s.mfilter(c)
  	return c:IsType(TYPE_XYZ)
  end
  function s.ffilter(c)
  	return c:IsType(TYPE_XYZ) and c:IsFaceup() and c:GetOverlayGroup():IsExists(s.mfilter, 1, nil)
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	local b = Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tgfilter, tp, LOCATION_DECK, 0, 1, nil, b)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOGRAVE, nil, 1, tp, LOCATION_DECK)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local b = Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TOGRAVE)
  	local g = Duel.SelectMatchingCard(tp, s.tgfilter, tp, LOCATION_DECK, 0, 1, 1, nil, b)
  	local tc = g:GetFirst()
  	if tc then
  		if b and tc:IsAbleToHand() and tc:IsAbleToGrave() and Duel.SelectYesNo(tp, aux.Stringid(id, 2)) then
  			Duel.SendtoHand(tc, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, tc)
  		elseif b and tc:IsAbleToHand() and not tc:IsAbleToGrave() then
  			Duel.SendtoHand(tc, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, tc)
  		elseif tc:IsAbleToGrave() then
  			Duel.SendtoGrave(tc, REASON_EFFECT)
  		end
  	end
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.CheckRemoveOverlayCard(tp, 1, 1, 1, REASON_EFFECT)
  	end
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	if Duel.RemoveOverlayCard(tp, 1, 1, 1, 1, REASON_EFFECT) ~= 0 then
  		local g = Duel.GetOperatedGroup()
  		local tc = g:GetFirst()
  		if
  			Duel.GetLocationCount(tp, LOCATION_MZONE) > 0
  			and tc:IsType(TYPE_XYZ)
  			and tc:GetOwner() == tp
  			and tc:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP_DEFENSE)
  			and tc:IsLocation(LOCATION_GRAVE + LOCATION_REMOVED)
  			and not tc:IsHasEffect(EFFECT_NECRO_VALLEY)
  			and Duel.SelectYesNo(tp, aux.Stringid(id, 3))
  		then
  			Duel.BreakEffect()
  			Duel.SpecialSummon(tc, 0, tp, tp, false, false, POS_FACEUP_DEFENSE)
  		end
  	end
  end
  
  
source_text: Xyz
  Send 1 "Xyz" card from your Deck to the GY, except "Xyz Force", or if an Xyz Monster is on the field that has an Xyz Monster as material, you can add the "Xyz" card to your hand instead. During your Main Phase, except the turn this card was sent to the GY: You can banish this card from your GY; detach 1 material from an Xyz Monster on either field, then if the detached material was an Xyz Monster, you can Special Summon that monster from your GY or your banishment, in Defense Position. You can only use each effect of "Xyz Force" once per turn.
target_text: -- Xyz
  local SETCARD_ID_0 = 0x73 --Xyz
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_TOGRAVE + CATEGORY_SEARCH + CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  	--
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_GRAVE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(aux.exccon)
  	e2:SetCost(aux.bfgcost)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.tgfilter(c, b)
  	return not c:IsCode(id) and c:IsSetCard(SETCARD_ID_0) and (c:IsAbleToGrave() or b and c:IsAbleToHand())
  end
  function s.mfilter(c)
  	return c:IsType(TYPE_XYZ)
  end
  function s.ffilter(c)
  	return c:IsType(TYPE_XYZ) and c:IsFaceup() and c:GetOverlayGroup():IsExists(s.mfilter, 1, nil)
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	local b = Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tgfilter, tp, LOCATION_DECK, 0, 1, nil, b)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOGRAVE, nil, 1, tp, LOCATION_DECK)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local b = Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TOGRAVE)
  	local g = Duel.SelectMatchingCard(tp, s.tgfilter, tp, LOCATION_DECK, 0, 1, 1, nil, b)
  	local tc = g:GetFirst()
  	if tc then
  		if b and tc:IsAbleToHand() and tc:IsAbleToGrave() and Duel.SelectYesNo(tp, aux.Stringid(id, 2)) then
  			Duel.SendtoHand(tc, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, tc)
  		elseif b and tc:IsAbleToHand() and not tc:IsAbleToGrave() then
  			Duel.SendtoHand(tc, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, tc)
  		elseif tc:IsAbleToGrave() then
  			Duel.SendtoGrave(tc, REASON_EFFECT)
  		end
  	end
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.CheckRemoveOverlayCard(tp, 1, 1, 1, REASON_EFFECT)
  	end
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	if Duel.RemoveOverlayCard(tp, 1, 1, 1, 1, REASON_EFFECT) ~= 0 then
  		local g = Duel.GetOperatedGroup()
  		local tc = g:GetFirst()
  		if
  			Duel.GetLocationCount(tp, LOCATION_MZONE) > 0
  			and tc:IsType(TYPE_XYZ)
  			and tc:GetOwner() == tp
  			and tc:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP_DEFENSE)
  			and tc:IsLocation(LOCATION_GRAVE + LOCATION_REMOVED)
  			and not tc:IsHasEffect(EFFECT_NECRO_VALLEY)
  			and Duel.SelectYesNo(tp, aux.Stringid(id, 3))
  		then
  			Duel.BreakEffect()
  			Duel.SpecialSummon(tc, 0, tp, tp, false, false, POS_FACEUP_DEFENSE)
  		end
  	end
  end
  
  