From 7b99556df9c8f95f5311b9822eb6210ac3038d34 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Sat, 23 Jul 2022 12:08:41 -0600 Subject: [PATCH] adding biome API. Not yet tested. --- df_caverns/level1.lua | 7 +++++++ df_caverns/level2.lua | 7 +++++++ df_caverns/level3.lua | 14 ++++++++++++++ df_caverns/primordial.lua | 12 +++++++++++- df_caverns/shared.lua | 14 +++++++++++++- df_caverns/sunless_sea.lua | 25 ++++++++++++++++++++----- 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/df_caverns/level1.lua b/df_caverns/level1.lua index 774079f..cef223a 100644 --- a/df_caverns/level1.lua +++ b/df_caverns/level1.lua @@ -41,6 +41,13 @@ local get_biome = function(heat, humidity) end end +table.insert(df_caverns.get_biome_at_pos_list, function(pos, heat, humidity) + if pos.y < df_caverns.config.level1_min or pos.y > df_caverns.config.ymax then + return nil + end + return get_biome(heat, humidity) +end) + local tower_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local ystride = area.ystride if abs_cracks < 0.1 then diff --git a/df_caverns/level2.lua b/df_caverns/level2.lua index 732a214..ba0da9e 100644 --- a/df_caverns/level2.lua +++ b/df_caverns/level2.lua @@ -43,6 +43,13 @@ local get_biome = function(heat, humidity) end end +table.insert(df_caverns.get_biome_at_pos_list, function(pos, heat, humidity) + if pos.y < df_caverns.config.level2_min or pos.y >= df_caverns.config.level1_min then + return nil + end + return get_biome(heat, humidity) +end) + local goblin_cap_shrublist local tunnel_tube_shrublist local spore_tree_shrublist diff --git a/df_caverns/level3.lua b/df_caverns/level3.lua index 5a9d0de..8816245 100644 --- a/df_caverns/level3.lua +++ b/df_caverns/level3.lua @@ -36,6 +36,20 @@ local get_biome = function(heat, humidity) end end +table.insert(df_caverns.get_biome_at_pos_list, function(pos, heat, humidity) + if pos.y < df_caverns.config.level3_min or pos.y >= df_caverns.config.level2_min then + return nil + end + local biome = get_biome(heat, humidity) + if biome == "bloodnether" then + if subterrane.get_cavern_value("cavern layer 3", pos) < 0 then + return "nethercap" + end + return "bloodthorn" + end + return biome +end) + local black_cap_shrublist local nether_cap_shrublist local blood_thorn_shrublist diff --git a/df_caverns/primordial.lua b/df_caverns/primordial.lua index 4991c60..8f2be2c 100644 --- a/df_caverns/primordial.lua +++ b/df_caverns/primordial.lua @@ -24,6 +24,16 @@ local perlin_wave_primordial = { local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10 +table.insert(df_caverns.get_biome_at_pos_list, function(pos, heat, humidity) + if pos.y < df_caverns.config.primordial_min or pos.y > df_caverns.config.primordial_max then + return nil + end + if subterrane.get_cavern_value("primordial", pos) < 0 then + return "primordial jungle" + end + return "primordial fungus" +end) + ----------------------------------------------------------------------------------------- -- Fungal biome @@ -411,7 +421,7 @@ minetest.register_ore({ random_factor = 0, }) --- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there. +-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there by foraging, not farming. minetest.register_abm({ label = "Primordial plant growth", nodenames = {"df_primordial_items:dirt_with_jungle_grass"}, diff --git a/df_caverns/shared.lua b/df_caverns/shared.lua index 733e257..b59f2e8 100644 --- a/df_caverns/shared.lua +++ b/df_caverns/shared.lua @@ -21,7 +21,19 @@ local c_wet_flowstone = df_caverns.node_id.wet_flowstone local c_webs = df_caverns.node_id.big_webs local c_webs_egg = df_caverns.node_id.big_webs_egg -df_caverns.data_param2 = {} +df_caverns.data_param2 = {} -- shared among all mapgens to reduce memory clutter + +df_caverns.get_biome_at_pos_list = {} -- a list of methods of the form function(pos, heat, humidity) to allow modpack-wide queries about what should grow where +df_caverns.get_biome = function(pos) + local heat = minetest.get_heat(pos) + local humidity = minetest.get_humidity(pos) + for _, val in pairs(df_caverns.get_biome_at_pos_list) do + local biome = val(pos, heat, humidity) + if biome ~= nil then + return biome + end + end +end -- prevent mapgen from using these nodes as a base for stalactites or stalagmites local dont_build_speleothems_on = {} diff --git a/df_caverns/sunless_sea.lua b/df_caverns/sunless_sea.lua index 4625ccc..5f2137a 100644 --- a/df_caverns/sunless_sea.lua +++ b/df_caverns/sunless_sea.lua @@ -18,11 +18,11 @@ for node_name, node_def in pairs(minetest.registered_nodes) do end end -local mushroom_shrublist +local towergoblin_shrublist local fungispore_shrublist if minetest.get_modpath("df_farming") then - mushroom_shrublist = { + towergoblin_shrublist = { df_farming.spawn_plump_helmet_vm, df_farming.spawn_plump_helmet_vm, df_farming.spawn_dimple_cup_vm, @@ -94,7 +94,22 @@ local hot_zone_boundary = 70 local middle_zone_boundary = 50 local cool_zone_boundary = 30 -local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) +table.insert(df_caverns.get_biome_at_pos_list, function(pos, heat, humidity) + if pos.y < df_caverns.config.sunless_sea_min or pos.y >= df_caverns.config.level3_min then + return nil + end + if heat > hot_zone_boundary then + return "barren" -- hot zone + elseif heat > middle_zone_boundary then + return "fungispore" + elseif heat > cool_zone_boundary then + return "towergoblin" + else + return "barren" -- cool zone + end +end) + +local towergoblin_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local ystride = area.ystride if abs_cracks < 0.1 then df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) @@ -105,7 +120,7 @@ local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, da data[vi] = c_dirt_moss end if math.random() < 0.1 then - df_caverns.place_shrub(vi+ystride, area, data, data_param2, mushroom_shrublist) + df_caverns.place_shrub(vi+ystride, area, data, data_param2, towergoblin_shrublist) elseif abs_cracks > 0.25 then if math.random() < 0.01 then df_trees.spawn_tower_cap_vm(vi+ystride, area, data) @@ -269,7 +284,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d elseif heat > middle_zone_boundary then fungispore_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) elseif heat > cool_zone_boundary then - mushroom_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + towergoblin_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) else cool_zone_floor(abs_cracks, vert_rand, vi, area, data, data_param2) end