Laevateinn
2 FIRE monsters
During the Main Phase (Quick Effect): You can Tribute 1 other FIRE monster, then target 1 FIRE monster in your GY with the same original Type but a lower original Level; Special Summon it in Defense Position. If a face-down card(s) in your Spell & Trap Zone would be destroyed by an opponent's card effect, you can banish this card you control instead. You can only use each effect of "Laevateinn the Burning Blade" once per turn.
local s, id, o = GetID()
function s.initial_effect(c)
	c:EnableReviveLimit()
	--material
	aux.AddLinkProcedure(c, aux.FilterBoolFunction(Card.IsLinkAttribute, ATTRIBUTE_FIRE), 2, 2)
	--special summon
	local e1 = Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id, 0))
	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
	e1:SetType(EFFECT_TYPE_QUICK_O)
	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
	e1:SetCode(EVENT_FREE_CHAIN)
	e1:SetHintTiming(0, TIMINGS_CHECK_MONSTER + TIMING_MAIN_END)
	e1:SetRange(LOCATION_MZONE)
	e1:SetCountLimit(1, id)
	e1:SetCondition(s.spcon)
	e1:SetCost(s.spcost)
	e1:SetTarget(s.sptg)
	e1:SetOperation(s.spop)
	c:RegisterEffect(e1)
	--destroy replace
	local e2 = Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_CONTINUOUS + EFFECT_TYPE_FIELD)
	e2:SetCode(EFFECT_DESTROY_REPLACE)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCountLimit(1, id + o)
	e2:SetTarget(s.desreptg)
	e2:SetValue(s.desrepval)
	e2:SetOperation(s.desrepop)
	c:RegisterEffect(e2)
end
function s.spcon(e, tp, eg, ep, ev, re, r, rp)
	return Duel.IsMainPhase()
end
function s.costfilter(c, e, tp)
	return c:IsAttribute(ATTRIBUTE_FIRE)
		and c:GetOriginalLevel() > 1
		and Duel.GetMZoneCount(tp, c) > 0
		and Duel.IsExistingTarget(s.spfilter, tp, LOCATION_GRAVE, 0, 1, nil, e, tp, c:GetOriginalLevel(), c:GetOriginalRace())
end
function s.spfilter(c, e, tp, lv, race)
	return c:IsAttribute(ATTRIBUTE_FIRE) and c:IsLevelBelow(lv - 1) and (c:GetOriginalRace() & race) ~= 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP_DEFENSE)
end
function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
	local c = e:GetHandler()
	if chk == 0 then
		return Duel.CheckReleaseGroup(tp, s.costfilter, 1, c, e, tp)
	end
	local g = Duel.SelectReleaseGroup(tp, s.costfilter, 1, 1, c, e, tp)
	e:SetLabel(g:GetFirst():GetOriginalLevel(), g:GetFirst():GetOriginalRace())
	Duel.Release(g, REASON_COST)
end
function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
	local lv, race = e:GetLabel()
	if chkc then
		return chkc:IsControler(tp) and chkc:IsLocation(LOCATION_GRAVE) and s.spfilter(chkc, e, tp, lv, race)
	end
	if chk == 0 then
		return true
	end
	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
	local g = Duel.SelectTarget(tp, s.spfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil, e, tp, lv, race)
	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, g, 1, 0, 0)
end
function s.spop(e, tp, eg, ep, ev, re, r, rp)
	local tc = Duel.GetFirstTarget()
	if tc and tc:IsRelateToChain() and aux.NecroValleyFilter()(tc) then
		Duel.SpecialSummon(tc, 0, tp, tp, false, false, POS_FACEUP_DEFENSE)
	end
end
function s.repfilter(c, tp)
	return c:IsControler(tp) and c:IsOnField() and c:IsLocation(LOCATION_SZONE) and not c:IsLocation(LOCATION_FZONE) and c:IsFacedown() and c:IsReason(REASON_EFFECT) and not c:IsReason(REASON_REPLACE)
end
function s.desreptg(e, tp, eg, ep, ev, re, r, rp, chk)
	local c = e:GetHandler()
	if chk == 0 then
		return rp == 1 - tp and eg:IsExists(s.repfilter, 1, nil, tp) and c:IsAbleToRemove() and not c:IsStatus(STATUS_DESTROY_CONFIRMED + STATUS_BATTLE_DESTROYED)
	end
	return Duel.SelectEffectYesNo(tp, c, 96)
end
function s.desrepval(e, c)
	return s.repfilter(c, e:GetHandlerPlayer())
end
function s.desrepop(e, tp, eg, ep, ev, re, r, rp)
	Duel.Hint(HINT_CARD, 0, id)
	Duel.Remove(e:GetHandler(), POS_FACEUP, REASON_EFFECT + REASON_REPLACE)
end


