name: Grand
card_text: Cannot be Normal Summoned/Set. Must be Special Summoned (from your hand or GY) by shuffling up to 3 non-Effect Monsters from your GY into the Deck/Extra Deck. You can only Special Summon "Grand Knight of the Red Lotus" once per turn this way. If Summoned this way, this card gains 800 ATK for each Normal Monster shuffled into the Deck for its Summon. Once per turn, you can target 1 monster on the field and 1 non-Effect Monster in your GY; destroy that monster on the field, and if you do, Special Summon that other monster from your GY.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	--spsum condition
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_SPSUMMON_CONDITION)
  	e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	c:RegisterEffect(e1)
  	--spsummon self
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 0))
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetCode(EFFECT_SPSUMMON_PROC)
  	e2:SetRange(LOCATION_GRAVE + LOCATION_HAND)
  	e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	e2:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e2:SetCondition(s.spscon)
  	e2:SetTarget(s.spstg)
  	e2:SetOperation(s.spsop)
  	c:RegisterEffect(e2)
  	--destroy and spsummon
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 1))
  	e3:SetCategory(CATEGORY_DESTROY + CATEGORY_SPECIAL_SUMMON)
  	e3:SetType(EFFECT_TYPE_IGNITION)
  	e3:SetRange(LOCATION_MZONE)
  	e3:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e3:SetCountLimit(1)
  	e3:SetTarget(s.destg)
  	e3:SetOperation(s.desop)
  	c:RegisterEffect(e3)
  end
  function s.cfilter(c)
  	return not c:IsType(TYPE_EFFECT) and c:IsType(TYPE_MONSTER) and c:IsAbleToDeckOrExtraAsCost()
  end
  function s.spscon(e, c)
  	if c == nil then
  		return true
  	end
  	local tp = c:GetControler()
  	local g = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_GRAVE, 0, c)
  	if Duel.GetLocationCount(tp, LOCATION_MZONE) <= 0 then
  		return false
  	end
  	local res = g:CheckSubGroup(aux.TRUE, 1, 3)
  	return res
  end
  function s.spstg(e, tp, eg, ep, ev, re, r, rp, chk, c)
  	local mg = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_GRAVE, 0, c)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local sg = mg:SelectSubGroup(tp, aux.TRUE, true, 1, 3)
  	if sg then
  		sg:KeepAlive()
  		e:SetLabelObject(sg)
  		return true
  	else
  		return false
  	end
  end
  function s.spsop(e, tp, eg, ep, ev, re, r, rp, c)
  	local g = e:GetLabelObject()
  	local gg = g:Filter(Card.IsLocation, nil, LOCATION_GRAVE)
  	if #gg > 0 then
  		Duel.HintSelection(gg)
  	end
  	Duel.SendtoDeck(g, nil, SEQ_DECKSHUFFLE, REASON_SPSUMMON)
  	local ag = g:Filter(Card.IsLocation, nil, LOCATION_DECK):Filter(Card.IsType, nil, TYPE_NORMAL)
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_UPDATE_ATTACK)
  	e1:SetReset(RESET_EVENT + 0xff0000)
  	e1:SetValue(ag:GetCount() * 800)
  	c:RegisterEffect(e1)
  	g:DeleteGroup()
  end
  function s.desfilter(c, tp)
  	return Duel.GetMZoneCount(tp, c) > 0
  end
  function s.spfilter(c, e, tp)
  	return not c:IsType(TYPE_EFFECT) and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  end
  function s.destg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return false
  	end
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.desfilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil, tp) and Duel.IsExistingTarget(s.spfilter, tp, LOCATION_GRAVE, 0, 1, nil, e, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  	local g1 = Duel.SelectTarget(tp, s.desfilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, 1, nil, tp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g2 = Duel.SelectTarget(tp, s.spfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil, e, tp)
  	Duel.SetOperationInfo(0, CATEGORY_DESTROY, g1, 1, 0, 0)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, g2, 1, 0, 0)
  	e:SetLabelObject(g1:GetFirst())
  end
  function s.desop(e, tp, eg, ep, ev, re, r, rp)
  	local tc1, tc2 = Duel.GetFirstTarget()
  	if tc1 ~= e:GetLabelObject() then
  		tc1, tc2 = tc2, tc1
  	end
  	if tc1:IsRelateToEffect(e) and tc1:IsType(TYPE_MONSTER) and Duel.Destroy(tc1, REASON_EFFECT) > 0 and tc2:IsRelateToEffect(e) and aux.NecroValleyFilter()(tc2) then
  		Duel.SpecialSummon(tc2, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  
source_text: Grand
  Cannot be Normal Summoned/Set. Must be Special Summoned (from your hand or GY) by shuffling up to 3 non-Effect Monsters from your GY into the Deck/Extra Deck. You can only Special Summon "Grand Knight of the Red Lotus" once per turn this way. If Summoned this way, this card gains 800 ATK for each Normal Monster shuffled into the Deck for its Summon. Once per turn, you can target 1 monster on the field and 1 non-Effect Monster in your GY; destroy that monster on the field, and if you do, Special Summon that other monster from your GY.
target_text: -- Grand
  local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	--spsum condition
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_SPSUMMON_CONDITION)
  	e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	c:RegisterEffect(e1)
  	--spsummon self
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 0))
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetCode(EFFECT_SPSUMMON_PROC)
  	e2:SetRange(LOCATION_GRAVE + LOCATION_HAND)
  	e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	e2:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e2:SetCondition(s.spscon)
  	e2:SetTarget(s.spstg)
  	e2:SetOperation(s.spsop)
  	c:RegisterEffect(e2)
  	--destroy and spsummon
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 1))
  	e3:SetCategory(CATEGORY_DESTROY + CATEGORY_SPECIAL_SUMMON)
  	e3:SetType(EFFECT_TYPE_IGNITION)
  	e3:SetRange(LOCATION_MZONE)
  	e3:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e3:SetCountLimit(1)
  	e3:SetTarget(s.destg)
  	e3:SetOperation(s.desop)
  	c:RegisterEffect(e3)
  end
  function s.cfilter(c)
  	return not c:IsType(TYPE_EFFECT) and c:IsType(TYPE_MONSTER) and c:IsAbleToDeckOrExtraAsCost()
  end
  function s.spscon(e, c)
  	if c == nil then
  		return true
  	end
  	local tp = c:GetControler()
  	local g = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_GRAVE, 0, c)
  	if Duel.GetLocationCount(tp, LOCATION_MZONE) <= 0 then
  		return false
  	end
  	local res = g:CheckSubGroup(aux.TRUE, 1, 3)
  	return res
  end
  function s.spstg(e, tp, eg, ep, ev, re, r, rp, chk, c)
  	local mg = Duel.GetMatchingGroup(s.cfilter, tp, LOCATION_GRAVE, 0, c)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local sg = mg:SelectSubGroup(tp, aux.TRUE, true, 1, 3)
  	if sg then
  		sg:KeepAlive()
  		e:SetLabelObject(sg)
  		return true
  	else
  		return false
  	end
  end
  function s.spsop(e, tp, eg, ep, ev, re, r, rp, c)
  	local g = e:GetLabelObject()
  	local gg = g:Filter(Card.IsLocation, nil, LOCATION_GRAVE)
  	if #gg > 0 then
  		Duel.HintSelection(gg)
  	end
  	Duel.SendtoDeck(g, nil, SEQ_DECKSHUFFLE, REASON_SPSUMMON)
  	local ag = g:Filter(Card.IsLocation, nil, LOCATION_DECK):Filter(Card.IsType, nil, TYPE_NORMAL)
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_UPDATE_ATTACK)
  	e1:SetReset(RESET_EVENT + 0xff0000)
  	e1:SetValue(ag:GetCount() * 800)
  	c:RegisterEffect(e1)
  	g:DeleteGroup()
  end
  function s.desfilter(c, tp)
  	return Duel.GetMZoneCount(tp, c) > 0
  end
  function s.spfilter(c, e, tp)
  	return not c:IsType(TYPE_EFFECT) and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  end
  function s.destg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return false
  	end
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.desfilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, nil, tp) and Duel.IsExistingTarget(s.spfilter, tp, LOCATION_GRAVE, 0, 1, nil, e, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  	local g1 = Duel.SelectTarget(tp, s.desfilter, tp, LOCATION_MZONE, LOCATION_MZONE, 1, 1, nil, tp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  	local g2 = Duel.SelectTarget(tp, s.spfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil, e, tp)
  	Duel.SetOperationInfo(0, CATEGORY_DESTROY, g1, 1, 0, 0)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, g2, 1, 0, 0)
  	e:SetLabelObject(g1:GetFirst())
  end
  function s.desop(e, tp, eg, ep, ev, re, r, rp)
  	local tc1, tc2 = Duel.GetFirstTarget()
  	if tc1 ~= e:GetLabelObject() then
  		tc1, tc2 = tc2, tc1
  	end
  	if tc1:IsRelateToEffect(e) and tc1:IsType(TYPE_MONSTER) and Duel.Destroy(tc1, REASON_EFFECT) > 0 and tc2:IsRelateToEffect(e) and aux.NecroValleyFilter()(tc2) then
  		Duel.SpecialSummon(tc2, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  