mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2025-07-08 03:10:38 +02:00
Re-organize grid management code for less dependance between files
Remove gridio.lua and move its function to appropriate files
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
-- Manages grid loading, writing and generation
|
||||
|
||||
local world_data = mapgen_rivers.world_data_path
|
||||
local datapath = mapgen_rivers.world_data_path
|
||||
|
||||
local registered_on_grid_loaded = {}
|
||||
function mapgen_rivers.register_on_grid_loaded(func)
|
||||
@ -21,31 +21,64 @@ local function offset_conv(o)
|
||||
return (o + 0.5) * (1/256)
|
||||
end
|
||||
|
||||
local grid_maps_list = {
|
||||
dem = {bytes=2, signed=true},
|
||||
lakes = {bytes=2, signed=true},
|
||||
dirs = {bytes=1, signed=false},
|
||||
rivers = {bytes=4, signed=false},
|
||||
local floor = math.floor
|
||||
local sbyte, schar = string.byte, string.char
|
||||
local unpk = unpack
|
||||
|
||||
offset_x = {bytes=1, signed=true, conv=offset_conv},
|
||||
offset_y = {bytes=1, signed=true, conv=offset_conv},
|
||||
-- Loading files
|
||||
|
||||
-- Never load the full map during mapgen. Instead, create an empty lookup table
|
||||
-- and read the file on-the-fly when an element is requested for the first time,
|
||||
-- using __index metamethod.
|
||||
local loader_mt = {
|
||||
__index = function(loader, i) -- Called when accessing a missing key
|
||||
local file = loader.file
|
||||
local bytes = loader.bytes
|
||||
file:seek('set', (i-1)*bytes)
|
||||
local strnum = file:read(bytes)
|
||||
|
||||
local n = sbyte(strnum, 1)
|
||||
if loader.signed and n >= 128 then
|
||||
n = n - 256
|
||||
end
|
||||
|
||||
for j=2, bytes do
|
||||
n = n*256 + sbyte(strnum, j)
|
||||
end
|
||||
|
||||
if loader.conv then
|
||||
n = loader.conv(n)
|
||||
end
|
||||
-- Cache key for next use
|
||||
loader[i] = n
|
||||
return n
|
||||
end,
|
||||
}
|
||||
|
||||
function mapgen_rivers.try_load_grid(grid)
|
||||
local function load_file(filename, bytes, signed, size, converter)
|
||||
local file = io.open(datapath .. filename, 'rb')
|
||||
if file then
|
||||
converter = converter or false
|
||||
return setmetatable({file=file, bytes=bytes, signed=signed, size=size, conv=converter}, loader_mt)
|
||||
end
|
||||
end
|
||||
|
||||
function mapgen_rivers.load_or_generate_grid()
|
||||
-- First, check whether a grid is already loaded
|
||||
if mapgen_rivers.grid then
|
||||
return true
|
||||
-- Then, check the provided argument is a valid grid
|
||||
elseif grid then
|
||||
mapgen_rivers.grid = grid
|
||||
on_grid_loaded_callback(grid)
|
||||
return true
|
||||
end
|
||||
|
||||
-- Fall back to loading the grid from the files
|
||||
local sfile = io.open(world_data .. 'size', 'r')
|
||||
-- If not, try to load the grid from the files
|
||||
local sfile = io.open(datapath .. 'size', 'r')
|
||||
if not sfile then
|
||||
return false
|
||||
dofile(mapgen_rivers.modpath .. "/pregenerate.lua")
|
||||
collectgarbage()
|
||||
|
||||
sfile = io.open(datapath .. 'size', 'r')
|
||||
if not sfile then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local x, z = sfile:read('*n'), sfile:read('*n')
|
||||
@ -55,31 +88,18 @@ function mapgen_rivers.try_load_grid(grid)
|
||||
|
||||
minetest.log("action", '[mapgen_rivers] Loading grid')
|
||||
|
||||
grid = {
|
||||
local grid = {
|
||||
size = {x=x, y=z},
|
||||
dem = load_file('dem', 2, true, x*z),
|
||||
lakes = load_file('lakes', 2, true, x*z),
|
||||
dirs = load_file('dirs', 1, false, x*z),
|
||||
rivers = load_file('rivers', 4, false, x*z),
|
||||
offset_x = load_file('offset_x', 1, true, x*z, offset_conv),
|
||||
offset_y = load_file('offset_y', 1, true, x*z, offset_conv),
|
||||
}
|
||||
|
||||
for map, params in pairs(grid_maps_list) do
|
||||
grid[map] = mapgen_rivers.load_file(map, params.bytes, params.signed, x*z, params.conv)
|
||||
end
|
||||
|
||||
mapgen_rivers.grid = grid
|
||||
on_grid_loaded_callback(grid)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function mapgen_rivers.write_grid(grid)
|
||||
minetest.mkdir(world_data)
|
||||
|
||||
for map, params in pairs(grid_maps_list) do
|
||||
mapgen_rivers.write_file(map, grid[map], params.bytes)
|
||||
end
|
||||
|
||||
local sfile = io.open(world_data .. 'size', "w")
|
||||
sfile:write(grid.size.x..'\n'..grid.size.y)
|
||||
sfile:close()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user