Laevateinn
2 FIRE monsters
During the Main Phase (Quick Effect): You can Tribute 1 other FIRE monster, then target 1 FIRE monster in your GY with the same original Type but a lower original Level; Special Summon it in Defense Position. If a face-down card(s) in your Spell & Trap Zone would be destroyed by an opponent's card effect, you can banish this card you control instead. You can only use each effect of "Laevateinn the Burning Blade" once per turn.
-- Laevateinn
local s, id, o = GetID()
function s.initial_effect(c)
	c:EnableReviveLimit()
	--material
	aux.AddLinkProcedure(c, aux.FilterBoolFunction(Card.IsLinkAttribute, ATTRIBUTE_FIRE), 2, 2)
	--special summon
	local e1 = Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id, 0))
	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
	e1:SetType(EFFECT_TYPE_QUICK_O)
	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
	e1:SetCode(EVENT_FREE_CHAIN)
	e1:SetHintTiming(0, TIMINGS_CHECK_MONSTER + TIMING_MAIN_END)
	e1:SetRange(LOCATION_MZONE)
	e1:SetCountLimit(1, id)
	e1:SetCondition(s.spcon)
	e1:SetCost(s.spcost)
	e1:SetTarget(s.sptg)
	e1:SetOperation(s.spop)
	c:RegisterEffect(e1)
	--destroy replace
	local e2 = Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_CONTINUOUS + EFFECT_TYPE_FIELD)
	e2:SetCode(EFFECT_DESTROY_REPLACE)
	e2:SetRange(LOCATION_MZONE)
	e2:SetCountLimit(1, id + o)
	e2:SetTarget(s.desreptg)
	e2:SetValue(s.desrepval)
	e2:SetOperation(s.desrepop)
	c:RegisterEffect(e2)
end
function s.spcon(e, tp, eg, ep, ev, re, r, rp)
	return Duel.IsMainPhase()
end
function s.costfilter(c, e, tp)
	return c:IsAttribute(ATTRIBUTE_FIRE)
		and c:GetOriginalLevel() > 1
		and Duel.GetMZoneCount(tp, c) > 0
		and Duel.IsExistingTarget(s.spfilter, tp, LOCATION_GRAVE, 0, 1, nil, e, tp, c:GetOriginalLevel(), c:GetOriginalRace())
end
function s.spfilter(c, e, tp, lv, race)
	return c:IsAttribute(ATTRIBUTE_FIRE) and c:IsLevelBelow(lv - 1) and (c:GetOriginalRace() & race) ~= 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP_DEFENSE)
end
function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
	local c = e:GetHandler()
	if chk == 0 then
		return Duel.CheckReleaseGroup(tp, s.costfilter, 1, c, e, tp)
	end
	local g = Duel.SelectReleaseGroup(tp, s.costfilter, 1, 1, c, e, tp)
	e:SetLabel(g:GetFirst():GetOriginalLevel(), g:GetFirst():GetOriginalRace())
	Duel.Release(g, REASON_COST)
end
function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
	local lv, race = e:GetLabel()
	if chkc then
		return chkc:IsControler(tp) and chkc:IsLocation(LOCATION_GRAVE) and s.spfilter(chkc, e, tp, lv, race)
	end
	if chk == 0 then
		return true
	end
	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
	local g = Duel.SelectTarget(tp, s.spfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil, e, tp, lv, race)
	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, g, 1, 0, 0)
end
function s.spop(e, tp, eg, ep, ev, re, r, rp)
	local tc = Duel.GetFirstTarget()
	if tc and tc:IsRelateToChain() and aux.NecroValleyFilter()(tc) then
		Duel.SpecialSummon(tc, 0, tp, tp, false, false, POS_FACEUP_DEFENSE)
	end
end
function s.repfilter(c, tp)
	return c:IsControler(tp) and c:IsOnField() and c:IsLocation(LOCATION_SZONE) and not c:IsLocation(LOCATION_FZONE) and c:IsFacedown() and c:IsReason(REASON_EFFECT) and not c:IsReason(REASON_REPLACE)
end
function s.desreptg(e, tp, eg, ep, ev, re, r, rp, chk)
	local c = e:GetHandler()
	if chk == 0 then
		return rp == 1 - tp and eg:IsExists(s.repfilter, 1, nil, tp) and c:IsAbleToRemove() and not c:IsStatus(STATUS_DESTROY_CONFIRMED + STATUS_BATTLE_DESTROYED)
	end
	return Duel.SelectEffectYesNo(tp, c, 96)
end
function s.desrepval(e, c)
	return s.repfilter(c, e:GetHandlerPlayer())
end
function s.desrepop(e, tp, eg, ep, ev, re, r, rp)
	Duel.Hint(HINT_CARD, 0, id)
	Duel.Remove(e:GetHandler(), POS_FACEUP, REASON_EFFECT + REASON_REPLACE)
end

