name: Jungle
card_text: Cannot be Normal Summoned/Set. Must be Special Summoned by card effect. While there are 2 cards in the Field Zones, your opponent cannot target this card with card effects. You can only use each of the following effects of "Jungle Dweller" once per turn. You can banish 1 LIGHT or DARK monster from your GY; Special Summon this card from your hand. If this card in its owner's possession is destroyed by an opponent's card: You can shuffle up to 2 of your Field Spells from your GY or banishment into the Deck, then you can destroy up to that many cards your opponent controls.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--splimit
  	local e0 = Effect.CreateEffect(c)
  	e0:SetType(EFFECT_TYPE_SINGLE)
  	e0:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	e0:SetCode(EFFECT_SPSUMMON_CONDITION)
  	e0:SetValue(s.splimit)
  	c:RegisterEffect(e0)
  	--cannot be target/effect indestructable
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e1:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetCondition(s.dcon)
  	e1:SetValue(aux.tgoval)
  	c:RegisterEffect(e1)
  	--special summon
  	local e2 = Effect.CreateEffect(c)
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_HAND)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCost(s.spcost)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  	--to deck and destroy
  	local e3 = Effect.CreateEffect(c)
  	e3:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
  	e3:SetCategory(CATEGORY_TODECK + CATEGORY_DESTROY)
  	e3:SetCode(EVENT_DESTROYED)
  	e3:SetProperty(EFFECT_FLAG_DELAY)
  	e3:SetRange(LOCATION_MZONE)
  	e3:SetCountLimit(1, id + o * 2)
  	e3:SetCondition(s.tdcon)
  	e3:SetTarget(s.tdtg)
  	e3:SetOperation(s.tdop)
  	c:RegisterEffect(e3)
  end
  function s.splimit(e, se, sp, st)
  	return se:IsHasType(EFFECT_TYPE_ACTIONS)
  end
  function s.dcon(e)
  	return Duel.IsExistingMatchingCard(nil, e:GetHandlerPlayer(), LOCATION_FZONE, LOCATION_FZONE, 2, nil)
  end
  function s.costfilter(c)
  	return c:IsAttribute(ATTRIBUTE_LIGHT + ATTRIBUTE_DARK) and c:IsAbleToRemoveAsCost()
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.costfilter, tp, LOCATION_GRAVE, 0, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
  	local g = Duel.SelectMatchingCard(tp, s.costfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil)
  	Duel.Remove(g, POS_FACEUP, REASON_COST)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if not c:IsRelateToEffect(e) then
  		return
  	end
  	Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP)
  end
  function s.tdcon(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return rp == 1 - tp and c:IsPreviousControler(tp)
  end
  function s.tdfilter(c)
  	return c:IsType(TYPE_FIELD) and c:IsFaceup() and c:IsAbleToDeck()
  end
  function s.tdtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tdfilter, tp, LOCATION_GRAVE + LOCATION_REMOVED, 0, 1, nil)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, nil, 2, tp, LOCATION_GRAVE + LOCATION_REMOVED)
  end
  function s.tdop(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local tg = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.tdfilter), tp, LOCATION_GRAVE + LOCATION_REMOVED, 0, 1, 2, nil)
  	if tg:GetCount() > 0 then
  		Duel.SendtoDeck(tg, nil, SEQ_DECKSHUFFLE, REASON_EFFECT)
  		tg = tg:Filter(Card.IsLocation, nil, LOCATION_DECK)
  		tg = tg - tg:Filter(Card.IsReason, nil, REASON_REDIRECT)
  		if #tg > 0 and Duel.GetMatchingGroupCount(nil, tp, 0, LOCATION_ONFIELD, nil) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 0)) then
  			Duel.BreakEffect()
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  			local dg = Duel.SelectMatchingCard(tp, nil, tp, 0, LOCATION_ONFIELD, 1, #tg, nil)
  			Duel.HintSelection(dg)
  			Duel.Destroy(dg, REASON_EFFECT)
  		end
  	end
  end
  
  
source_text: Jungle
  Cannot be Normal Summoned/Set. Must be Special Summoned by card effect. While there are 2 cards in the Field Zones, your opponent cannot target this card with card effects. You can only use each of the following effects of "Jungle Dweller" once per turn. You can banish 1 LIGHT or DARK monster from your GY; Special Summon this card from your hand. If this card in its owner's possession is destroyed by an opponent's card: You can shuffle up to 2 of your Field Spells from your GY or banishment into the Deck, then you can destroy up to that many cards your opponent controls.
target_text: -- Jungle
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--splimit
  	local e0 = Effect.CreateEffect(c)
  	e0:SetType(EFFECT_TYPE_SINGLE)
  	e0:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
  	e0:SetCode(EFFECT_SPSUMMON_CONDITION)
  	e0:SetValue(s.splimit)
  	c:RegisterEffect(e0)
  	--cannot be target/effect indestructable
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_SINGLE)
  	e1:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e1:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetCondition(s.dcon)
  	e1:SetValue(aux.tgoval)
  	c:RegisterEffect(e1)
  	--special summon
  	local e2 = Effect.CreateEffect(c)
  	e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_HAND)
  	e2:SetCountLimit(1, id + o)
  	e2:SetCost(s.spcost)
  	e2:SetTarget(s.sptg)
  	e2:SetOperation(s.spop)
  	c:RegisterEffect(e2)
  	--to deck and destroy
  	local e3 = Effect.CreateEffect(c)
  	e3:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
  	e3:SetCategory(CATEGORY_TODECK + CATEGORY_DESTROY)
  	e3:SetCode(EVENT_DESTROYED)
  	e3:SetProperty(EFFECT_FLAG_DELAY)
  	e3:SetRange(LOCATION_MZONE)
  	e3:SetCountLimit(1, id + o * 2)
  	e3:SetCondition(s.tdcon)
  	e3:SetTarget(s.tdtg)
  	e3:SetOperation(s.tdop)
  	c:RegisterEffect(e3)
  end
  function s.splimit(e, se, sp, st)
  	return se:IsHasType(EFFECT_TYPE_ACTIONS)
  end
  function s.dcon(e)
  	return Duel.IsExistingMatchingCard(nil, e:GetHandlerPlayer(), LOCATION_FZONE, LOCATION_FZONE, 2, nil)
  end
  function s.costfilter(c)
  	return c:IsAttribute(ATTRIBUTE_LIGHT + ATTRIBUTE_DARK) and c:IsAbleToRemoveAsCost()
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.costfilter, tp, LOCATION_GRAVE, 0, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_REMOVE)
  	local g = Duel.SelectMatchingCard(tp, s.costfilter, tp, LOCATION_GRAVE, 0, 1, 1, nil)
  	Duel.Remove(g, POS_FACEUP, REASON_COST)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if not c:IsRelateToEffect(e) then
  		return
  	end
  	Duel.SpecialSummon(c, 0, tp, tp, false, false, POS_FACEUP)
  end
  function s.tdcon(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return rp == 1 - tp and c:IsPreviousControler(tp)
  end
  function s.tdfilter(c)
  	return c:IsType(TYPE_FIELD) and c:IsFaceup() and c:IsAbleToDeck()
  end
  function s.tdtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tdfilter, tp, LOCATION_GRAVE + LOCATION_REMOVED, 0, 1, nil)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, nil, 2, tp, LOCATION_GRAVE + LOCATION_REMOVED)
  end
  function s.tdop(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local tg = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.tdfilter), tp, LOCATION_GRAVE + LOCATION_REMOVED, 0, 1, 2, nil)
  	if tg:GetCount() > 0 then
  		Duel.SendtoDeck(tg, nil, SEQ_DECKSHUFFLE, REASON_EFFECT)
  		tg = tg:Filter(Card.IsLocation, nil, LOCATION_DECK)
  		tg = tg - tg:Filter(Card.IsReason, nil, REASON_REDIRECT)
  		if #tg > 0 and Duel.GetMatchingGroupCount(nil, tp, 0, LOCATION_ONFIELD, nil) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 0)) then
  			Duel.BreakEffect()
  			Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_DESTROY)
  			local dg = Duel.SelectMatchingCard(tp, nil, tp, 0, LOCATION_ONFIELD, 1, #tg, nil)
  			Duel.HintSelection(dg)
  			Duel.Destroy(dg, REASON_EFFECT)
  		end
  	end
  end
  
  