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