diff --git a/df_caverns/config.lua b/df_caverns/config.lua index d92d9a1..642f2b0 100644 --- a/df_caverns/config.lua +++ b/df_caverns/config.lua @@ -48,3 +48,7 @@ setting("bool", "enable_underworld", true, "Enable underworld") df_caverns.config.enable_underworld = df_caverns.config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil setting("int", "underworld_level", -3200, "Underworld level") setting("int", "underworld_glowing_pit_mapblocks", 8, "Average pit spacing measured in mapblocks") + +setting("bool", "enable_primordial", true, "Enable primordial cavern") +setting("int", "primordial_max", -3393, "Upper limit to primordial caverns") +setting("int", "primordial_min", -4032, "Lower limit to primordial caverns") diff --git a/df_caverns/init.lua b/df_caverns/init.lua index f369ac4..12d5e59 100644 --- a/df_caverns/init.lua +++ b/df_caverns/init.lua @@ -15,3 +15,4 @@ dofile(modpath.."/sunless_sea.lua") dofile(modpath.."/oil_sea.lua") dofile(modpath.."/lava_sea.lua") dofile(modpath.."/underworld.lua") +dofile(modpath.."/primordial.lua") \ No newline at end of file diff --git a/df_caverns/primordial.lua b/df_caverns/primordial.lua new file mode 100644 index 0000000..4568864 --- /dev/null +++ b/df_caverns/primordial.lua @@ -0,0 +1,138 @@ +if not df_caverns.config.enable_primordial or not minetest.get_modpath("df_primordial_items") then + return +end + +----------------------------------------------------------------------------------------- + +local perlin_cave_primordial = { + 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 = 14055553, + octaves = 3, + persist = 0.67 +} + +local perlin_wave_primordial = { + 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 = 923444, + octaves = 6, + persist = 0.63 +} + + +local mushroom_cavern_floor = function(abs_cracks, vi, area, data, data_param2) + local ystride = area.ystride +end + +local mushroom_cavern_ceiling = function(abs_cracks, vi, area, data, data_param2) +end + + +local jungle_cavern_floor = function(abs_cracks, vi, area, data, data_param2) + local ystride = area.ystride +end + +local jungle_cavern_ceiling = function(abs_cracks, vert_rand, vi, area, data, data_param2) +end + + +local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + local cave_area = node_arrays.cave_area + local nvals_cave = node_arrays.nvals_cave + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local jungle = nvals_cave[cave_area:transform(area, vi)] < 0 + + if jungle then + jungle_cavern_floor(abs_cracks, vi, area, data, data_param2) + else + mushroom_cavern_floor(abs_cracks, vi, area, data, data_param2) + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local jungle = nvals_cave[cave_area:transform(area, vi)] < 0 + + if jungle then + jungle_cavern_ceiling(abs_cracks, vi, area, data, data_param2) + else + mushroom_cavern_ceiling(abs_cracks, vi, area, data, data_param2) + end + + + end + + ---------------------------------------------- + -- Tunnel floors + + for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do + end + + ------------------------------------------------------ + -- Tunnel ceiling + + for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do + end + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + end + + -- columns + for _, vi in ipairs(node_arrays.column_nodes) do + local jungle = nvals_cave[cave_area:transform(area, vi)] < 0 + if jungle then + end + end + + vm:set_param2_data(data_param2) +end + +--Primordial Caverns +subterrane.register_layer({ + name = "primordial", + y_max = df_caverns.config.primordial_max, + y_min = df_caverns.config.primordial_min, + cave_threshold = df_caverns.config.sunless_sea_threshold, -- Make the caves a bit bigger than above + perlin_cave = perlin_cave_primordial, + perlin_wave = perlin_wave_primordial, + solidify_lava = true, + columns = { + maximum_radius = 20, + minimum_radius = 5, + node = "df_mapitems:wet_flowstone", + weight = 0.5, + maximum_count = 60, + minimum_count = 10, + }, + decorate = decorate_primordial, + double_frequency = true, +}) diff --git a/df_caverns/settingtypes.txt b/df_caverns/settingtypes.txt index a2c6878..1f19c82 100644 --- a/df_caverns/settingtypes.txt +++ b/df_caverns/settingtypes.txt @@ -37,4 +37,9 @@ dfcaverns_lava_sea_level (Lava sea level) int -2900 dfcaverns_enable_underworld (Generate underworld) bool true dfcaverns_underworld_level (Underworld level) int -3200 #Set this to 0 to disable glowing pit generation entirely. -dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8 \ No newline at end of file +dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8 + +[Primordial] +dfcaverns_enable_primordial (Generate primordial caverns) bool true +dfcaverns_primordial_max (Upper limit of primordial caverns) int -3393 +dfcaverns_primordial_min (Lower limit of primordial caverns) int -4032 \ No newline at end of file diff --git a/df_primordial_items/depends.txt b/df_primordial_items/depends.txt index 8d789bc..6e1e8e7 100644 --- a/df_primordial_items/depends.txt +++ b/df_primordial_items/depends.txt @@ -1,2 +1,3 @@ default -mapgen_helper \ No newline at end of file +mapgen_helper +subterrane \ No newline at end of file diff --git a/df_primordial_items/init.lua b/df_primordial_items/init.lua index 532b7d1..8be0c01 100644 --- a/df_primordial_items/init.lua +++ b/df_primordial_items/init.lua @@ -5,6 +5,7 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) dofile(MP.."/jungle_nodes.lua") dofile(MP.."/jungle_tree.lua") +dofile(MP.."/jungle_mushroom.lua") dofile(MP.."/giant_fern.lua") dofile(MP.."/fungal_nodes.lua") dofile(MP.."/primordial_mushroom.lua") diff --git a/df_primordial_items/jungle_mushroom.lua b/df_primordial_items/jungle_mushroom.lua new file mode 100644 index 0000000..145ddcd --- /dev/null +++ b/df_primordial_items/jungle_mushroom.lua @@ -0,0 +1,140 @@ +-- internationalization boilerplate +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + +------------------------------------------------------------------------------------------ +-- Big jungle mushroom + +minetest.register_node("df_primordial_items:jungle_mushroom_trunk", { + description = S("Primordial Jungle Mushroom Trunk"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem_02.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_cap_1", { + description = S("Pale Jungle Mushroom Cap"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_top_02.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungle_mushroom_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_mushroom_cap_1"}, + } + } + }, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_cap_2", { + description = S("Dark Jungle Mushroom Cap"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_top_01.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungle_mushroom_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_mushroom_cap_2"}, + } + } + }, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_sapling", { + description = S("Primordial Jungle Mushroom Sapling"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_02.png^[brighten"}, + inventory_image = "dfcaverns_jungle_mushroom_02.png^[brighten", + wield_image = "dfcaverns_jungle_mushroom_02.png^[brighten", + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + walkable = false, + sounds = default.node_sound_leaves_defaults(), + use_texture_alpha = true, + sunlight_propagates = true, + + on_construct = function(pos) + minetest.get_node_timer(pos):start( + math.random( + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_max_growth_delay) + ) + end, + + on_timer = function(pos) + minetest.set_node(pos, {name="air"}) + df_primordial_items.spawn_jungle_mushroom(pos) + end, +}) + +local c_stem = minetest.get_content_id("df_primordial_items:jungle_mushroom_trunk") +local c_cap_1 = minetest.get_content_id("df_primordial_items:jungle_mushroom_cap_1") +local c_cap_2 = minetest.get_content_id("df_primordial_items:jungle_mushroom_cap_2") + +df_primordial_items.spawn_jungle_mushroom = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + local maxy = y + stem_height + 3 + + local c_cap + if math.random() > 0.5 then + c_cap = c_cap_1 + else + c_cap = c_cap_2 + end + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, nil, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_primordial_items.spawn_jungle_mushroom_vm = function(vi, area, data) + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + local c_cap + if math.random() > 0.5 then + c_cap = c_cap_1 + else + c_cap = c_cap_2 + end + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, nil, stem_height, cap_radius) +end \ No newline at end of file diff --git a/df_primordial_items/jungle_nodes.lua b/df_primordial_items/jungle_nodes.lua index 38d3713..4771935 100644 --- a/df_primordial_items/jungle_nodes.lua +++ b/df_primordial_items/jungle_nodes.lua @@ -2,8 +2,7 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") - ------------------------------------------------------ +---------------------------------------------------- -- Ferns minetest.register_node("df_primordial_items:fern_1", { @@ -219,33 +218,6 @@ minetest.register_node("df_primordial_items:jungle_mushroom_2", { sunlight_propagates = true, }) ------------------------------------------------------------------------------------------- --- Big jungle mushroom - -minetest.register_node("df_primordial_items:jungle_mushroom_trunk", { - description = S("Primordial Jungle Mushroom Trunk"), - _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, - _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, - tiles = {"dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem_02.png"}, - paramtype2 = "facedir", - is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - on_place = minetest.rotate_node -}) - -minetest.register_node("df_primordial_items:jungle_mushroom_cap", { - description = S("Primordial Jungle Mushroom Cap"), - _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, - _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, - tiles = {"dfcaverns_jungle_mushroom_top_01.png", "dfcaverns_jungle_mushroom_top_02.png", "dfcaverns_jungle_mushroom_top_01.png"}, - paramtype2 = "facedir", - is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - on_place = minetest.rotate_node -}) - ---------------------------------------------------------------------------------------- -- Dirt diff --git a/df_primordial_items/mod.conf b/df_primordial_items/mod.conf index 16a5765..194ff3d 100644 --- a/df_primordial_items/mod.conf +++ b/df_primordial_items/mod.conf @@ -1,3 +1,3 @@ name = df_primordial_items description = A collection of flora found in the "primordial" cavern layer of DF Caverns -depends = default, mapgen_helper \ No newline at end of file +depends = default, mapgen_helper, subterrane \ No newline at end of file