name: Megalith
card_text: You can Ritual Summon this card with a "Megalith" card. If this card is Ritual Summoned: You can add 1 "Megalith" monster from your Deck to your hand, except "Megalith Ophiel". During your Main Phase: You can activate this effect; Ritual Summon 1 Ritual Monster from your hand, by Tributing monsters from your hand or field, including this card on your field, whose total Levels equal or exceed the Level of the Ritual Monster. You can only use this effect of "Megalith Ophiel" once per turn.
external_ids: local SETCARD_ID_0 = 0x138 --Megalith
  
lua: local SETCARD_ID_0 = 0x138 --Megalith
  local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	--search
  	local e1=Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id,0))
  	e1:SetCategory(CATEGORY_SEARCH+CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
  	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e1:SetProperty(EFFECT_FLAG_DELAY)
  	e1:SetCondition(s.srcon)
  	e1:SetTarget(s.srtg)
  	e1:SetOperation(s.srop)
  	c:RegisterEffect(e1)
  	--ritual summon
  	local e2=Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id,1))
  	e2:SetCategory(CATEGORY_RELEASE+CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1,id)
  	e2:SetTarget(s.rstg)
  	e2:SetOperation(s.rsop)
  	c:RegisterEffect(e2)
  end
  function s.srcon(e,tp,eg,ep,ev,re,r,rp)
  	return e:GetHandler():IsSummonType(SUMMON_TYPE_RITUAL)
  end
  function s.srfilter(c)
  	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and not c:IsCode(id) and c:IsAbleToHand()
  end
  function s.srtg(e,tp,eg,ep,ev,re,r,rp,chk)
  	if chk==0 then return Duel.IsExistingMatchingCard(s.srfilter,tp,LOCATION_DECK,0,1,nil) end
  	Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
  end
  function s.srop(e,tp,eg,ep,ev,re,r,rp)
  	Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_ATOHAND)
  	local g=Duel.SelectMatchingCard(tp,s.srfilter,tp,LOCATION_DECK,0,1,1,nil)
  	if g:GetCount()>0 then
  		Duel.SendtoHand(g,nil,REASON_EFFECT)
  		Duel.ConfirmCards(1-tp,g)
  	end
  end
  function s.rcheck(gc)
  	return	function(tp,g,c)
  				return g:IsContains(gc)
  			end
  end
  function s.rstg(e,tp,eg,ep,ev,re,r,rp,chk)
  	local c=e:GetHandler()
  	if chk==0 then
  		local mg=Duel.GetRitualMaterial(tp)
  		aux.RCheckAdditional=s.rcheck(c)
  		local res=mg:IsContains(c) and Duel.IsExistingMatchingCard(aux.RitualUltimateFilter,tp,LOCATION_HAND,0,1,nil,aux.TRUE,e,tp,mg,nil,Card.GetLevel,"Greater")
  		aux.RCheckAdditional=nil
  		return res
  	end
  	Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_HAND)
  end
  function s.rsop(e,tp,eg,ep,ev,re,r,rp)
  	local c=e:GetHandler()
  	::cancel::
  	local mg=Duel.GetRitualMaterial(tp)
  	if c:IsControler(1-tp) or not c:IsRelateToEffect(e) or not mg:IsContains(c) then return end
  	Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
  	aux.RCheckAdditional=s.rcheck(c)
  	local tg=Duel.SelectMatchingCard(tp,aux.RitualUltimateFilter,tp,LOCATION_HAND,0,1,1,nil,aux.TRUE,e,tp,mg,nil,Card.GetLevel,"Greater")
  	local tc=tg:GetFirst()
  	if tc then
  		mg=mg:Filter(Card.IsCanBeRitualMaterial,tc,tc)
  		if tc.mat_filter then
  			mg=mg:Filter(tc.mat_filter,tc,tp)
  		else
  		mg:RemoveCard(tc)
  		end
  		if not mg:IsContains(c) then return end
  		Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_RELEASE)
  		Duel.SetSelectedCard(c)
  		aux.GCheckAdditional=aux.RitualCheckAdditional(tc,tc:GetLevel(),"Greater")
  		local mat=mg:SelectSubGroup(tp,aux.RitualCheck,true,1,tc:GetLevel(),tp,tc,tc:GetLevel(),"Greater")
  		aux.GCheckAdditional=nil
  		if not mat then
  			aux.RCheckAdditional=nil
  			goto cancel
  		end
  		tc:SetMaterial(mat)
  		Duel.ReleaseRitualMaterial(mat)
  		Duel.BreakEffect()
  		Duel.SpecialSummon(tc,SUMMON_TYPE_RITUAL,tp,tp,false,true,POS_FACEUP)
  		tc:CompleteProcedure()
  	end
  	aux.RCheckAdditional=nil
  end
  
  
