-- biters will landfill a tile on death within a certain radius

local r = 6
local vectors = {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}}
local math_random = math.random

local function create_particles(surface, position)
    local m = math_random(8, 12)
    local m2 = m * 0.005
    for i = 1, 75, 1 do
        surface.create_entity(
            {
                name = 'stone-particle',
                position = position,
                frame_speed = 0.1,
                vertical_speed = 0.1,
                height = 0.1,
                movement = {m2 - (math_random(0, m) * 0.01), m2 - (math_random(0, m) * 0.01)}
            }
        )
    end
end

local function coord_string(x, y)
    local str = tostring(x) .. '_'
    str = str .. tostring(y)
    return str
end

local function get_replacement_tile(surface, position)
    for _, vector in pairs(vectors) do
        local tile = surface.get_tile({position.x + vector[1], position.y + vector[2]})
        if not tile.collides_with('resource-layer') then
            return tile.name
        end
    end
    return 'grass-1'
end

local function landfill(surface, entity)
    local position = {x = math.floor(entity.position.x), y = math.floor(entity.position.y)}
    local pos_str = coord_string(position.x, position.y)
    if global.biters_landfill_on_death[pos_str] then
        return
    end
    local tiles = surface.find_tiles_filtered({name = {'water', 'deepwater'}, area = {{position.x - r, position.y - r}, {position.x + r, position.y + r}}})
    if #tiles == 0 then
        global.biters_landfill_on_death[pos_str] = true
        return
    end
    local p = tiles[math_random(1, #tiles)].position
    surface.set_tiles({{name = get_replacement_tile(surface, position), position = p}})
    create_particles(entity.surface, {p.x + 0.5, p.y + 0.5})
end

local function on_entity_died(event)
    local entity = event.entity
    if not entity.valid then
        return
    end
    if entity.type ~= 'unit' then
        return
    end
    landfill(entity.surface, entity)
end

local function on_init()
    global.biters_landfill_on_death = {}
end

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