name: Icejade
card_text: 1 WATER Tuner + 1+ non-Tuner monsters
  (Quick Effect): You can activate this effect; face-up monsters you control cannot be destroyed, or banished, by your opponent's card effects this turn. Then, if you activated this effect in response to your opponent's card or effect activation, and your opponent has a card(s) with that name on their field and/or GY, you can banish those cards. If a card(s) is banished by your opponent's card effect, while this card is in your GY (except during the Damage Step): You can Special Summon this card. You can only use each effect of "Icejade Gymir Aegirine" once per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	aux.AddSynchroProcedure(c, aux.FilterBoolFunction(Card.IsAttribute, ATTRIBUTE_WATER), aux.NonTuner(nil), 1)
  	--protect and banish
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetType(EFFECT_TYPE_QUICK_O)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetCountLimit(1, id)
  	e1:SetHintTiming(0, TIMINGS_CHECK_MONSTER)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.operation)
  	c:RegisterEffect(e1)
  	--spsummon itself
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 2))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetProperty(EFFECT_FLAG_DELAY)
  	e2:SetCode(EVENT_REMOVE)
  	e2:SetRange(LOCATION_GRAVE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(s.spcon)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return true
  	end
  	e:SetCategory(0)
  	local ch = Duel.GetCurrentChain()
  	if ch > 1 and Duel.GetChainInfo(ch - 1, CHAININFO_TRIGGERING_PLAYER) == 1 - tp then
  		e:SetCategory(CATEGORY_REMOVE + CATEGORY_GRAVE_ACTION)
  	end
  end
  function s.operation(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e1:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
  	e1:SetTargetRange(LOCATION_MZONE, 0)
  	e1:SetValue(aux.indoval)
  	e1:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e1, tp)
  	local e2 = Effect.CreateEffect(c)
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
  	e2:SetCode(EFFECT_CANNOT_REMOVE)
  	e2:SetTargetRange(1, 1)
  	e2:SetTarget(s.efilter)
  	e2:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e2, tp)
  	local ch = Duel.GetCurrentChain()
  	if ch > 1 then
  		local p, code, te = Duel.GetChainInfo(ch - 1, CHAININFO_TRIGGERING_PLAYER, CHAININFO_TRIGGERING_CODE, CHAININFO_TRIGGERING_EFFECT)
  		if p == 1 - tp then
  			if te then
  				local tc = te:GetHandler()
  				if tc and tc:IsRelateToEffect(te) then
  					code = tc:GetCode()
  				end
  			end
  			local g = Duel.GetMatchingGroup(s.rmfilter, tp, 0, LOCATION_ONFIELD + LOCATION_GRAVE, nil, code)
  			if #g > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 1)) then
  				Duel.BreakEffect()
  				Duel.Remove(g, POS_FACEUP, REASON_EFFECT)
  			end
  		end
  	end
  end
  function s.efilter(e, c, rp, r, re)
  	local tp = e:GetHandlerPlayer()
  	return c:IsFaceup() and c:IsControler(tp) and c:IsLocation(LOCATION_MZONE) and r & REASON_EFFECT > 0 and r & REASON_REDIRECT == 0 and rp == 1 - tp
  end
  function s.rmfilter(c, code)
  	return c:IsFaceupEx() and c:IsCode(code) and c:IsAbleToRemove()
  end
  function s.cfilter(c, tp)
  	return c:GetReasonPlayer() == 1 - tp and c:IsReason(REASON_EFFECT)
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp) and not eg:IsContains(e:GetHandler())
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, c, 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  
source_text: Icejade
  1 WATER Tuner + 1+ non-Tuner monsters
  (Quick Effect): You can activate this effect; face-up monsters you control cannot be destroyed, or banished, by your opponent's card effects this turn. Then, if you activated this effect in response to your opponent's card or effect activation, and your opponent has a card(s) with that name on their field and/or GY, you can banish those cards. If a card(s) is banished by your opponent's card effect, while this card is in your GY (except during the Damage Step): You can Special Summon this card. You can only use each effect of "Icejade Gymir Aegirine" once per turn.
target_text: -- Icejade
  local s, id, o = GetID()
  function s.initial_effect(c)
  	c:EnableReviveLimit()
  	aux.AddSynchroProcedure(c, aux.FilterBoolFunction(Card.IsAttribute, ATTRIBUTE_WATER), aux.NonTuner(nil), 1)
  	--protect and banish
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetType(EFFECT_TYPE_QUICK_O)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetCountLimit(1, id)
  	e1:SetHintTiming(0, TIMINGS_CHECK_MONSTER)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.operation)
  	c:RegisterEffect(e1)
  	--spsummon itself
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 2))
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetProperty(EFFECT_FLAG_DELAY)
  	e2:SetCode(EVENT_REMOVE)
  	e2:SetRange(LOCATION_GRAVE)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCondition(s.spcon)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return true
  	end
  	e:SetCategory(0)
  	local ch = Duel.GetCurrentChain()
  	if ch > 1 and Duel.GetChainInfo(ch - 1, CHAININFO_TRIGGERING_PLAYER) == 1 - tp then
  		e:SetCategory(CATEGORY_REMOVE + CATEGORY_GRAVE_ACTION)
  	end
  end
  function s.operation(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e1:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
  	e1:SetTargetRange(LOCATION_MZONE, 0)
  	e1:SetValue(aux.indoval)
  	e1:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e1, tp)
  	local e2 = Effect.CreateEffect(c)
  	e2:SetType(EFFECT_TYPE_FIELD)
  	e2:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
  	e2:SetCode(EFFECT_CANNOT_REMOVE)
  	e2:SetTargetRange(1, 1)
  	e2:SetTarget(s.efilter)
  	e2:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e2, tp)
  	local ch = Duel.GetCurrentChain()
  	if ch > 1 then
  		local p, code, te = Duel.GetChainInfo(ch - 1, CHAININFO_TRIGGERING_PLAYER, CHAININFO_TRIGGERING_CODE, CHAININFO_TRIGGERING_EFFECT)
  		if p == 1 - tp then
  			if te then
  				local tc = te:GetHandler()
  				if tc and tc:IsRelateToEffect(te) then
  					code = tc:GetCode()
  				end
  			end
  			local g = Duel.GetMatchingGroup(s.rmfilter, tp, 0, LOCATION_ONFIELD + LOCATION_GRAVE, nil, code)
  			if #g > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 1)) then
  				Duel.BreakEffect()
  				Duel.Remove(g, POS_FACEUP, REASON_EFFECT)
  			end
  		end
  	end
  end
  function s.efilter(e, c, rp, r, re)
  	local tp = e:GetHandlerPlayer()
  	return c:IsFaceup() and c:IsControler(tp) and c:IsLocation(LOCATION_MZONE) and r & REASON_EFFECT > 0 and r & REASON_REDIRECT == 0 and rp == 1 - tp
  end
  function s.rmfilter(c, code)
  	return c:IsFaceupEx() and c:IsCode(code) and c:IsAbleToRemove()
  end
  function s.cfilter(c, tp)
  	return c:GetReasonPlayer() == 1 - tp and c:IsReason(REASON_EFFECT)
  end
  function s.spcon(e, tp, eg, ep, ev, re, r, rp)
  	return eg:IsExists(s.cfilter, 1, nil, tp) and not eg:IsContains(e:GetHandler())
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, c, 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  
  