mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2024-11-16 07:40:20 +01:00
6564d40b85
Move grid management functions out of polygons.lua, in a new file called gridmanager.lua Explicitly call other files and grid management functions from init.lua to make workflow more apparent Move mapgen loop out of init.lua, into mapgen.lua
113 lines
2.2 KiB
Lua
113 lines
2.2 KiB
Lua
local worldpath = mapgen_rivers.world_data_path
|
|
|
|
local floor = math.floor
|
|
local sbyte, schar = string.byte, string.char
|
|
local unpk = unpack
|
|
|
|
-- Loading files
|
|
local function load_full_map(filename, bytes, signed, size, converter)
|
|
local file = io.open(worldpath .. filename, 'rb')
|
|
local data = file:read('*all')
|
|
if #data < bytes*size then
|
|
data = minetest.decompress(data)
|
|
end
|
|
|
|
local map = {}
|
|
|
|
for i=1, size do
|
|
local i0 = (i-1)*bytes+1
|
|
local elements = {data:byte(i0, i1)}
|
|
local n = sbyte(data, i0)
|
|
if signed and n >= 128 then
|
|
n = n - 256
|
|
end
|
|
|
|
for j=1, bytes-1 do
|
|
n = n*256 + sbyte(data, i0+j)
|
|
end
|
|
|
|
map[i] = n
|
|
end
|
|
file:close()
|
|
|
|
if converter then
|
|
for i=1, size do
|
|
map[i] = converter(map[i])
|
|
end
|
|
end
|
|
|
|
return map
|
|
end
|
|
|
|
local loader_mt = {
|
|
__index = function(loader, i)
|
|
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
|
|
loader[i] = n
|
|
return n
|
|
end,
|
|
}
|
|
|
|
local function interactive_loader(filename, bytes, signed, size, converter)
|
|
local file = io.open(worldpath .. 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
|
|
|
|
local load_methods = {
|
|
full = load_full_map,
|
|
interactive = interactive_loader,
|
|
}
|
|
|
|
function mapgen_rivers.load_file(...)
|
|
local load_method = mapgen_rivers.settings.load_method
|
|
local load_func = load_methods[load_method]
|
|
if load_func then
|
|
return load_func(...)
|
|
else
|
|
minetest.log("error", ("[mapgen_rivers] Unknown load method %s"):format(load_method))
|
|
end
|
|
end
|
|
|
|
-- Writing files
|
|
function mapgen_rivers.write_file(filename, data, bytes)
|
|
local size = #data
|
|
local file = io.open(worldpath .. filename, 'wb')
|
|
|
|
local bytelist = {}
|
|
for j=1, bytes do
|
|
bytelist[j] = 0
|
|
end
|
|
|
|
for i=1, size do
|
|
local n = floor(data[i])
|
|
data[i] = n
|
|
for j=bytes, 2, -1 do
|
|
bytelist[j] = n % 256
|
|
n = floor(n / 256)
|
|
end
|
|
bytelist[1] = n % 256
|
|
|
|
file:write(schar(unpk(bytelist)))
|
|
end
|
|
|
|
file:close()
|
|
end
|