add cave pearls to some level 2 warrens and tunnels

This commit is contained in:
FaceDeer 2019-08-04 17:01:29 -06:00
parent 13a7f96c41
commit ab3c671029
2 changed files with 75 additions and 47 deletions

View File

@ -243,21 +243,29 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
local ystride = area.ystride
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then
if flooded_caverns or biome_name ~= "barren" then
-- we're in flooded areas or are not barren
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true)
else
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
end
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
for i= 1, 4 do
if math.random() > 0.5 then
df_mapitems.place_wall_pearls(vi-i*ystride, area, data, data_param2)
end
end
end
else
-- air pockets
local ystride = area.ystride
local cracks = nvals_cracks[index2d]
if cracks > 0.5 and data[vi-ystride] == c_water then
if cracks > 0.4 and data[vi-ystride] == c_water then
data[vi-ystride] = c_air
if cracks > 0.7 and data[vi-ystride*2] == c_water then
if cracks > 0.6 and data[vi-ystride*2] == c_water then
data[vi-ystride*2] = c_air
end
end
@ -289,6 +297,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
local ystride = area.ystride
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then
@ -297,8 +306,25 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
else
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
end
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
for i= 1, 4 do
if math.random() > 0.5 then
df_mapitems.place_wall_pearls(vi-i*ystride, area, data, data_param2)
end
end
end
else
-- air pockets
local cracks = nvals_cracks[index2d]
if cracks > 0.4 and data[vi-ystride] == c_water then
data[vi-ystride] = c_air
if cracks > 0.6 and data[vi-ystride*2] == c_water then
data[vi-ystride*2] = c_air
end
end
end
-- else air pockets?
end
----------------------------------------------

View File

@ -67,43 +67,12 @@ local pearl_on_place = function(itemstack, placer, pointed_thing)
return itemstack
end
local valid_mounting_node = function(pos)
local node = minetest.get_node(pos)
if not node then return false end
local def = minetest.registered_nodes[node.name]
if not def then return false end
if def.buildable_to then return false end
return true
end
local add_to_table = function(dest, source)
for _, val in ipairs(source) do
table.insert(dest, val)
end
end
local get_valid_facedirs = function(pos)
local dirs = {}
if valid_mounting_node(vector.add(pos, {x=1,y=0,z=0})) then
add_to_table(dirs, {16, 17, 18, 19})
end
if valid_mounting_node(vector.add(pos, {x=-1,y=0,z=0})) then
add_to_table(dirs, {12, 13, 14, 15})
end
if valid_mounting_node(vector.add(pos, {x=0,y=1,z=0})) then
add_to_table(dirs, {0, 1, 2, 3})
end
if valid_mounting_node(vector.add(pos, {x=0,y=-1,z=0})) then
add_to_table(dirs, {20, 21, 22, 23})
end
if valid_mounting_node(vector.add(pos, {x=0,y=0,z=1})) then
add_to_table(dirs, {8, 9, 10, 11})
end
if valid_mounting_node(vector.add(pos, {x=0,y=0,z=-1})) then
add_to_table(dirs, {4, 5, 6, 7})
end
end
minetest.register_node("df_mapitems:wall_pearls", {
description = S("Cave Pearls"),
tiles = {"dfcaverns_cave_pearl.png"},
@ -126,28 +95,61 @@ minetest.register_node("df_mapitems:wall_pearls", {
})
local c_air = minetest.get_content_id("air")
local c_stone = minetest.get_content_id("default:stone")
local c_pearls = minetest.get_content_id("df_mapitems:wall_pearls")
local valid_nodes = {} -- cache values
local is_valid_mounting_node = function(c_node)
if valid_nodes[c_node] ~= nil then
return valid_nodes[c_node]
end
local def = minetest.registered_nodes[minetest.get_name_from_content_id(c_node)]
if def ~= nil and (def.drawtype == "normal" or def.drawtype == nil) and (not def.buildable_to) then
valid_nodes[c_node] = true
return true
end
valid_nodes[c_node] = false
return false
end
--facing +x: 16, 17, 18, 19,
--facing -x: 12, 13, 14, 15
--facing +z: 8, 9, 10, 11
--facing -z: 4, 5, 6, 7
--facing -y: 20, 21, 22, 23, (ceiling)
--facing +y: 0, 1, 2, 3
local get_valid_facedirs_vm = function(vi, area, data)
local dirs = {}
local ystride = area.ystride
local zstride = area.zstride
if is_valid_mounting_node(data[vi+1]) then
add_to_table(dirs, {16, 17, 18, 19})
end
if is_valid_mounting_node(data[vi-1]) then
add_to_table(dirs, {12, 13, 14, 15})
end
if is_valid_mounting_node(data[vi-ystride]) then
add_to_table(dirs, {0, 1, 2, 3})
end
if is_valid_mounting_node(data[vi+ystride]) then
add_to_table(dirs, {20, 21, 22, 23})
end
if is_valid_mounting_node(data[vi+zstride]) then
add_to_table(dirs, {8, 9, 10, 11})
end
if is_valid_mounting_node(data[vi-zstride]) then
add_to_table(dirs, {4, 5, 6, 7})
end
return dirs
end
df_mapitems.place_wall_pearls = function(vi, area, data, data_param2)
if data[vi] == c_air then
if data[vi+1] == c_stone then -- positive X
local facedirs = get_valid_facedirs_vm(vi, area, data)
local count = #facedirs
if count > 0 then
data[vi] = c_pearls
data_param2[vi] = 15 + math.random(1,4)
elseif data[vi-1] == c_stone then -- negative X
data[vi] = c_pearls
data_param2[vi] = 11 + math.random(1,4)
elseif data[vi+area.zstride] == c_stone then -- positive Z
data[vi] = c_pearls
data_param2[vi] = 7 + math.random(1,4)
elseif data[vi-area.zstride] == c_stone then -- negative Z
data[vi] = c_pearls
data_param2[vi] = 3 + math.random(1,4)
data_param2[vi] = facedirs[math.random(1, count)]
end
end
end