name: Dipsea
card_text: You can discard 1 card, then declare 1 Attribute, except WATER; Special Summon this card from your hand to either field, then this card becomes that Attribute (until the end of this turn), then if you Special Summoned this card to your opponent's field, you can Special Summon 1 Level 4 or lower Fiend monster with an original Attribute other than the declared one, from your hand or GY to your field, also for the rest of this turn, you cannot Special Summon from the Extra Deck, except Fiend monsters. You can only use this effect of "Dipsea Fiend" once per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--special summon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e1:SetType(EFFECT_TYPE_IGNITION)
  	e1:SetRange(LOCATION_HAND)
  	e1:SetCountLimit(1, id)
  	e1:SetCost(s.spcost)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(Card.IsDiscardable, tp, LOCATION_HAND, 0, 1, e:GetHandler())
  	end
  	Duel.DiscardHand(tp, Card.IsDiscardable, 1, 1, REASON_COST + REASON_DISCARD, 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)
  			or Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP, 1 - tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATTRIBUTE)
  	local att = Duel.AnnounceAttribute(tp, 1, ATTRIBUTE_ALL & ~ATTRIBUTE_WATER)
  	e:SetLabel(att)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spfilter(c, e, tp, att)
  	return c:IsRace(RACE_FIEND) and c:IsLevelBelow(4) and c:GetOriginalAttribute() ~= att and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if not c:IsRelateToEffect(e) then
  		return
  	end
  	local b1 = Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	local b2 = Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP, 1 - tp)
  	local op = -1
  	if b1 and b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 1), aux.Stringid(id, 2))
  	elseif b1 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 1))
  	elseif b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2)) + 1
  	else
  		Duel.SendtoGrave(c, REASON_RULE)
  	end
  	local sp = nil
  	if op == 0 then
  		sp = Duel.SpecialSummonStep(c, 0, tp, tp, false, false, POS_FACEUP)
  	elseif op == 1 then
  		sp = Duel.SpecialSummonStep(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  	local att = e:GetLabel()
  	if sp ~= nil then
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CHANGE_ATTRIBUTE)
  		e1:SetValue(att)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD + RESET_DISABLE + RESET_PHASE + PHASE_END)
  		c:RegisterEffect(e1)
  	end
  	if op >= 0 then
  		Duel.SpecialSummonComplete()
  	end
  	if
  		op == 1
  		and Duel.GetMZoneCount(tp, e:GetHandler()) > 0
  		and Duel.IsExistingMatchingCard(aux.NecroValleyFilter(s.spfilter), tp, LOCATION_HAND + LOCATION_GRAVE, 0, 1, nil, e, tp, att)
  		and Duel.SelectYesNo(tp, aux.Stringid(id, 3))
  	then
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  		local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, LOCATION_HAND + LOCATION_GRAVE, 0, 1, 1, nil, e, tp, att)
  		if g:GetCount() > 0 then
  			Duel.BreakEffect()
  			Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP)
  		end
  	end
  	local e1 = Effect.CreateEffect(e:GetHandler())
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
  	e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
  	e1:SetTargetRange(1, 0)
  	e1:SetTarget(s.splimit)
  	e1:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e1, tp)
  end
  function s.splimit(e, c)
  	return not c:IsRace(RACE_FIEND) and c:IsLocation(LOCATION_EXTRA)
  end
  
  
source_text: Dipsea
  You can discard 1 card, then declare 1 Attribute, except WATER; Special Summon this card from your hand to either field, then this card becomes that Attribute (until the end of this turn), then if you Special Summoned this card to your opponent's field, you can Special Summon 1 Level 4 or lower Fiend monster with an original Attribute other than the declared one, from your hand or GY to your field, also for the rest of this turn, you cannot Special Summon from the Extra Deck, except Fiend monsters. You can only use this effect of "Dipsea Fiend" once per turn.
target_text: -- Dipsea
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--special summon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON + CATEGORY_GRAVE_SPSUMMON)
  	e1:SetType(EFFECT_TYPE_IGNITION)
  	e1:SetRange(LOCATION_HAND)
  	e1:SetCountLimit(1, id)
  	e1:SetCost(s.spcost)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(Card.IsDiscardable, tp, LOCATION_HAND, 0, 1, e:GetHandler())
  	end
  	Duel.DiscardHand(tp, Card.IsDiscardable, 1, 1, REASON_COST + REASON_DISCARD, 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)
  			or Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP, 1 - tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATTRIBUTE)
  	local att = Duel.AnnounceAttribute(tp, 1, ATTRIBUTE_ALL & ~ATTRIBUTE_WATER)
  	e:SetLabel(att)
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spfilter(c, e, tp, att)
  	return c:IsRace(RACE_FIEND) and c:IsLevelBelow(4) and c:GetOriginalAttribute() ~= att and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if not c:IsRelateToEffect(e) then
  		return
  	end
  	local b1 = Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	local b2 = Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false, POS_FACEUP, 1 - tp)
  	local op = -1
  	if b1 and b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 1), aux.Stringid(id, 2))
  	elseif b1 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 1))
  	elseif b2 then
  		op = Duel.SelectOption(tp, aux.Stringid(id, 2)) + 1
  	else
  		Duel.SendtoGrave(c, REASON_RULE)
  	end
  	local sp = nil
  	if op == 0 then
  		sp = Duel.SpecialSummonStep(c, 0, tp, tp, false, false, POS_FACEUP)
  	elseif op == 1 then
  		sp = Duel.SpecialSummonStep(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  	local att = e:GetLabel()
  	if sp ~= nil then
  		local e1 = Effect.CreateEffect(c)
  		e1:SetType(EFFECT_TYPE_SINGLE)
  		e1:SetCode(EFFECT_CHANGE_ATTRIBUTE)
  		e1:SetValue(att)
  		e1:SetReset(RESET_EVENT + RESETS_STANDARD + RESET_DISABLE + RESET_PHASE + PHASE_END)
  		c:RegisterEffect(e1)
  	end
  	if op >= 0 then
  		Duel.SpecialSummonComplete()
  	end
  	if
  		op == 1
  		and Duel.GetMZoneCount(tp, e:GetHandler()) > 0
  		and Duel.IsExistingMatchingCard(aux.NecroValleyFilter(s.spfilter), tp, LOCATION_HAND + LOCATION_GRAVE, 0, 1, nil, e, tp, att)
  		and Duel.SelectYesNo(tp, aux.Stringid(id, 3))
  	then
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
  		local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.spfilter), tp, LOCATION_HAND + LOCATION_GRAVE, 0, 1, 1, nil, e, tp, att)
  		if g:GetCount() > 0 then
  			Duel.BreakEffect()
  			Duel.SpecialSummon(g, 0, tp, tp, false, false, POS_FACEUP)
  		end
  	end
  	local e1 = Effect.CreateEffect(e:GetHandler())
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
  	e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
  	e1:SetTargetRange(1, 0)
  	e1:SetTarget(s.splimit)
  	e1:SetReset(RESET_PHASE + PHASE_END)
  	Duel.RegisterEffect(e1, tp)
  end
  function s.splimit(e, c)
  	return not c:IsRace(RACE_FIEND) and c:IsLocation(LOCATION_EXTRA)
  end
  
  