source_text: Megalith
  You can Ritual Summon this card with a "Megalith" card. If this card is Ritual Summoned: You can add 1 "Megalith" monster from your Deck to your hand, except "Megalith Ophiel". During your Main Phase: You can activate this effect; Ritual Summon 1 Ritual Monster from your hand, by Tributing monsters from your hand or field, including this card on your field, whose total Levels equal or exceed the Level of the Ritual Monster. You can only use this effect of "Megalith Ophiel" once per turn.
target_text: -- Megalith
  local SETCARD_ID_0 = 0x138 --Megalith
  local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	--search
  	local e1=Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id,0))
  	e1:SetCategory(CATEGORY_SEARCH+CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
  	e1:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e1:SetProperty(EFFECT_FLAG_DELAY)
  	e1:SetCondition(s.srcon)
  	e1:SetTarget(s.srtg)
  	e1:SetOperation(s.srop)
  	c:RegisterEffect(e1)
  	--ritual summon
  	local e2=Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id,1))
  	e2:SetCategory(CATEGORY_RELEASE+CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1,id)
  	e2:SetTarget(s.rstg)
  	e2:SetOperation(s.rsop)
  	c:RegisterEffect(e2)
  end
  function s.srcon(e,tp,eg,ep,ev,re,r,rp)
  	return e:GetHandler():IsSummonType(SUMMON_TYPE_RITUAL)
  end
  function s.srfilter(c)
  	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and not c:IsCode(id) and c:IsAbleToHand()
  end
  function s.srtg(e,tp,eg,ep,ev,re,r,rp,chk)
  	if chk==0 then return Duel.IsExistingMatchingCard(s.srfilter,tp,LOCATION_DECK,0,1,nil) end
  	Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
  end
  function s.srop(e,tp,eg,ep,ev,re,r,rp)
  	Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_ATOHAND)
  	local g=Duel.SelectMatchingCard(tp,s.srfilter,tp,LOCATION_DECK,0,1,1,nil)
  	if g:GetCount()>0 then
  		Duel.SendtoHand(g,nil,REASON_EFFECT)
  		Duel.ConfirmCards(1-tp,g)
  	end
  end
  function s.rcheck(gc)
  	return	function(tp,g,c)
  				return g:IsContains(gc)
  			end
  end
  function s.rstg(e,tp,eg,ep,ev,re,r,rp,chk)
  	local c=e:GetHandler()
  	if chk==0 then
  		local mg=Duel.GetRitualMaterial(tp)
  		aux.RCheckAdditional=s.rcheck(c)
  		local res=mg:IsContains(c) and Duel.IsExistingMatchingCard(aux.RitualUltimateFilter,tp,LOCATION_HAND,0,1,nil,aux.TRUE,e,tp,mg,nil,Card.GetLevel,"Greater")
  		aux.RCheckAdditional=nil
  		return res
  	end
  	Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_HAND)
  end
  function s.rsop(e,tp,eg,ep,ev,re,r,rp)
  	local c=e:GetHandler()
  	::cancel::
  	local mg=Duel.GetRitualMaterial(tp)
  	if c:IsControler(1-tp) or not c:IsRelateToEffect(e) or not mg:IsContains(c) then return end
  	Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
  	aux.RCheckAdditional=s.rcheck(c)
  	local tg=Duel.SelectMatchingCard(tp,aux.RitualUltimateFilter,tp,LOCATION_HAND,0,1,1,nil,aux.TRUE,e,tp,mg,nil,Card.GetLevel,"Greater")
  	local tc=tg:GetFirst()
  	if tc then
  		mg=mg:Filter(Card.IsCanBeRitualMaterial,tc,tc)
  		if tc.mat_filter then
  			mg=mg:Filter(tc.mat_filter,tc,tp)
  		else
  		mg:RemoveCard(tc)
  		end
  		if not mg:IsContains(c) then return end
  		Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_RELEASE)
  		Duel.SetSelectedCard(c)
  		aux.GCheckAdditional=aux.RitualCheckAdditional(tc,tc:GetLevel(),"Greater")
  		local mat=mg:SelectSubGroup(tp,aux.RitualCheck,true,1,tc:GetLevel(),tp,tc,tc:GetLevel(),"Greater")
  		aux.GCheckAdditional=nil
  		if not mat then
  			aux.RCheckAdditional=nil
  			goto cancel
  		end
  		tc:SetMaterial(mat)
  		Duel.ReleaseRitualMaterial(mat)
  		Duel.BreakEffect()
  		Duel.SpecialSummon(tc,SUMMON_TYPE_RITUAL,tp,tp,false,true,POS_FACEUP)
  		tc:CompleteProcedure()
  	end
  	aux.RCheckAdditional=nil
  end
  
  