summaryrefslogtreecommitdiff
path: root/caverealms_lite/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'caverealms_lite/init.lua')
-rw-r--r--caverealms_lite/init.lua333
1 files changed, 333 insertions, 0 deletions
diff --git a/caverealms_lite/init.lua b/caverealms_lite/init.lua
new file mode 100644
index 0000000..5cc8a2c
--- /dev/null
+++ b/caverealms_lite/init.lua
@@ -0,0 +1,333 @@
+caverealms = {} --create a container for functions and constants
+
+--grab a shorthand for the filepath of the mod
+local modpath = minetest.get_modpath(minetest.get_current_modname())
+
+--load companion lua files
+dofile(modpath.."/config.lua") --configuration file; holds various constants
+dofile(modpath.."/crafting.lua") --crafting recipes
+dofile(modpath.."/nodes.lua") --node definitions
+dofile(modpath.."/functions.lua") --function definitions
+dofile(modpath.."/plants.lua")
+
+if minetest.get_modpath("mobs_monster") then
+ if caverealms.config.dm_spawn == true then
+ dofile(modpath.."/dungeon_master.lua") --special DMs for DM's Lair biome
+ end
+end
+
+-- Parameters
+
+local YMIN = caverealms.config.ymin -- Approximate realm limits.
+local YMAX = caverealms.config.ymax
+local TCAVE = caverealms.config.tcave --0.5 -- Cave threshold. 1 = small rare caves, 0.5 = 1/3rd ground volume, 0 = 1/2 ground volume
+local BLEND = 128 -- Cave blend distance near YMIN, YMAX
+
+local STAGCHA = caverealms.config.stagcha --0.002 --chance of stalagmites
+local STALCHA = caverealms.config.stalcha --0.003 --chance of stalactites
+local CRYSTAL = caverealms.config.crystal --0.007 --chance of glow crystal formations
+local GEMCHA = caverealms.config.gemcha --0.03 --chance of small glow gems
+local MUSHCHA = caverealms.config.mushcha --0.04 --chance of mushrooms
+local MYCCHA = caverealms.config.myccha --0.03 --chance of mycena mushrooms
+local WORMCHA = caverealms.config.wormcha --0.03 --chance of glow worms
+local GIANTCHA = caverealms.config.giantcha --0.001 -- chance of giant mushrooms
+local ICICHA = caverealms.config.icicha --0.035 -- chance of icicles
+local FLACHA = caverealms.config.flacha --0.04 --chance of constant flames
+
+local DM_TOP = caverealms.config.dm_top -- -4000 --level at which Dungeon Master Realms start to appear
+local DM_BOT = caverealms.config.dm_bot -- -5000 --level at which "" ends
+local DEEP_CAVE = caverealms.config.deep_cave -- -7000 --level at which deep cave biomes take over
+
+-- 2D noise for biome
+
+local np_biome = {
+ offset = 0,
+ scale = 1,
+ spread = {x=200, y=200, z=200},
+ seed = 9130,
+ octaves = 3,
+ persist = 0.5
+}
+
+-- Stuff
+
+subterrain = {}
+
+
+-- On generated function
+
+minetest.register_on_generated(function(minp, maxp, seed)
+ --if out of range of caverealms limits
+ if minp.y > YMAX or maxp.y < YMIN then
+ return --quit; otherwise, you'd have stalagmites all over the place
+ end
+
+ --easy reference to commonly used values
+ local t1 = os.clock()
+ local x1 = maxp.x
+ local y1 = maxp.y
+ local z1 = maxp.z
+ local x0 = minp.x
+ local y0 = minp.y
+ local z0 = minp.z
+
+ --print ("[caverealms] chunk minp ("..x0.." "..y0.." "..z0..")") --tell people you are generating a chunk
+
+ local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
+ local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
+ local data = vm:get_data()
+
+ --grab content IDs
+ local c_air = minetest.get_content_id("air")
+ local c_stone = minetest.get_content_id("default:stone")
+
+ local c_water = minetest.get_content_id("default:water_source")
+ local c_lava = minetest.get_content_id("default:lava_source")
+ local c_ice = minetest.get_content_id("default:ice")
+ local c_thinice = minetest.get_content_id("caverealms:thin_ice")
+ local c_crystal = minetest.get_content_id("caverealms:glow_crystal")
+ local c_gem = minetest.get_content_id("caverealms:glow_gem")
+ local c_saltgem = minetest.get_content_id("caverealms:salt_gem")
+ local c_spike = minetest.get_content_id("caverealms:spike")
+ local c_moss = minetest.get_content_id("caverealms:stone_with_moss")
+ local c_lichen = minetest.get_content_id("caverealms:stone_with_lichen")
+ local c_algae = minetest.get_content_id("caverealms:stone_with_algae")
+ local c_salt = minetest.get_content_id("caverealms:stone_with_salt")
+ local c_hcobble = minetest.get_content_id("caverealms:hot_cobble")
+ local c_gobsidian = minetest.get_content_id("caverealms:glow_obsidian")
+ local c_gobsidian2 = minetest.get_content_id("caverealms:glow_obsidian_2")
+ local c_coalblock = minetest.get_content_id("default:coalblock")
+ local c_desand = minetest.get_content_id("default:desert_sand")
+ local c_coaldust = minetest.get_content_id("caverealms:coal_dust")
+ local c_fungus = minetest.get_content_id("caverealms:fungus")
+ local c_mycena = minetest.get_content_id("caverealms:mycena")
+ local c_worm = minetest.get_content_id("caverealms:glow_worm")
+ local c_worm_green = minetest.get_content_id("caverealms:glow_worm_green")
+ local c_fire_vine = minetest.get_content_id("caverealms:fire_vine")
+ local c_iciu = minetest.get_content_id("caverealms:icicle_up")
+ local c_icid = minetest.get_content_id("caverealms:icicle_down")
+ local c_flame = minetest.get_content_id("caverealms:constant_flame")
+
+ --mandatory values
+ local sidelen = x1 - x0 + 1 --length of a mapblock
+ local chulens = {x=sidelen, y=sidelen, z=sidelen} --table of chunk edges
+ local chulens2D = {x=sidelen, y=sidelen, z=1}
+ local minposxyz = {x=x0, y=y0, z=z0} --bottom corner
+ local minposxz = {x=x0, y=z0} --2D bottom corner
+
+ local nvals_biome = minetest.get_perlin_map(np_biome, chulens2D):get2dMap_flat({x=x0+150, y=z0+50}) --2D noise for biomes (will be 3D humidity/temp later)
+
+ local nixyz = 1 --3D node index
+ local nixz = 1 --2D node index
+ local nixyz2 = 1 --second 3D index for second loop
+
+
+ for z = z0, z1 do -- for each xy plane progressing northwards
+ --increment indices
+ nixyz = nixyz + 1
+
+
+ --decoration loop
+ for y = y0, y1 do -- for each x row progressing upwards
+
+ local c_selected_worm = c_worm
+
+ local is_deep = false
+ if y < DEEP_CAVE then
+ is_deep = true
+ end
+
+
+ local vi = area:index(x0, y, z)
+ for x = x0, x1 do -- for each node do
+
+ --determine biome
+ local biome = 0 --preliminary declaration
+ local n_biome = nvals_biome[nixz] --make an easier reference to the noise
+
+ --compare noise values to determine a biome
+ if n_biome <= -0.5 then
+ if is_deep and n_biome <= -0.25 then
+ biome = 8 --glow obsidian
+ else
+ biome = 2 --fungal
+ c_selected_worm = c_worm_green
+ end
+
+ elseif n_biome < 0 then
+ biome = 0 -- none
+
+ elseif n_biome < 0.5 then
+ if is_deep and n_biome <= 0.25 then
+ biome = 7 --salt crystal
+ else
+ biome = 1 --moss
+ end
+
+ elseif n_biome < 0.65 then
+ biome = 0
+
+ elseif n_biome < 0.85 then
+ if is_deep and n_biome <= 0.75 then
+ biome = 9 --coal dust
+ else
+ biome = 3 --algae
+ c_selected_worm = c_worm_green
+ end
+
+ else
+ if is_deep and n_biome <= .95 then
+ biome = 5 --deep glaciated
+ else
+ biome = 4 --glaciated
+ end
+ end
+
+ --print(biome)
+
+ if biome > 0 then
+ if y <= DM_TOP and y >= DM_BOT then
+ biome = 6 --DUNGEON MASTER'S LAIR
+ c_selected_worm = c_fire_vine
+ end
+
+ --ceiling
+ local ai = area:index(x,y+1,z) --above index
+ if data[ai] == c_stone and data[vi] == c_air then --ceiling
+ if math.random() < ICICHA and (biome == 4 or biome == 5) then
+ data[vi] = c_icid
+ end
+ if math.random() < WORMCHA then
+ data[vi] = c_selected_worm
+ local bi = area:index(x,y-1,z)
+ data[bi] = c_selected_worm
+ if math.random(2) == 1 then
+ local bbi = area:index(x,y-2,z)
+ data[bbi] = c_selected_worm
+ if math.random(2) ==1 then
+ local bbbi = area:index(x,y-3,z)
+ data[bbbi] = c_selected_worm
+ end
+ end
+ end
+ if math.random() < STALCHA then
+ caverealms:stalactite(x,y,z, area, data)
+ end
+ if math.random() < CRYSTAL then
+ caverealms:crystal_stalactite(x,y,z, area, data, biome)
+ end
+ end
+ --ground
+ local bi = area:index(x,y-1,z) --below index
+ if data[bi] == c_stone and data[vi] == c_air then --ground
+ local ai = area:index(x,y+1,z)
+ --place floor material, add plants/decorations
+ if biome == 1 then
+ data[vi] = c_moss
+ if math.random() < GEMCHA then
+ data[ai] = c_gem
+ end
+ elseif biome == 2 then
+ data[vi] = c_lichen
+ if math.random() < MUSHCHA then --mushrooms
+ data[ai] = c_fungus
+ end
+ if math.random() < MYCCHA then --mycena mushrooms
+ data[ai] = c_mycena
+ end
+ if math.random() < GIANTCHA then --giant mushrooms
+ caverealms:giant_shroom(x, y, z, area, data)
+ end
+ elseif biome == 3 then
+ data[vi] = c_algae
+ elseif biome == 4 then
+ data[vi] = c_thinice
+ local bi = area:index(x,y-1,z)
+ data[bi] = c_thinice
+ if math.random() < ICICHA then --if glaciated, place icicles
+ data[ai] = c_iciu
+ end
+ elseif biome == 5 then
+ data[vi] = c_ice
+ local bi = area:index(x,y-1,z)
+ data[bi] = c_ice
+ if math.random() < ICICHA then --if glaciated, place icicles
+ data[ai] = c_iciu
+ end
+ elseif biome == 6 then
+ data[vi] = c_hcobble
+ if math.random() < FLACHA then --neverending flames
+ data[ai] = c_flame
+ end
+ elseif biome == 7 then
+ local bi = area:index(x,y-1,z)
+ data[vi] = c_salt
+ data[bi] = c_salt
+ if math.random() < GEMCHA then
+ data[ai] = c_saltgem
+ end
+ if math.random() < STAGCHA then
+ caverealms:salt_stalagmite(x,y,z, area, data)
+ end
+ elseif biome == 8 then
+ local bi = area:index(x,y-1,z)
+ if math.random() < 0.5 then
+ data[vi] = c_gobsidian
+ data[bi] = c_gobsidian
+ else
+ data[vi] = c_gobsidian2
+ data[bi] = c_gobsidian2
+ end
+ if math.random() < FLACHA then --neverending flames
+ data[ai] = c_flame
+ end
+ elseif biome == 9 then
+ local bi = area:index(x,y-1,z)
+ if math.random() < 0.05 then
+ data[vi] = c_coalblock
+ data[bi] = c_coalblock
+ elseif math.random() < 0.15 then
+ data[vi] = c_coaldust
+ data[bi] = c_coaldust
+ else
+ data[vi] = c_desand
+ data[bi] = c_desand
+ end
+ if math.random() < FLACHA * 0.75 then --neverending flames
+ data[ai] = c_flame
+ end
+ if math.random() < GEMCHA then
+ data[ai] = c_spike
+ end
+ end
+
+ if math.random() < STAGCHA then
+ caverealms:stalagmite(x,y,z, area, data)
+ end
+ if math.random() < CRYSTAL then
+ caverealms:crystal_stalagmite(x,y,z, area, data, biome)
+ end
+ end
+
+ end
+ nixyz2 = nixyz2 + 1
+ nixz = nixz + 1
+ vi = vi + 1
+ end
+ nixz = nixz - sidelen --shift the 2D index back
+ end
+ nixz = nixz + sidelen --shift the 2D index up a layer
+ end
+
+ --send data back to voxelmanip
+ vm:set_data(data)
+ --calc lighting
+ vm:set_lighting({day=0, night=0})
+ vm:calc_lighting()
+ --write it to world
+ vm:write_to_map(data)
+
+ --local chugent = math.ceil((os.clock() - t1) * 1000) --grab how long it took
+ --print ("[caverealms] "..chugent.." ms") --tell people how long
+end)
+print("[caverealms] loaded!")