diff --git a/compatibility.lua b/compatibility.lua index 8ca18b5..fcf4660 100644 --- a/compatibility.lua +++ b/compatibility.lua @@ -1,3 +1,21 @@ +local function version_is_lower(v1, v2) + local d1, c1, d2, c2 + while #v1 > 0 and #v2 > 0 do + d1, c1, v1 = v1:match("^(%d*)(%D*)(.*)$") + d2, c2, v2 = v2:match("^(%d*)(%D*)(.*)$") + + d1 = tonumber(d1) or -1 + d2 = tonumber(d2) or -1 + if d1 ~= d2 then + return d1 < d2 + end + if c1 ~= c2 then + return c1 < c2 + end + end + return false +end + local function fix_min_catchment(settings, is_global) local prefix = is_global and "mapgen_rivers_" or "" @@ -21,6 +39,18 @@ local function fix_compatibility_minetest(settings) if previous_version == "0.0" then fix_min_catchment(settings, true) end + + if version_is_lower(previous_version, "1.0.2-dev1") then + local blocksize = tonumber(settings:get("mapgen_rivers_blocksize") or 15) + local grid_x_size = tonumber(settings:get("mapgen_rivers_grid_x_size")) + if grid_x_size then + settings:set("mapgen_rivers_map_x_size", tostring(grid_x_size * blocksize)) + end + local grid_z_size = tonumber(settings:get("mapgen_rivers_grid_z_size")) + if grid_z_size then + settings:set("mapgen_rivers_map_z_size", tostring(grid_z_size * blocksize)) + end + end end local function fix_compatibility_mapgen_rivers(settings) @@ -29,6 +59,18 @@ local function fix_compatibility_mapgen_rivers(settings) if previous_version == "0.0" then fix_min_catchment(settings, false) end + + if version_is_lower(previous_version, "1.0.2-dev1") then + local blocksize = tonumber(settings:get("blocksize") or 15) + local grid_x_size = tonumber(settings:get("grid_x_size")) + if grid_x_size then + settings:set("map_x_size", tostring(grid_x_size * blocksize)) + end + local grid_z_size = tonumber(settings:get("grid_z_size")) + if grid_z_size then + settings:set("map_z_size", tostring(grid_z_size * blocksize)) + end + end end return fix_compatibility_minetest, fix_compatibility_mapgen_rivers diff --git a/polygons.lua b/polygons.lua index c531b2b..d905663 100644 --- a/polygons.lua +++ b/polygons.lua @@ -11,8 +11,9 @@ dofile(modpath .. 'load.lua') mapgen_rivers.grid = {} -local X = mapgen_rivers.settings.grid_x_size -local Z = mapgen_rivers.settings.grid_z_size +local blocksize = mapgen_rivers.settings.blocksize +local X = math.floor(mapgen_rivers.settings.map_x_size / blocksize) +local Z = math.floor(mapgen_rivers.settings.map_z_size / blocksize) local function offset_converter(o) return (o + 0.5) * (1/256) @@ -80,7 +81,6 @@ local function index(x, z) return z*X+x+1 end -local blocksize = mapgen_rivers.settings.blocksize local min_catchment = mapgen_rivers.settings.min_catchment local max_catchment = mapgen_rivers.settings.max_catchment diff --git a/pregenerate.lua b/pregenerate.lua index 7e97e48..0797dc1 100644 --- a/pregenerate.lua +++ b/pregenerate.lua @@ -18,6 +18,10 @@ local function pregenerate(keep_loaded) local grid = mapgen_rivers.grid local size = grid.size + if size.x * size.y > 4e6 then + minetest.log("warning", "[mapgen_rivers] You are going to generate a very large grid (>4M nodes). If you experience problems, you should increase blocksize or reduce map size.") + end + local seed = tonumber(minetest.get_mapgen_setting("seed")) np_base.seed = (np_base.seed or 0) + seed diff --git a/settings.lua b/settings.lua index 2d64a40..a7aee00 100644 --- a/settings.lua +++ b/settings.lua @@ -1,7 +1,7 @@ local mtsettings = minetest.settings local mgrsettings = Settings(minetest.get_worldpath() .. '/mapgen_rivers.conf') -mapgen_rivers.version = "1.0.2" +mapgen_rivers.version = "1.0.2-dev1" local previous_version_mt = mtsettings:get("mapgen_rivers_version") or "0.0" local previous_version_mgr = mgrsettings:get("version") or "0.0" @@ -93,8 +93,8 @@ mapgen_rivers.settings = { glacier_factor = def_setting('glacier_factor', 'number'), elevation_chill = def_setting('elevation_chill', 'number'), - grid_x_size = def_setting('grid_x_size', 'number'), - grid_z_size = def_setting('grid_z_size', 'number'), + map_x_size = def_setting('map_x_size', 'number'), + map_z_size = def_setting('map_z_size', 'number'), evol_params = { K = def_setting('river_erosion_coef', 'number'), m = def_setting('river_erosion_power', 'number'), diff --git a/settings_default.json b/settings_default.json index 15d32d1..0105832 100644 --- a/settings_default.json +++ b/settings_default.json @@ -13,8 +13,8 @@ "glacier_factor": 8, "elevation_chill": 0.25, - "grid_x_size": 1000, - "grid_z_size": 1000, + "map_x_size": 15000, + "map_z_size": 15000, "river_erosion_coef": 0.5, "river_erosion_power": 0.4, "diffusive_erosion": 0.5, diff --git a/settingtypes.txt b/settingtypes.txt index 455a6b0..6446541 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -3,19 +3,25 @@ # Whether the map should be centered at x=0, z=0. mapgen_rivers_center (Center map) bool true -# Represents horizontal map scale. Every cell of the grid will be upscaled to -# a square of this size. -# For example if the grid size is 1000x1000 and block size is 12, -# the actual size of the map will be 12000. +# Every cell of the river grid will represent a square of this size. +# A lower value will result in more detailed terrain and finer computation +# of rivers, but will be slower to generate and use more resources. +# +# WARNING: Excessively low values may cause crashes at pre-generation, due to +# memory issues mapgen_rivers_blocksize (Block size) float 15.0 2.0 100.0 -# X size of the grid being generated -# Actual size of the map is grid_x_size * blocksize -mapgen_rivers_grid_x_size (Grid X size) int 1000 50 5000 +# X size of the map being generated +# +# X size of the river grid will be this/blocksize +# When increasing, it is recommended to increase blocksize too +mapgen_rivers_map_x_size (Map X size) int 15000 500 66000 -# Z size of the grid being generated -# Actual size of the map is grid_z_size * blocksize -mapgen_rivers_grid_z_size (Grid Z size) int 1000 50 5000 +# Z size of the map being generated +# +# Z size of the river grid will be this/blocksize +# When increasing, it is recommended to increase blocksize too +mapgen_rivers_map_z_size (Map Z size) int 15000 500 66000 # Minimal catchment area for a river to be drawn, in square nodes # Lower value means bigger river density