Add shape registry
parent
fb5e747cfe
commit
e2955959a2
|
@ -0,0 +1,95 @@
|
|||
# Noordstar caves API
|
||||
|
||||
This mod is built in a way to be easy to change the underground world.
|
||||
The API is written in a way to be very similar to the Minetest API.
|
||||
|
||||
## Shapes
|
||||
|
||||
Underground caves have varying shapes, and the variable
|
||||
`noordstar.registered_shapes` contains all those definitions.
|
||||
|
||||
The shapes are defined as follows:
|
||||
|
||||
```lua
|
||||
{
|
||||
name = "noordstar_caves:bubbles",
|
||||
-- Unique name identifying the shape
|
||||
-- Namespacing is not required but recommended
|
||||
|
||||
noise_params = {
|
||||
offset = 0.4,
|
||||
scale = 0.6,
|
||||
spread = { x = 100, y = 100, z = 100 },
|
||||
seed = 248039,
|
||||
octaves = 2,
|
||||
persistence = 0.6,
|
||||
lacunarity = 2.0,
|
||||
flags = "eased"
|
||||
},
|
||||
-- NoiseParams structure describing the perlin noise of the shape
|
||||
-- Values below 0 are always wall, values above 1 will always be part of a
|
||||
-- cave.
|
||||
-- Values in-between are either cave or non-cave depending on the
|
||||
-- cave size: lower values are only included in larger caves:
|
||||
--
|
||||
-- -0.25 ----- 0 ---- 0.25 ----- 0.5 ----- 0.75 ----- 1 ----- 1.25
|
||||
-- ^ ^ ^ ^ ^ ^
|
||||
-- | | | | | |
|
||||
-- always a wall | larger caves | most caves |
|
||||
-- | | |
|
||||
-- massive caves only smaller caves always cave
|
||||
|
||||
func = function(pos, n)
|
||||
return 2 * n
|
||||
end
|
||||
-- Function to edit the NoiseParams based on some operation.
|
||||
-- Keep in mind that this function will be run many, many times, so it is
|
||||
-- best to keep this function as trivial as possible.
|
||||
-- The function receives a node's position `pos` and the noise value `n`,
|
||||
-- and it is expected to return an updated noise value.
|
||||
-- If absent, the noise value is used as-is.
|
||||
|
||||
y_min = -31000,
|
||||
y_max = 31000,
|
||||
-- Lower and upper limits for cave shapes.
|
||||
-- Optional. If absent, the shape is allowed at all heights.
|
||||
|
||||
connectivity_point = 10,
|
||||
verticality_point = 40,
|
||||
-- Characteristic verticality and connectivity for the cave shape.
|
||||
-- Similar to how biomes are created, these values create 'shape points' on
|
||||
-- a voronoi diagram with verticality and connectivity as axes. However,
|
||||
-- in contrast with biomes, the voronoi cells aren't strict shape borders:
|
||||
-- they slightly overlap, creating smoother changes between cave shapes.
|
||||
--
|
||||
-- Although the variables can be interpreted differently, the variables
|
||||
-- stand for the following:
|
||||
--
|
||||
-- - Verticality: high vertical caves have large gaps, massive holes
|
||||
-- and great paths leading downwards
|
||||
-- low vertical caves have mostly horizontal corridors
|
||||
-- with relatively little vertical changes
|
||||
--
|
||||
-- - Connectivity: highly connected caves generally are one massive
|
||||
-- connected cave system, where you can generally
|
||||
-- navigate to other parts of the cave without breaking
|
||||
-- blocks
|
||||
-- lowly connected caves are usually very separate
|
||||
-- pieces, single domes, bubbles or standard shapes
|
||||
--
|
||||
--
|
||||
-- For example:
|
||||
--
|
||||
-- | low verticality | high verticality |
|
||||
-- -------------------|---------------------|----------------------|
|
||||
-- low connectivity | a single large dome | a deep sinkhole |
|
||||
-- -------------------|---------------------|----------------------|
|
||||
-- high connectivity | abandoned mineshaft | spaghetti tunnels |
|
||||
-- -------------------|---------------------|----------------------|
|
||||
}
|
||||
```
|
||||
|
||||
## Biomes
|
||||
|
||||
Just like the surface world, the underground world uses biomes to decorate their
|
||||
caves. The cave biomes are independent of
|
|
@ -0,0 +1,12 @@
|
|||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local function load(name)
|
||||
dofile(modpath.."/lua/"..name..".lua")
|
||||
end
|
||||
|
||||
-- Global variable that can be used by other mods
|
||||
-- Please see API.md for reference
|
||||
noordstar_caves = {}
|
||||
|
||||
-- Load features to influence cave shapes
|
||||
load("shape")
|
|
@ -0,0 +1,48 @@
|
|||
-- This file takes care of the cave shapes.
|
||||
|
||||
noordstar_caves.registered_shapes = {}
|
||||
|
||||
-- Clean the input and return a valid shape def
|
||||
-- If the input is invalid, return nil
|
||||
local function clean_def(def)
|
||||
if type(def.name) ~= "string" then
|
||||
return nil
|
||||
end
|
||||
if type(def.connectivity_point) ~= "number" then
|
||||
return nil
|
||||
end
|
||||
if type(def.verticality_point) ~= "number" then
|
||||
return nil
|
||||
end
|
||||
|
||||
local d = {
|
||||
name = def.name,
|
||||
connectivity_point = def.connectivity_point,
|
||||
verticality_point = def.verticality_point
|
||||
}
|
||||
|
||||
if type(def.noise_params) == "table" then
|
||||
d.noise_params = def.noise_params
|
||||
end
|
||||
|
||||
if type(def.func) == "function" then
|
||||
d.func = def.func
|
||||
else
|
||||
d.func = function(pos, v) return v end
|
||||
end
|
||||
|
||||
if type(def.y_min) == "number" and type(def.y_max) == "number" then
|
||||
d.y_min = def.y_min
|
||||
d.y_max = def.y_max
|
||||
end
|
||||
|
||||
return d
|
||||
end
|
||||
|
||||
function noordstar_caves.register_shape(def)
|
||||
local d = clean_def(def)
|
||||
|
||||
if d ~= nil then
|
||||
noordstar_caves.registered_shapes[d.name] = d
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue