mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2024-11-15 07:10:22 +01:00
101 lines
2.1 KiB
Lua
101 lines
2.1 KiB
Lua
|
local worldpath = mapgen_rivers.world_data_path
|
||
|
|
||
|
local floor = math.floor
|
||
|
local sbyte = string.byte
|
||
|
local unpk = unpack
|
||
|
|
||
|
local load_map
|
||
|
|
||
|
if mapgen_rivers.use_interactive_loader then
|
||
|
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,
|
||
|
}
|
||
|
|
||
|
load_map = function(filename, bytes, signed, size, converter)
|
||
|
local file = io.open(worldpath .. filename, 'rb')
|
||
|
if file then
|
||
|
minetest.register_on_shutdown(function()
|
||
|
file:close()
|
||
|
end)
|
||
|
converter = converter or false
|
||
|
return setmetatable({file=file, bytes=bytes, signed=signed, size=size, conv=converter}, loader_mt)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
else
|
||
|
|
||
|
load_map = function(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
|
||
|
end
|
||
|
|
||
|
local sfile = io.open(world_data_path..'size', 'r')
|
||
|
assert(sfile)
|
||
|
local X, Z = tonumber(sfile:read('*l')), tonumber(sfile:read('*l'))
|
||
|
sfile:close()
|
||
|
|
||
|
local function offset_converter(o)
|
||
|
return (o + 0.5) * (1/256)
|
||
|
end
|
||
|
|
||
|
mapgen_rivers.grid = {
|
||
|
size = {x=X, y=Z},
|
||
|
dem = load_map('dem', 2, true X*Z),
|
||
|
lakes = load_map('lakes', 2, true, X*Z),
|
||
|
dirs = load_map('dirs', 1, false, X*Z),
|
||
|
rivers = load_map('rivers', 4, false, X*Z),
|
||
|
|
||
|
offset_x = load_map('offset_x', 1, true, X*Z, offset_converter),
|
||
|
offset_y = load_map('offset_y', 1, true, X*Z, offset_converter);
|
||
|
}
|