2018-12-31 19:46:27 +01:00
-- This file contains code that is used by multiple different cavern layers.
local c_water = minetest.get_content_id ( " default:water_source " )
local c_air = minetest.get_content_id ( " air " )
local c_dirt = minetest.get_content_id ( " default:dirt " )
local c_gravel = minetest.get_content_id ( " default:gravel " )
local c_dirt_moss = minetest.get_content_id ( " df_mapitems:dirt_with_cave_moss " )
local c_cobble_fungus = minetest.get_content_id ( " df_mapitems:cobble_with_floor_fungus " )
local c_cobble_fungus_fine = minetest.get_content_id ( " df_mapitems:cobble_with_floor_fungus_fine " )
local c_cobble = minetest.get_content_id ( " default:cobble " )
local c_mossycobble = minetest.get_content_id ( " default:mossycobble " )
local c_wet_flowstone = minetest.get_content_id ( " df_mapitems:wet_flowstone " )
local c_dry_flowstone = minetest.get_content_id ( " df_mapitems:dry_flowstone " )
df_caverns.data_param2 = { }
--------------------------------------------------
df_caverns.stalagmites = function ( abs_cracks , vert_rand , vi , area , data , data_param2 , wet , reverse_sign )
local flowstone
local stalagmite_ids
if wet then
flowstone = c_wet_flowstone
stalagmite_ids = df_mapitems.wet_stalagmite_ids
else
flowstone = c_dry_flowstone
stalagmite_ids = df_mapitems.dry_stalagmite_ids
end
local height_mult = 1
local ystride = area.ystride
if reverse_sign then
ystride = - ystride
height_mult = - 1
end
if vert_rand < 0.004 then
if reverse_sign then
subterrane.big_stalactite ( vi + ystride , area , data , 6 , 15 , flowstone , flowstone , flowstone )
else
subterrane.big_stalagmite ( vi + ystride , area , data , 6 , 15 , flowstone , flowstone , flowstone )
end
else
local param2 = abs_cracks * 1000000 - math.floor ( abs_cracks * 1000000 / 4 ) * 4
local height = math.floor ( abs_cracks * 50 )
subterrane.stalagmite ( vi + ystride , area , data , data_param2 , param2 , height * height_mult , stalagmite_ids )
end
data [ vi ] = flowstone
end
df_caverns.stalactites = function ( abs_cracks , vert_rand , vi , area , data , data_param2 , wet )
df_caverns.stalagmites ( abs_cracks , vert_rand , vi , area , data , data_param2 , wet , true )
end
--------------------------------------------------
df_caverns.flooded_cavern_floor = function ( abs_cracks , vert_rand , vi , area , data )
local ystride = area.ystride
if abs_cracks < 0.25 then
data [ vi ] = c_mossycobble
elseif data [ vi - ystride ] ~= c_water then
data [ vi ] = c_dirt
end
-- put in only the large stalagmites that won't get in the way of the water
if abs_cracks < 0.1 then
if vert_rand < 0.004 then
subterrane.big_stalagmite ( vi + ystride , area , data , 6 , 15 , c_wet_flowstone , c_wet_flowstone , c_wet_flowstone )
end
end
end
local c_dead_fungus
if minetest.get_modpath ( " df_farming " ) then
c_dead_fungus = minetest.get_content_id ( " df_farming:dead_fungus " )
end
df_caverns.dry_cavern_floor = function ( abs_cracks , vert_rand , vi , area , data , data_param2 )
if abs_cracks < 0.075 then
df_caverns.stalagmites ( abs_cracks , vert_rand , vi , area , data , data_param2 , false )
elseif abs_cracks < 0.4 then
data [ vi ] = c_cobble
elseif abs_cracks < 0.6 then
data [ vi ] = c_cobble_fungus_fine
else
data [ vi ] = c_cobble_fungus
if c_dead_fungus and math.random ( ) < 0.05 then
data [ vi + area.ystride ] = c_dead_fungus
end
end
end
df_caverns.wet_cavern_floor = function ( abs_cracks , vert_rand , vi , area , data , data_param2 )
if abs_cracks < 0.1 then
df_caverns.stalagmites ( abs_cracks , vert_rand , vi , area , data , data_param2 , true )
elseif abs_cracks < 0.6 then
data [ vi ] = c_cobble
else
data [ vi ] = c_mossycobble
if c_dead_fungus and math.random ( ) < 0.05 then
data [ vi + area.ystride ] = c_dead_fungus
end
end
end
--------------------------------------
df_caverns.glow_worm_cavern_ceiling = function ( abs_cracks , vert_rand , vi , area , data , data_param2 )
if abs_cracks < 0.1 then
df_caverns.stalactites ( abs_cracks , vert_rand , vi , area , data , data_param2 , true )
elseif abs_cracks < 0.5 and abs_cracks > 0.3 and math.random ( ) < 0.3 then
df_mapitems.glow_worm_ceiling ( area , data , vi - area.ystride )
end
end
local content_in_list = function ( content , list )
for i , v in ipairs ( list ) do
if content == v then return true end
end
return false
end
df_caverns.tunnel_floor = function ( minp , maxp , area , vi , nvals_cracks , data , data_param2 , wet )
Primordial cavern layer (#12)
* bring in the art assets from ClockGen's "better_caves_modpack" under CC BY 4.0,, code written from scratch.
* update mapgen_helper
* import ClockGen's giant mushroom schematics, make them and giant ferns growable
* add giant jungle mushroom, rough out actual cavern layer code framework
* fungal ceiling decorations
* decorate fungal floor a bit
* update mapgen_helper
* update primordial mushroom schematic placement to ensure it fits
* add giant mycelium fungoidal structure
* add giant mycelium to mapgen
* fix settings for giant mycelium
* make mycelium grow when players aren't present
* allow mycelium growth to pause when it hits unloaded areas
* add a use for giant mycelium
* make giant mushrooms edible, make jungle trees growable
* rough out the jungle biome
* Make a spectrum of jungle growth
* optimize pngs, add is_ground_content to everything
* use custom is_ground_content method
* fix a crash with veinstone, and simplify nvals_cave lookup now that overgen covers the same area
* more fixes for overgen support
* remove unintentional airspace from underside of slade
* fix for overgen crash in level 2
* primordial column material, add sealed shafts to underworld
* add seal block
* Set up puzzle seals to be able to dig a staircase shaft through the slade layer. TODO: the puzzle to guard the trigger.
* puzzle seals now fully functional. Need to add clues for decoding the keys next.
* add a small bit of anti-griefing - the seal breach bell only tolls globally 13 times per activation
* add flowers to the underworld warrior bones
* switch to a different key bell
* fancy up the puzzle seal temples with some custom blocks, add sub-slade grid passages
* add a clue to the seal formspec
* tweak background of inscription 2 so it's less obviously a copy of the background for inscription 1
* switch to compositing to save a few bytes
* fancy up the seal's upper surface with inscriptions to make the formspec feel consistent
* puzzle particle, bones were only spawning on top of structures
* fix ice/oil on level 3, tweak some loot probabilities
* add trail mod support
* remove deprecated files
* boost default plant growth delay, add growing selection boxes
* update map colours
* add named waypoints to the underworld
* try a more efficient way of changing the interiors of columns
* polishing up the Primordial layer
* update guide with some Primordial teasers
* updated magma sea screenshot
* update mapgen_helper and subterrane
* reduce density of megaflora a bit - was too hard to walk through
* spreading_dirt_type depends on light, create my own ABM instead
* add names to the glowing pits and some of the ruins
* separate setting for ruin markers
* record identity of slade-breachers
* make mycelia climbable
* update subterrane
* change surface tunnel detection to allow above-ground stalactites and stalagmites
* add rare thicker Goblin Caps, suitable for use as huts.
* better goblin cap schematics
* update colours
* make it slightly harder to dig down through amethyst sheathing of pits
* fixing up fungus light sensitivity, tree growth code
* fix a few minor bugs
* update deprecated functions
* add various eating sounds
* make mapping kit requirement more flexible
* update spindlestem growth code, remove deprecated functions
* fix leftover undefined variable
* add fireflies to primordial, spread out the post-mapgen node timer for plant matter a bit more.
* fix bones formspec
* add lbm to upgrade old bones
* fix slade undiggability
* make torchspines smokey and manually lightable
* fix drop definitions
* generate dry stalactites in near-surface caverns.
* caverns become far too smokey, alas
* add pitter patter of spore tree spores, alternate paper recipe
* new mapgen_helper metrics
* add smokey back to torchspine now that it can be dialed down a bit
* replace glowstone texture with a new animated one
* switch from ABM to node timer for mapgen mycelium growth
* make mapgen mycelium timer delay configurable
* improve the efficiency of giant mycelium growth using flat node array, fewer dereferences
* remove the smoke from torchspines again - it doesn't dissipate that deep underground
* give slade a more muted, gloomy hue to differentiate it from nether stone
* update screenshots with new slade colors
* update mapgen_helper
2020-02-13 07:49:17 +01:00
if maxp.y > - 30 then
wet = false
end
2018-12-31 19:46:27 +01:00
local ystride = area.ystride
local index2d = mapgen_helper.index2di ( minp , maxp , area , vi )
local cracks = nvals_cracks [ index2d ]
local abs_cracks = math.abs ( cracks )
if wet then
if abs_cracks < 0.05 and data [ vi + ystride ] == c_air and not content_in_list ( data [ vi ] , df_mapitems.wet_stalagmite_ids ) then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites
local param2 = abs_cracks * 1000000 - math.floor ( abs_cracks * 1000000 / 4 ) * 4
local height = math.floor ( abs_cracks * 100 )
subterrane.stalagmite ( vi + ystride , area , data , data_param2 , param2 , height , df_mapitems.wet_stalagmite_ids )
data [ vi ] = c_wet_flowstone
end
else
if abs_cracks < 0.025 and data [ vi + ystride ] == c_air and not content_in_list ( data [ vi ] , df_mapitems.dry_stalagmite_ids ) then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites
local param2 = abs_cracks * 1000000 - math.floor ( abs_cracks * 1000000 / 4 ) * 4
local height = math.floor ( abs_cracks * 100 )
subterrane.stalagmite ( vi + ystride , area , data , data_param2 , param2 , height , df_mapitems.dry_stalagmite_ids )
elseif cracks > 0.5 and data [ vi - ystride ] ~= c_air then
data [ vi ] = c_gravel
end
end
end
df_caverns.tunnel_ceiling = function ( minp , maxp , area , vi , nvals_cracks , data , data_param2 , wet )
Primordial cavern layer (#12)
* bring in the art assets from ClockGen's "better_caves_modpack" under CC BY 4.0,, code written from scratch.
* update mapgen_helper
* import ClockGen's giant mushroom schematics, make them and giant ferns growable
* add giant jungle mushroom, rough out actual cavern layer code framework
* fungal ceiling decorations
* decorate fungal floor a bit
* update mapgen_helper
* update primordial mushroom schematic placement to ensure it fits
* add giant mycelium fungoidal structure
* add giant mycelium to mapgen
* fix settings for giant mycelium
* make mycelium grow when players aren't present
* allow mycelium growth to pause when it hits unloaded areas
* add a use for giant mycelium
* make giant mushrooms edible, make jungle trees growable
* rough out the jungle biome
* Make a spectrum of jungle growth
* optimize pngs, add is_ground_content to everything
* use custom is_ground_content method
* fix a crash with veinstone, and simplify nvals_cave lookup now that overgen covers the same area
* more fixes for overgen support
* remove unintentional airspace from underside of slade
* fix for overgen crash in level 2
* primordial column material, add sealed shafts to underworld
* add seal block
* Set up puzzle seals to be able to dig a staircase shaft through the slade layer. TODO: the puzzle to guard the trigger.
* puzzle seals now fully functional. Need to add clues for decoding the keys next.
* add a small bit of anti-griefing - the seal breach bell only tolls globally 13 times per activation
* add flowers to the underworld warrior bones
* switch to a different key bell
* fancy up the puzzle seal temples with some custom blocks, add sub-slade grid passages
* add a clue to the seal formspec
* tweak background of inscription 2 so it's less obviously a copy of the background for inscription 1
* switch to compositing to save a few bytes
* fancy up the seal's upper surface with inscriptions to make the formspec feel consistent
* puzzle particle, bones were only spawning on top of structures
* fix ice/oil on level 3, tweak some loot probabilities
* add trail mod support
* remove deprecated files
* boost default plant growth delay, add growing selection boxes
* update map colours
* add named waypoints to the underworld
* try a more efficient way of changing the interiors of columns
* polishing up the Primordial layer
* update guide with some Primordial teasers
* updated magma sea screenshot
* update mapgen_helper and subterrane
* reduce density of megaflora a bit - was too hard to walk through
* spreading_dirt_type depends on light, create my own ABM instead
* add names to the glowing pits and some of the ruins
* separate setting for ruin markers
* record identity of slade-breachers
* make mycelia climbable
* update subterrane
* change surface tunnel detection to allow above-ground stalactites and stalagmites
* add rare thicker Goblin Caps, suitable for use as huts.
* better goblin cap schematics
* update colours
* make it slightly harder to dig down through amethyst sheathing of pits
* fixing up fungus light sensitivity, tree growth code
* fix a few minor bugs
* update deprecated functions
* add various eating sounds
* make mapping kit requirement more flexible
* update spindlestem growth code, remove deprecated functions
* fix leftover undefined variable
* add fireflies to primordial, spread out the post-mapgen node timer for plant matter a bit more.
* fix bones formspec
* add lbm to upgrade old bones
* fix slade undiggability
* make torchspines smokey and manually lightable
* fix drop definitions
* generate dry stalactites in near-surface caverns.
* caverns become far too smokey, alas
* add pitter patter of spore tree spores, alternate paper recipe
* new mapgen_helper metrics
* add smokey back to torchspine now that it can be dialed down a bit
* replace glowstone texture with a new animated one
* switch from ABM to node timer for mapgen mycelium growth
* make mapgen mycelium timer delay configurable
* improve the efficiency of giant mycelium growth using flat node array, fewer dereferences
* remove the smoke from torchspines again - it doesn't dissipate that deep underground
* give slade a more muted, gloomy hue to differentiate it from nether stone
* update screenshots with new slade colors
* update mapgen_helper
2020-02-13 07:49:17 +01:00
if maxp.y > - 30 then
wet = false
end
2018-12-31 19:46:27 +01:00
local ystride = area.ystride
local index2d = mapgen_helper.index2di ( minp , maxp , area , vi )
local cracks = nvals_cracks [ index2d ]
local abs_cracks = math.abs ( cracks )
if wet then
if abs_cracks < 0.05 and data [ vi - ystride ] == c_air and not content_in_list ( data [ vi ] , df_mapitems.wet_stalagmite_ids ) then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites
local param2 = abs_cracks * 1000000 - math.floor ( abs_cracks * 1000000 / 4 ) * 4
local height = math.floor ( abs_cracks * 100 )
subterrane.stalactite ( vi - ystride , area , data , data_param2 , param2 , height , df_mapitems.wet_stalagmite_ids )
data [ vi ] = c_wet_flowstone
end
else
if abs_cracks < 0.025 and data [ vi - ystride ] == c_air and not content_in_list ( data [ vi ] , df_mapitems.dry_stalagmite_ids ) then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites
local param2 = abs_cracks * 1000000 - math.floor ( abs_cracks * 1000000 / 4 ) * 4
local height = math.floor ( abs_cracks * 100 )
subterrane.stalactite ( vi - ystride , area , data , data_param2 , param2 , height , df_mapitems.dry_stalagmite_ids )
end
end
end
df_caverns.perlin_cave = {
offset = 0 ,
scale = 1 ,
spread = { x = df_caverns.config . horizontal_cavern_scale , y = df_caverns.config . vertical_cavern_scale , z = df_caverns.config . horizontal_cavern_scale } ,
seed = - 400000000089 ,
octaves = 3 ,
persist = 0.67
}
df_caverns.perlin_wave = {
offset = 0 ,
scale = 1 ,
spread = { x = df_caverns.config . horizontal_cavern_scale * 2 , y = df_caverns.config . vertical_cavern_scale , z = df_caverns.config . horizontal_cavern_scale * 2 } , -- squashed 2:1
seed = 59033 ,
octaves = 6 ,
persist = 0.63
}
-- Used for making lines of dripstone, and in various other places where small-scale patterns are needed
df_caverns.np_cracks = {
offset = 0 ,
scale = 1 ,
spread = { x = 20 , y = 20 , z = 20 } ,
seed = 5717 ,
octaves = 3 ,
persist = 0.63 ,
lacunarity = 2.0 ,
}
---------------------------------------------------------------------------------
df_caverns.place_shrub = function ( vi , area , data , param2_data , shrub_list )
if shrub_list == nil then
return
end
local shrub = shrub_list [ math.random ( # shrub_list ) ]
shrub ( vi , area , data , param2_data )
Primordial cavern layer (#12)
* bring in the art assets from ClockGen's "better_caves_modpack" under CC BY 4.0,, code written from scratch.
* update mapgen_helper
* import ClockGen's giant mushroom schematics, make them and giant ferns growable
* add giant jungle mushroom, rough out actual cavern layer code framework
* fungal ceiling decorations
* decorate fungal floor a bit
* update mapgen_helper
* update primordial mushroom schematic placement to ensure it fits
* add giant mycelium fungoidal structure
* add giant mycelium to mapgen
* fix settings for giant mycelium
* make mycelium grow when players aren't present
* allow mycelium growth to pause when it hits unloaded areas
* add a use for giant mycelium
* make giant mushrooms edible, make jungle trees growable
* rough out the jungle biome
* Make a spectrum of jungle growth
* optimize pngs, add is_ground_content to everything
* use custom is_ground_content method
* fix a crash with veinstone, and simplify nvals_cave lookup now that overgen covers the same area
* more fixes for overgen support
* remove unintentional airspace from underside of slade
* fix for overgen crash in level 2
* primordial column material, add sealed shafts to underworld
* add seal block
* Set up puzzle seals to be able to dig a staircase shaft through the slade layer. TODO: the puzzle to guard the trigger.
* puzzle seals now fully functional. Need to add clues for decoding the keys next.
* add a small bit of anti-griefing - the seal breach bell only tolls globally 13 times per activation
* add flowers to the underworld warrior bones
* switch to a different key bell
* fancy up the puzzle seal temples with some custom blocks, add sub-slade grid passages
* add a clue to the seal formspec
* tweak background of inscription 2 so it's less obviously a copy of the background for inscription 1
* switch to compositing to save a few bytes
* fancy up the seal's upper surface with inscriptions to make the formspec feel consistent
* puzzle particle, bones were only spawning on top of structures
* fix ice/oil on level 3, tweak some loot probabilities
* add trail mod support
* remove deprecated files
* boost default plant growth delay, add growing selection boxes
* update map colours
* add named waypoints to the underworld
* try a more efficient way of changing the interiors of columns
* polishing up the Primordial layer
* update guide with some Primordial teasers
* updated magma sea screenshot
* update mapgen_helper and subterrane
* reduce density of megaflora a bit - was too hard to walk through
* spreading_dirt_type depends on light, create my own ABM instead
* add names to the glowing pits and some of the ruins
* separate setting for ruin markers
* record identity of slade-breachers
* make mycelia climbable
* update subterrane
* change surface tunnel detection to allow above-ground stalactites and stalagmites
* add rare thicker Goblin Caps, suitable for use as huts.
* better goblin cap schematics
* update colours
* make it slightly harder to dig down through amethyst sheathing of pits
* fixing up fungus light sensitivity, tree growth code
* fix a few minor bugs
* update deprecated functions
* add various eating sounds
* make mapping kit requirement more flexible
* update spindlestem growth code, remove deprecated functions
* fix leftover undefined variable
* add fireflies to primordial, spread out the post-mapgen node timer for plant matter a bit more.
* fix bones formspec
* add lbm to upgrade old bones
* fix slade undiggability
* make torchspines smokey and manually lightable
* fix drop definitions
* generate dry stalactites in near-surface caverns.
* caverns become far too smokey, alas
* add pitter patter of spore tree spores, alternate paper recipe
* new mapgen_helper metrics
* add smokey back to torchspine now that it can be dialed down a bit
* replace glowstone texture with a new animated one
* switch from ABM to node timer for mapgen mycelium growth
* make mapgen mycelium timer delay configurable
* improve the efficiency of giant mycelium growth using flat node array, fewer dereferences
* remove the smoke from torchspines again - it doesn't dissipate that deep underground
* give slade a more muted, gloomy hue to differentiate it from nether stone
* update screenshots with new slade colors
* update mapgen_helper
2020-02-13 07:49:17 +01:00
end
---------------------------------------------------------------------------------
-- This method allows subterrane to overgenerate caves without destroying any of the decorations
local dfcaverns_nodes = nil
local dfcaverns_mods = {
" df_farming: " ,
" df_mapitems: " ,
" df_primordial_items: " ,
" df_trees: " ,
" df_underworld_items: " ,
" ice_sprites: " ,
" mine_gas: " ,
}
df_caverns.is_ground_content = function ( c_node )
if dfcaverns_nodes then
return not dfcaverns_nodes [ c_node ]
end
dfcaverns_nodes = { }
for k , v in pairs ( minetest.registered_nodes ) do
for _ , prefix in ipairs ( dfcaverns_mods ) do
if k : sub ( 1 , # prefix ) == prefix then
dfcaverns_nodes [ minetest.get_content_id ( k ) ] = true
end
end
end
dfcaverns_nodes [ minetest.get_content_id ( " default:ice " ) ] = true -- needed for nethercap cavern water covering
dfcaverns_nodes [ minetest.get_content_id ( " oil:oil_source " ) ] = true -- needed for blackcap oil slicks
if minetest.get_modpath ( " fireflies " ) then
dfcaverns_nodes [ minetest.get_content_id ( " fireflies:firefly " ) ] = true -- used in the primordial caverns
end
dfcaverns_mods = nil
return not dfcaverns_nodes [ c_node ]
2018-12-31 19:46:27 +01:00
end