1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/map_gen/maps/danger_ores/modules/terraforming.lua
2021-08-01 14:57:12 +01:00

123 lines
3.6 KiB
Lua

local b = require 'map_gen.shared.builders'
local Generate = require 'map_gen.shared.generate'
local Event = require 'utils.event'
local Global = require 'utils.global'
local RS = require 'map_gen.shared.redmew_surface'
local table = require 'utils.table'
local fast_remove = table.fast_remove
local concat = table.concat
local format = string.format
local rendering = rendering
return function(config)
Generate.enable_register_events = false
local start_size = config.start_size
local outer_bounds = config.bounds or b.full_shape
local pollution_data = {
min_pollution = config.min_pollution or 400,
max_pollution = config.max_pollution or 3500,
pollution_increment = config.pollution_increment or 2.5
}
_G.terraforming_pollution_data = pollution_data
local chunk_list = {index = 1}
local surface
Global.register_init({chunk_list = chunk_list, pollution_data = pollution_data}, function(tbl)
tbl.surface = RS.get_surface()
end, function(tbl)
chunk_list = tbl.chunk_list
pollution_data = tbl.pollution_data
surface = tbl.surface
end)
local bounds = b.rectangle(start_size, start_size)
local function on_chunk(event)
if surface ~= event.surface then
return
end
local left_top = event.area.left_top
local x, y = left_top.x, left_top.y
if bounds(x + 0.5, y + 0.5) then
Generate.do_chunk(event)
else
local tiles = {}
for x1 = x, x + 31 do
for y1 = y, y + 31 do
tiles[#tiles + 1] = {name = 'out-of-map', position = {x1, y1}}
end
end
surface.set_tiles(tiles, true)
if (outer_bounds(x + 0.5, y + 0.5)) then
chunk_list[#chunk_list + 1] = {left_top = left_top, id = nil}
end
end
end
local function on_tick()
local index = chunk_list.index
if index > #chunk_list then
chunk_list.index = 1
return
end
local data = chunk_list[index]
local pos = data.left_top
local x, y = pos.x, pos.y
local pollution = surface.get_pollution(pos)
local current_min_pollution = pollution_data.min_pollution
if pollution > current_min_pollution then
fast_remove(chunk_list, index)
local id = data.id
if id then
rendering.destroy(id)
end
local area = {left_top = pos, right_bottom = {x + 32, y + 32}}
local event = {surface = surface, area = area}
Generate.schedule_chunk(event)
if current_min_pollution < pollution_data.max_pollution then
pollution_data.min_pollution = current_min_pollution + pollution_data.pollution_increment
end
return
else
local text = concat {format('%i', pollution), ' / ', current_min_pollution}
local complete = pollution / current_min_pollution
local color = {r = 1 - complete, g = complete, b = 0}
local id = data.id
if not id then
data.id = rendering.draw_text {
text = text,
surface = surface,
target = {x + 16, y + 16},
color = color,
scale = 5
}
else
rendering.set_text(id, text)
rendering.set_color(id, color)
end
end
chunk_list.index = index + 1
end
Event.add(defines.events.on_chunk_generated, on_chunk)
Event.on_nth_tick(1, on_tick)
end