name: Fusion
card_text: Reveal 1 Fusion Monster in your Extra Deck, and Special Summon 1 of the Fusion Materials whose name is mentioned on that monster from your Extra Deck or GY, but until the end of your opponent's turn, it cannot attack and its effects (if any) are negated. You can only activate 1 "Fusion Armament" per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.ffilter(c, e, tp)
  	return c:IsType(TYPE_FUSION) and Duel.IsExistingMatchingCard(s.spfilter, tp, LOCATION_EXTRA + LOCATION_GRAVE, 0, 1, nil, c, e, tp)
  end
  function s.spfilter(c, fc, e, tp)
  	if not (aux.IsMaterialListCode(fc, c:GetCode()) and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)) then
  		return false
  	end
  	if c:IsLocation(LOCATION_EXTRA) then
  		return Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0
  	else
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0
  	end
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_EXTRA, 0, 1, nil, e, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA + LOCATION_GRAVE)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_CONFIRM)
  	local tc = Duel.SelectMatchingCard(tp, s.ffilter, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp):GetFirst()
  	if tc then
  		Duel.ConfirmCards(1 - tp, tc)
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  		local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, LOCATION_EXTRA + LOCATION_GRAVE, 0, 1, 1, nil, tc, e, tp)
  		if g:GetCount() > 0 and Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP) > 0 then
  			local c = e:GetHandler()
  			local sc = g:GetFirst()
  			local e1 = Effect.CreateEffect(c)
  			e1:SetType(EFFECT_TYPE_SINGLE)
  			e1:SetCode(EFFECT_CANNOT_ATTACK)
  			e1:SetReset(RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_END + RESET_OPPO_TURN)
  			sc:RegisterEffect(e1, true)
  			local e2 = e1:Clone()
  			e2:SetCode(EFFECT_DISABLE)
  			sc:RegisterEffect(e2, true)
  			local e3 = e1:Clone()
  			e3:SetCode(EFFECT_DISABLE_EFFECT)
  			e3:SetValue(RESET_TURN_SET)
  			sc:RegisterEffect(e3, true)
  		end
  	end
  end
  
  
source_text: Fusion
  Reveal 1 Fusion Monster in your Extra Deck, and Special Summon 1 of the Fusion Materials whose name is mentioned on that monster from your Extra Deck or GY, but until the end of your opponent's turn, it cannot attack and its effects (if any) are negated. You can only activate 1 "Fusion Armament" per turn.
target_text: -- Fusion
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.ffilter(c, e, tp)
  	return c:IsType(TYPE_FUSION) and Duel.IsExistingMatchingCard(s.spfilter, tp, LOCATION_EXTRA + LOCATION_GRAVE, 0, 1, nil, c, e, tp)
  end
  function s.spfilter(c, fc, e, tp)
  	if not (aux.IsMaterialListCode(fc, c:GetCode()) and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)) then
  		return false
  	end
  	if c:IsLocation(LOCATION_EXTRA) then
  		return Duel.GetLocationCountFromEx(tp, tp, nil, c) > 0
  	else
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0
  	end
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.ffilter, tp, LOCATION_EXTRA, 0, 1, nil, e, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, nil, 1, tp, LOCATION_EXTRA + LOCATION_GRAVE)
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_CONFIRM)
  	local tc = Duel.SelectMatchingCard(tp, s.ffilter, tp, LOCATION_EXTRA, 0, 1, 1, nil, e, tp):GetFirst()
  	if tc then
  		Duel.ConfirmCards(1 - tp, tc)
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  		local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, LOCATION_EXTRA + LOCATION_GRAVE, 0, 1, 1, nil, tc, e, tp)
  		if g:GetCount() > 0 and Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP) > 0 then
  			local c = e:GetHandler()
  			local sc = g:GetFirst()
  			local e1 = Effect.CreateEffect(c)
  			e1:SetType(EFFECT_TYPE_SINGLE)
  			e1:SetCode(EFFECT_CANNOT_ATTACK)
  			e1:SetReset(RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_END + RESET_OPPO_TURN)
  			sc:RegisterEffect(e1, true)
  			local e2 = e1:Clone()
  			e2:SetCode(EFFECT_DISABLE)
  			sc:RegisterEffect(e2, true)
  			local e3 = e1:Clone()
  			e3:SetCode(EFFECT_DISABLE_EFFECT)
  			e3:SetValue(RESET_TURN_SET)
  			sc:RegisterEffect(e3, true)
  		end
  	end
  end
  
  