-- DISABLE WATER IN INGAME MAP GEN SETTINGS FOR BEST LOOKS
--[[
>>>eNpjYBBi4GVgZACCBnsQycOXmJeemlOsm5ZZXFxalMrA4OAAk
XOwF4JK5SWWlBYl5uimJxYjS3NDpfOLUg1xiBvhEDfGIW6CQ9wUh
7gZsjhLcn5iDrIAZ3JRaUqqbn4miihXal5qbqVuUmIx0LMHgMIMY
CnWkqLU1GKIIihmPLlZi7mhRY4BhP/XMyj8/w/CQNYDoC4QZmBsA
JoBVAkUgwHW5JzMtDQGBgVHIHYCGcTIyFgtss79YdUUe0aIGj0HK
OMDVORAEkzEE8bwc8AppQJjmMAYF+wZjcHgMxIDYmkJ0AqoKg4HB
AMi2QKSZGTsfbt1wfdjF+wY/6z8eMk3KcGe0dBV5N0Ho3V2QEkBk
D+Z4MSsmSCwE+YVBpiZD+yhUjftGc+eAYE39oysIB0iIEJBBkgEu
AEJAT4gsaAHJgbRbQczRsSBMQ0MvsF88hjGuGyP7g9gQNiADJcDE
SdABNhCuMsYIUyHfgdGB3mYrCRCCVC/EQOyG1IQPjwJs/Ywkv1oD
sGMCGR/oImoOGCJBi6QhSlw4gUz3DXA8LzADuM5zHdgZAYxQKq+A
MUgPEjihRgFoQUcmBkQAJi8BPc6XQMAy367Og==<<<
]]
local get_noise = require 'utils.math.get_noise'
local math_random = math.random
local math_floor = math.floor
local math_abs = math.abs

local spawn_size = 160
local spawn_check = spawn_size + 96

local waters = { 'deepwater', 'water' }

local function is_water(position, noise, seed)
    if math_abs(position.y) <= spawn_check or math_abs(position.x) <= spawn_check then
        local border_noise = get_noise('cave_ponds', position, seed)
        if math_abs(position.x) + border_noise * 10 < spawn_size and math_abs(position.y) + border_noise * 10 < spawn_size then
            return false
        end
        if math_abs(position.x) + border_noise * 10 < spawn_size + 32 and math_abs(position.y) + border_noise * 10 < spawn_size + 32 then
            return true
        end
    end
    if math_abs(noise) < 0.15 then
        return
    end
    if math_abs(noise) > 0.80 then
        return
    end
    return true
end

local function on_chunk_generated(event)
    local surface = event.surface
    local seed = surface.map_gen_settings.seed
    local left_top_x = event.area.left_top.x
    local left_top_y = event.area.left_top.y
    local set_tiles = surface.set_tiles
    local get_tile = surface.get_tile
    local position
    local noise

    for x = 0, 31, 1 do
        for y = 0, 31, 1 do
            position = { x = left_top_x + x, y = left_top_y + y }
            if not get_tile(position).collides_with('resource') then
                noise = get_noise('watery_world', position, seed)
                if is_water(position, noise, seed) then
                    set_tiles({ { name = waters[math_floor(noise * 10 % 2 + 1)], position = position } }, true)
                    if math_random(1, 128) == 1 then
                        surface.create_entity({ name = storage.watery_world_fishes[math_random(1, #storage.watery_world_fishes)], position = position })
                    end
                end
            end
        end
    end
end

local function on_init()
    storage.watery_world_fishes = {}
    for _, prototype in pairs(prototypes.entity) do
        if prototype.type == 'fish' then
            table.insert(storage.watery_world_fishes, prototype.name)
        end
    end
end

local Event = require 'utils.event'
Event.on_init(on_init)
Event.add(defines.events.on_chunk_generated, on_chunk_generated)
