Generate a YGOPro Lua script for the following Yu-Gi-Oh card effect:
If this card is used for the Xyz Summon of a "Number" monster, it can be treated as a Level 3 or 4 monster. If all monsters you control are WATER (min. 1): You can Special Summon this card from your hand, and if you do, add 1 Level 3, 4, or 5 Fish monster from your Deck to your hand, except "Abyss Shark". For the rest of this turn, you cannot Special Summon monsters, except WATER monsters, also, double the first battle damage inflicted to your opponent this turn by your "Number" monster battling another monster. You can only use this effect of "Abyss Shark" once per turn.
--アビス・シャーク
--Abyss Shark
--Scripted by The Razgriz
local s,id=GetID()
function s.initial_effect(c)
	--Special Summon itself and search
	local e1=Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id,0))
	e1:SetCategory(CATEGORY_SPECIAL_SUMMON+CATEGORY_TOHAND+CATEGORY_SEARCH)
	e1:SetType(EFFECT_TYPE_IGNITION)
	e1:SetRange(LOCATION_HAND)
	e1:SetCountLimit(1,id)
	e1:SetCondition(s.spcon)
	e1:SetTarget(s.sptg)
	e1:SetOperation(s.spop)
	c:RegisterEffect(e1)
	--Can be treated as Level 3 or 4 for a "Number" Xyz
	local e2=Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_SINGLE)
	e2:SetCode(EFFECT_XYZ_LEVEL)
	e2:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
	e2:SetRange(LOCATION_MZONE)
	e2:SetValue(s.xyzlv)
	c:RegisterEffect(e2)
end
s.listed_names={id}
s.listed_series={SET_NUMBER}
function s.cfilter(c)
	return not (c:IsFaceup() and c:IsAttribute(ATTRIBUTE_WATER))
end
function s.spcon(e,tp,eg,ep,ev,re,r,rp)
	local g=Duel.GetFieldGroup(tp,LOCATION_MZONE,0)
	return #g>0 and not g:IsExists(s.cfilter,1,nil)
end
function s.thfilter(c)
	return c:IsRace(RACE_FISH) and c:IsLevel(3,4,5) and not c:IsCode(id) and c:IsAbleToHand()
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)
		and Duel.IsExistingMatchingCard(s.thfilter,tp,LOCATION_DECK,0,1,nil) end
	Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,c,1,tp,LOCATION_HAND)
	Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
end
function s.spop(e,tp,eg,ep,ev,re,r,rp)
	local c=e:GetHandler()
	 --Cannot Special Summon, except WATER monsters
	local e1=Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(id,1))
	e1:SetType(EFFECT_TYPE_FIELD)
	e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET+EFFECT_FLAG_CLIENT_HINT)
	e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
	e1:SetTargetRange(1,0)
	e1:SetTarget(s.splimit)
	e1:SetReset(RESET_PHASE|PHASE_END)
	Duel.RegisterEffect(e1,tp)
	--Next battle damage your opponent takes from your "Number" monster is doubled
	local e2=Effect.CreateEffect(c)
	e2:SetType(EFFECT_TYPE_FIELD)
	e2:SetCode(EFFECT_CHANGE_BATTLE_DAMAGE)
	e2:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
	e2:SetTargetRange(0,1)
	e2:SetCondition(s.damcon)
	e2:SetValue(DOUBLE_DAMAGE)
	e2:SetReset(RESET_PHASE|PHASE_END)
	Duel.RegisterEffect(e2,tp)
	if not c:IsRelateToEffect(e) or Duel.GetLocationCount(tp,LOCATION_MZONE)<=0 then return end
	if Duel.SpecialSummon(c,0,tp,tp,false,false,POS_FACEUP)>0 then
		Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_ATOHAND)
		local sc=Duel.SelectMatchingCard(tp,s.thfilter,tp,LOCATION_DECK,0,1,1,nil)
		if #sc>0 and Duel.SendtoHand(sc,tp,REASON_EFFECT)>0 then
			Duel.ConfirmCards(1-tp,sc)
		end
	end
end
function s.splimit(e,c,sump,sumtype,sumpos,targetp,se)
	return not c:IsAttribute(ATTRIBUTE_WATER)
end
function s.damcon(e)
	local tp=e:GetHandlerPlayer()
	local bc0,bc1=Duel.GetBattleMonster(tp)
	if Duel.GetFlagEffect(tp,id)==0 and bc0 and bc1 and bc0:IsSetCard(SET_NUMBER) and bc0:IsStatus(STATUS_OPPO_BATTLE) then
		Duel.RegisterFlagEffect(tp,id,RESET_PHASE|PHASE_END,0,1)
		return true
	end
	return false
end
function s.xyzlv(e,c,rc)
	if rc:IsSetCard(SET_NUMBER) then
		return 4,3,e:GetHandler():GetLevel()
	else
		return e:GetHandler():GetLevel()
	end
end