1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-06 00:23:49 +02:00
ComfyFactorio/modules/dynamic_landfill.lua
2021-03-24 20:14:55 +01:00

135 lines
4.1 KiB
Lua

-- changes placed landfill tiles, adapting the new tile to adjecant tiles -- by mewmew
local regenerate_decoratives_value = true
local Event = require 'utils.event'
local math_random = math.random
local table_insert = table.insert
local water_tile_whitelist = {
['water'] = true,
['deepwater'] = true,
['water-green'] = true,
['water-mud'] = true,
['water-shallow'] = true,
['deepwater-green'] = true
}
local spiral_coords = {}
for r = 1, 96, 1 do
for x = r * -1, r - 1, 1 do
table_insert(spiral_coords, {x = x, y = r * -1})
end
for y = r * -1, r - 1, 1 do
table_insert(spiral_coords, {x = r, y = y})
end
for x = r, r * -1 + 1, -1 do
table_insert(spiral_coords, {x = x, y = r})
end
for y = r, r * -1 + 1, -1 do
table_insert(spiral_coords, {x = r * -1, y = y})
end
end
local function get_chunk_position(position)
local chunk_position = {}
position.x = math.floor(position.x, 0)
position.y = math.floor(position.y, 0)
for x = 0, 31, 1 do
if (position.x - x) % 32 == 0 then
chunk_position.x = (position.x - x) / 32
end
end
for y = 0, 31, 1 do
if (position.y - y) % 32 == 0 then
chunk_position.y = (position.y - y) / 32
end
end
return chunk_position
end
local function regenerate_decoratives(surface, position)
local chunk = get_chunk_position(position)
if not chunk then
return
end
surface.destroy_decoratives({area = {{chunk.x * 32, chunk.y * 32}, {chunk.x * 32 + 32, chunk.y * 32 + 32}}})
local decorative_names = {}
for k, v in pairs(game.decorative_prototypes) do
if v.autoplace_specification then
decorative_names[#decorative_names + 1] = k
end
end
surface.regenerate_decorative(decorative_names, {chunk})
end
local function is_this_a_valid_source_tile(pos, tiles)
for _, tile in pairs(tiles) do
if tile.position.x == pos.x and tile.position.y == pos.y then
return false
end
end
return true
end
local function place_fitting_tile(position, surface, tiles_placed)
for _, coord in pairs(spiral_coords) do
local tile = surface.get_tile({position.x + coord.x, position.y + coord.y})
if not tile.collides_with('player-layer') then
local valid_source_tile = is_this_a_valid_source_tile(tile.position, tiles_placed)
if tile.name == 'out-of-map' then
valid_source_tile = false
end
if valid_source_tile then
if tile.hidden_tile then
surface.set_tiles({{name = tile.hidden_tile, position = position}}, true)
else
surface.set_tiles({{name = tile.name, position = position}}, true)
end
return
end
end
end
end
local function on_player_built_tile(event)
if not event.item then
return
end
if event.item.name ~= 'landfill' then
return
end
local surface = game.surfaces[event.surface_index]
for _, placed_tile in pairs(event.tiles) do
if water_tile_whitelist[placed_tile.old_tile.name] then
place_fitting_tile(placed_tile.position, surface, event.tiles)
if regenerate_decoratives_value then
if math_random(1, 5) == 1 then
regenerate_decoratives(surface, placed_tile.position)
end
end
end
end
end
local function on_robot_built_tile(event)
if event.item.name ~= 'landfill' then
return
end
local surface = event.robot.surface
for _, placed_tile in pairs(event.tiles) do
if water_tile_whitelist[placed_tile.old_tile.name] then
place_fitting_tile(placed_tile.position, surface, event.tiles)
if regenerate_decoratives then
if math_random(1, 4) == 1 then
regenerate_decoratives(surface, placed_tile.position)
end
end
end
end
end
Event.add(defines.events.on_player_built_tile, on_player_built_tile)
Event.add(defines.events.on_robot_built_tile, on_robot_built_tile)