200 lines
5.2 KiB
Lua
200 lines
5.2 KiB
Lua
-- Underworlds init.lua
|
|
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
|
|
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
|
|
|
|
|
|
underworlds_mod = {}
|
|
underworlds_mod.version = "1.0"
|
|
underworlds_mod.path = minetest.get_modpath(minetest.get_current_modname())
|
|
underworlds_mod.world = minetest.get_worldpath()
|
|
|
|
underworlds_mod.integration = minetest.setting_getbool('underworlds_mod_integration')
|
|
if underworlds_mod.integration == nil then
|
|
underworlds_mod.integration = false
|
|
end
|
|
|
|
|
|
underworlds_mod.underzones = {
|
|
Caina = {
|
|
name = 'Caina',
|
|
ceiling_node = 'default:ice',
|
|
column_node = 'default:ice',
|
|
column_node_rare = 'underworlds:thin_ice',
|
|
floor_node = 'default:ice',
|
|
high_chunk = -22,
|
|
low_chunk = -25,
|
|
regular_columns = false,
|
|
stalactite = 'underworlds:icicle_down',
|
|
stalactite_chance = 12,
|
|
stone_depth = 2,
|
|
vary = true,
|
|
},
|
|
Phlegethos = {
|
|
name = 'Phlegethos',
|
|
ceiling_node = 'underworlds:black_sand',
|
|
column_node = 'default:stone',
|
|
column_node_rare = 'underworlds:hot_stone',
|
|
floor_node = 'caverealms:hot_cobble',
|
|
fluid = 'default:lava_source',
|
|
fluid_chance = 1200,
|
|
high_chunk = -26,
|
|
low_chunk = -28,
|
|
lake = 'default:lava_source',
|
|
lake_level = 5,
|
|
regular_columns = false,
|
|
stone_depth = 1,
|
|
vary = true,
|
|
},
|
|
Dis = {
|
|
name = 'Dis',
|
|
ceiling_height = 2,
|
|
ceiling_node = 'underworlds:hot_brass',
|
|
city = true,
|
|
column_node = 'default:steelblock',
|
|
floor_depth = 10,
|
|
floor_node = 'underworlds:hot_brass',
|
|
high_chunk = -30,
|
|
low_chunk = -30,
|
|
regular_columns = true,
|
|
stone_depth = 1,
|
|
vary = false,
|
|
},
|
|
Minauros = {
|
|
name = 'Minauros',
|
|
ceiling_node = 'underworlds:black_sand',
|
|
column_node = 'underworlds:polluted_dirt',
|
|
column_node_rare = 'underworlds:glowing_fungal_stone',
|
|
floor_node = 'underworlds:polluted_dirt',
|
|
fluid = 'underworlds:water_poison_source',
|
|
fluid_chance = 2000,
|
|
high_chunk = -32,
|
|
lake = 'underworlds:water_poison_source',
|
|
lake_level = 10,
|
|
low_chunk = -35,
|
|
regular_columns = false,
|
|
stone_depth = 2,
|
|
vary = true,
|
|
},
|
|
Styx = {
|
|
name = 'Styx',
|
|
ceiling_node = 'default:dirt',
|
|
floor_node = 'default:dirt',
|
|
high_chunk = -36,
|
|
low_chunk = -40,
|
|
regular_columns = false,
|
|
stone_depth = 2,
|
|
sea_chunk = -16,
|
|
vary = true,
|
|
},
|
|
}
|
|
|
|
for _, uz in pairs(underworlds_mod.underzones) do
|
|
if uz.low_chunk and uz.high_chunk then
|
|
uz.lower_bound = uz.low_chunk * 80 - 32
|
|
uz.floor = uz.lower_bound + (uz.floor_depth or 20)
|
|
uz.upper_bound = uz.high_chunk * 80 + 47
|
|
uz.ceiling = uz.upper_bound - (uz.ceiling_height or 20)
|
|
end
|
|
if uz.sea_chunk then
|
|
uz.sealevel = uz.sea_chunk * 80
|
|
end
|
|
end
|
|
|
|
|
|
function underworlds_mod.clone_node(name)
|
|
if not (name and type(name) == 'string') then
|
|
return
|
|
end
|
|
|
|
local node = minetest.registered_nodes[name]
|
|
local node2 = table.copy(node)
|
|
return node2
|
|
end
|
|
|
|
|
|
underworlds_mod.place_schematic = function(minp, maxp, data, p2data, area, node, pos, schem, center)
|
|
if not (minp and maxp and data and p2data and area and node and pos and schem and type(data) == 'table' and type(p2data) == 'table' and type(schem) == 'table') then
|
|
return
|
|
end
|
|
|
|
local rot = math.random(4) - 1
|
|
local yslice = {}
|
|
if schem.yslice_prob then
|
|
for _, ys in pairs(schem.yslice_prob) do
|
|
yslice[ys.ypos] = ys.prob
|
|
end
|
|
end
|
|
|
|
if center then
|
|
pos.x = pos.x - math.floor(schem.size.x / 2)
|
|
pos.z = pos.z - math.floor(schem.size.z / 2)
|
|
end
|
|
|
|
for z1 = 0, schem.size.z - 1 do
|
|
for x1 = 0, schem.size.x - 1 do
|
|
local x, z
|
|
if rot == 0 then
|
|
x, z = x1, z1
|
|
elseif rot == 1 then
|
|
x, z = schem.size.z - z1 - 1, x1
|
|
elseif rot == 2 then
|
|
x, z = schem.size.x - x1 - 1, schem.size.z - z1 - 1
|
|
elseif rot == 3 then
|
|
x, z = z1, schem.size.x - x1 - 1
|
|
end
|
|
local dz = pos.z - minp.z + z
|
|
local dx = pos.x - minp.x + x
|
|
if pos.x + x > minp.x and pos.x + x < maxp.x and pos.z + z > minp.z and pos.z + z < maxp.z then
|
|
local ivm = area:index(pos.x + x, pos.y, pos.z + z)
|
|
local isch = z1 * schem.size.y * schem.size.x + x1 + 1
|
|
local math_random = math.random
|
|
for y = 0, schem.size.y - 1 do
|
|
local dy = pos.y - minp.y + y
|
|
if yslice[y] or 255 >= math_random(255) then
|
|
local prob = schem.data[isch].prob or schem.data[isch].param1 or 255
|
|
if prob >= math_random(255) and schem.data[isch].name ~= "air" then
|
|
data[ivm] = node[schem.data[isch].name]
|
|
end
|
|
local param2 = schem.data[isch].param2 or 0
|
|
p2data[ivm] = param2
|
|
end
|
|
|
|
ivm = ivm + area.ystride
|
|
isch = isch + schem.size.x
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- Create and initialize a table for a schematic.
|
|
function underworlds_mod.schematic_array(width, height, depth)
|
|
if not (width and height and depth and type(width) == 'number' and type(height) == 'number' and type(depth) == 'number') then
|
|
return
|
|
end
|
|
|
|
-- Dimensions of data array.
|
|
local s = {size={x=width, y=height, z=depth}}
|
|
s.data = {}
|
|
|
|
for z = 0,depth-1 do
|
|
for y = 0,height-1 do
|
|
for x = 0,width-1 do
|
|
local i = z*width*height + y*width + x + 1
|
|
s.data[i] = {}
|
|
s.data[i].name = "air"
|
|
s.data[i].param1 = 000
|
|
end
|
|
end
|
|
end
|
|
|
|
s.yslice_prob = {}
|
|
|
|
return s
|
|
end
|
|
|
|
|
|
dofile(underworlds_mod.path .. "/deco.lua")
|
|
dofile(underworlds_mod.path .. "/mapgen.lua")
|