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
@ -1,3 +0,0 @@
|
||||
bones
|
||||
dungeon_loot?
|
||||
intllib?
|
@ -106,6 +106,17 @@ bones_loot.get_loot = function(pos, loot_type, max_stacks, exclusive_loot_type)
|
||||
return items
|
||||
end
|
||||
|
||||
local bones_formspec =
|
||||
"size[8,9]" ..
|
||||
"list[current_name;main;0,0.3;8,4;]" ..
|
||||
"list[current_player;main;0,4.85;8,1;]" ..
|
||||
"list[current_player;main;0,6.08;8,3;8]" ..
|
||||
"listring[current_name;main]" ..
|
||||
"listring[current_player;main]"
|
||||
if minetest.get_modpath("default") then
|
||||
bones_formspec = bones_formspec .. default.get_hotbar_bg(0,4.85)
|
||||
end
|
||||
|
||||
bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusive_loot_type)
|
||||
minetest.set_node(pos, {name="bones:bones", param2 = math.random(1,4)-1})
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -113,6 +124,7 @@ bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusiv
|
||||
infotext = S("Someone's old bones")
|
||||
end
|
||||
meta:set_string("infotext", infotext)
|
||||
meta:set_string("formspec", bones_formspec)
|
||||
|
||||
if max_stacks and max_stacks > 0 then
|
||||
local loot = bones_loot.get_loot(pos, loot_type, max_stacks, exclusive_loot_type)
|
||||
@ -123,3 +135,15 @@ bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusiv
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Repair underworld bones formspec",
|
||||
name = "bones_loot:repair_underworld_bones_formspec",
|
||||
nodenames = {"bones:bones"},
|
||||
action = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if not meta:get("formspec") then
|
||||
meta:set_string("formspec", bones_formspec)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
@ -1,4 +1,4 @@
|
||||
name = bones_loot
|
||||
description = An API that allows bones to be placed procedurally with randomly generated loot
|
||||
depends = bones
|
||||
optional_depends = dungeon_loot, intllib
|
||||
optional_depends = dungeon_loot, intllib, default
|
@ -7,11 +7,11 @@ local print_settingtypes = false
|
||||
local function setting(stype, name, default, description)
|
||||
local value
|
||||
if stype == "bool" then
|
||||
value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
|
||||
elseif stype == "string" then
|
||||
value = minetest.setting_get(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
|
||||
elseif stype == "int" or stype == "float" then
|
||||
value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name))
|
||||
value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name))
|
||||
end
|
||||
if value == nil then
|
||||
value = default
|
||||
@ -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")
|
||||
|
@ -1,10 +0,0 @@
|
||||
default
|
||||
subterrane
|
||||
df_farming?
|
||||
df_trees
|
||||
df_mapitems
|
||||
ice_sprites?
|
||||
oil?
|
||||
df_underworld_items?
|
||||
magma_conduits?
|
||||
bones_loot?
|
@ -1 +0,0 @@
|
||||
Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels.
|
@ -49,8 +49,14 @@ bones_loot.register_loot({
|
||||
{name = "binoculars:binoculars", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "boats:boat", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "bucket:bucket_empty", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "fire:flint_and_steel", chance = 0.3, count = {1,2}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:tulip_black", chance = 0.01, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "fire:flint_and_steel", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:tulip_black", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:dandelion_white", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:dandelion_yellow", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:rose", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:tulip", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:chrysanthemum_green", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "flowers:geranium", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "map:mapping_kit", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "screwdriver:screwdriver", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
-- don't give the player tnt:tnt, they can craft that from this if tnt is enabled for them
|
||||
@ -70,10 +76,10 @@ bones_loot.register_loot({
|
||||
{name = "default:pick_steel", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:pick_mese", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:pick_diamond", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_bronze", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_steel", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_mese", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_diamond", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_bronze", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_steel", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_mese", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:shovel_diamond", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:axe_bronze", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:axe_steel", chance = 0.5, count = {1,1}, types = {"underworld_warrior"}},
|
||||
{name = "default:axe_mese", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}},
|
||||
|
@ -15,4 +15,5 @@ dofile(modpath.."/sunless_sea.lua")
|
||||
dofile(modpath.."/oil_sea.lua")
|
||||
dofile(modpath.."/lava_sea.lua")
|
||||
dofile(modpath.."/underworld.lua")
|
||||
dofile(modpath.."/dungeon_loot.lua")
|
||||
dofile(modpath.."/primordial.lua")
|
||||
dofile(modpath.."/dungeon_loot.lua")
|
||||
|
@ -137,11 +137,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
--write it to world
|
||||
vm:write_to_map()
|
||||
|
||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
||||
if chunk_generation_time < 1000 then
|
||||
minetest.log("info", "[df_caverns] lava sea mapblock generation took "..chunk_generation_time.." ms") --tell people how long
|
||||
else
|
||||
minetest.log("warning", "[df_caverns] lava sea took "..chunk_generation_time.." ms to generate map block "
|
||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
||||
end
|
||||
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||
mapgen_helper.record_time("df_caverns lava sea", time_taken)
|
||||
end)
|
@ -96,8 +96,9 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
|
||||
-- Partly fill flooded caverns and warrens
|
||||
if minp.y <= subsea_level then
|
||||
for vi in area:iterp(minp, maxp) do
|
||||
if data[vi] == c_air and area:get_y(vi) <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then
|
||||
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||
-- convert all air below sea level into water
|
||||
if y <= subsea_level and data[vi] == c_air and nvals_cave[vi] < -flooding_threshold then
|
||||
data[vi] = c_water
|
||||
end
|
||||
end
|
||||
@ -111,7 +112,7 @@ local decorate_level_1 = 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 abs_cracks = math.abs(nvals_cracks[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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||
-- underwater floor
|
||||
@ -137,7 +138,7 @@ local decorate_level_1 = 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 abs_cracks = math.abs(nvals_cracks[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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||
-- underwater ceiling, do nothing
|
||||
@ -164,7 +165,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
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
|
||||
@ -182,7 +183,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
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
|
||||
@ -210,7 +211,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[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
|
||||
@ -249,7 +250,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
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
|
||||
@ -268,7 +269,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0)
|
||||
local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
|
||||
|
||||
if dry and data[vi] == c_wet_flowstone then
|
||||
data[vi] = c_dry_flowstone
|
||||
@ -300,4 +301,5 @@ subterrane.register_layer({
|
||||
decorate = decorate_level_1,
|
||||
warren_region_variability_threshold = 0.33,
|
||||
double_frequency = true,
|
||||
is_ground_content = df_caverns.is_ground_content,
|
||||
})
|
@ -79,7 +79,7 @@ local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
||||
elseif math.random() < 0.02 then
|
||||
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_red)
|
||||
elseif math.random() < 0.015 then
|
||||
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data)
|
||||
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2)
|
||||
end
|
||||
end
|
||||
|
||||
@ -98,7 +98,7 @@ local spore_tree_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
||||
if math.random() < 0.1 then
|
||||
df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist)
|
||||
elseif math.random() < 0.05 then
|
||||
df_trees.spawn_spore_tree_vm(vi+ystride, area, data)
|
||||
df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -135,28 +135,29 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
local cavern_def = node_arrays.cavern_def
|
||||
|
||||
local vein_noise
|
||||
local vein_area
|
||||
|
||||
-- Partly fill flooded caverns and warrens
|
||||
for vi in area:iterp(minp, maxp) do
|
||||
local cave_val = nvals_cave[cave_area:transform(area, vi)]
|
||||
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||
local cave_val = nvals_cave[vi]
|
||||
if cave_val < -flooding_threshold then
|
||||
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
local cave_threshold = cavern_def.cave_threshold
|
||||
if mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp) then
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
local cave_threshold = cavern_def.cave_threshold
|
||||
|
||||
--check if we're just inside the boundary of the (negazone) cavern threshold
|
||||
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
||||
-- add giant rooty structures to the flooded barren caverns
|
||||
if vein_noise == nil then
|
||||
vein_noise = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
|
||||
end
|
||||
-- we can reuse cave_area here, its extents are minp, maxp too.
|
||||
if data[vi] == c_air and math.abs(vein_noise[cave_area:transform(area, vi)]) < 0.02 then
|
||||
data[vi] = c_veinstone
|
||||
--check if we're just inside the boundary of the (negazone) cavern threshold
|
||||
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
||||
-- add giant rooty structures to the flooded barren caverns
|
||||
if vein_noise == nil then
|
||||
vein_noise, vein_area = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
|
||||
end
|
||||
if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then
|
||||
data[vi] = c_veinstone
|
||||
end
|
||||
end
|
||||
end
|
||||
if data[vi] == c_air and area:get_y(vi) <= subsea_level then
|
||||
if data[vi] == c_air and y <= subsea_level then
|
||||
data[vi] = c_water -- otherwise, fill air with water when below sea level
|
||||
end
|
||||
end
|
||||
@ -170,7 +171,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 abs_cracks = math.abs(nvals_cracks[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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||
-- underwater floor
|
||||
@ -198,7 +199,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 abs_cracks = math.abs(nvals_cracks[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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||
-- underwater ceiling, do nothing
|
||||
@ -230,7 +231,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
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
|
||||
@ -248,7 +249,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[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
|
||||
@ -287,7 +288,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
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
|
||||
@ -305,7 +306,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[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
|
||||
@ -345,7 +346,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0)
|
||||
local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
|
||||
|
||||
if dry and data[vi] == c_wet_flowstone then
|
||||
data[vi] = c_dry_flowstone
|
||||
@ -375,5 +376,6 @@ subterrane.register_layer({
|
||||
decorate = decorate_level_2,
|
||||
warren_region_variability_threshold = 0.33,
|
||||
double_frequency = true,
|
||||
is_ground_content = df_caverns.is_ground_content,
|
||||
})
|
||||
|
||||
|
@ -28,7 +28,7 @@ if minetest.get_modpath("ice_sprites") then
|
||||
c_sprite = minetest.get_content_id("ice_sprites:ice_sprite")
|
||||
end
|
||||
|
||||
local subsea_level = df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33
|
||||
local subsea_level = math.floor(df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33)
|
||||
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold)
|
||||
|
||||
local ice_thickness = 3
|
||||
@ -165,7 +165,7 @@ local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
||||
if abs_cracks < 0.075 then
|
||||
if vert_rand < 0.004 then
|
||||
subterrane.big_stalagmite(ai, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
|
||||
elseif data[vi] ~= air and math.random() < 0.5 then
|
||||
elseif data[vi] ~= c_air and math.random() < 0.5 then
|
||||
data[vi] = c_salty_cobble
|
||||
if data[ai] == c_air and math.random() < 0.25 then
|
||||
data[ai] = c_salt_crystal
|
||||
@ -207,25 +207,25 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
|
||||
-- Partly fill flooded caverns and warrens
|
||||
if minp.y <= subsea_level then
|
||||
for vi in area:iterp(minp, maxp) do
|
||||
local y = area:get_y(vi)
|
||||
if y <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then
|
||||
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||
local cave = nvals_cave[vi]
|
||||
if y <= subsea_level and cave < -flooding_threshold then
|
||||
if data[vi] == c_air and y <= subsea_level then
|
||||
data[vi] = c_water
|
||||
end
|
||||
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
|
||||
if biome_name == "blackcap" then
|
||||
-- oil slick
|
||||
local cave = math.abs(nvals_cave[cave_area:transform(area, vi)])
|
||||
if y == subsea_level and data[vi] == c_water and cave + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
|
||||
data[vi] = c_oil
|
||||
if (mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp)) then
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
if biome_name == "blackcap" then
|
||||
-- oil slick
|
||||
if y == subsea_level and data[vi] == c_water and math.abs(cave) + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
|
||||
data[vi] = c_oil
|
||||
end
|
||||
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
||||
-- floating ice
|
||||
data[vi] = c_ice
|
||||
end
|
||||
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
||||
-- floating ice
|
||||
data[vi] = c_ice
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -240,7 +240,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||
local cracks = nvals_cracks[index2d]
|
||||
local abs_cracks = math.abs(cracks)
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||
-- underwater floor
|
||||
@ -285,7 +285,7 @@ local decorate_level_3 = 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 abs_cracks = math.abs(nvals_cracks[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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||
-- underwater ceiling, do nothing
|
||||
@ -321,7 +321,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
else
|
||||
-- bloodthorn ceiling
|
||||
if abs_cracks < 0.075 then
|
||||
if data[vi] ~= air and math.random() < 0.5 then
|
||||
if data[vi] ~= c_air and math.random() < 0.5 then
|
||||
data[vi] = c_salty_cobble
|
||||
local bi = vi - area.ystride
|
||||
if data[bi] == c_air and math.random() < 0.25 then
|
||||
@ -346,7 +346,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||
if flooded_caverns or biome_name == "blackcap" then
|
||||
@ -364,7 +364,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||
if flooded_caverns or biome_name == "blackcap" then
|
||||
@ -393,7 +393,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||
-- underwater ceiling, do nothing
|
||||
@ -431,7 +431,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||
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 flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||
|
||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||
-- underwater floor, do nothing
|
||||
@ -473,7 +473,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||
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
|
||||
local flooded_caverns = nvals_cave[vi] < 0
|
||||
|
||||
if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then
|
||||
if not flooded_caverns then
|
||||
@ -527,4 +527,5 @@ subterrane.register_layer({
|
||||
decorate = decorate_level_3,
|
||||
warren_region_variability_threshold = 0.33,
|
||||
double_frequency = true,
|
||||
is_ground_content = df_caverns.is_ground_content,
|
||||
})
|
||||
|
26
df_caverns/locale/template.pot
Normal file
@ -0,0 +1,26 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-01-25 13:52-0700\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: df_caverns\underworld.lua:12
|
||||
msgid "A glowing pit"
|
||||
msgstr ""
|
||||
|
||||
#: df_caverns\underworld.lua:27
|
||||
msgid "A mysterious seal"
|
||||
msgstr ""
|
6
df_caverns/locale/update.bat
Normal file
@ -0,0 +1,6 @@
|
||||
@echo off
|
||||
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
|
||||
cd ..
|
||||
set LIST=
|
||||
for /r %%X in (*.lua) do set LIST=!LIST! %%X
|
||||
..\..\intllib\tools\xgettext.bat %LIST%
|
@ -1,4 +1,4 @@
|
||||
name = df_caverns
|
||||
description = Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels.
|
||||
depends = default, subterrane, df_trees, df_mapitems
|
||||
optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot
|
||||
optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot, named_waypoints, namegen, fireflies
|
@ -102,13 +102,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
--write it to world
|
||||
vm:write_to_map()
|
||||
|
||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
||||
if chunk_generation_time < 1000 then
|
||||
minetest.log("info", "[df_caverns] oil sea mapblock generation took "..chunk_generation_time.." ms") --tell people how long
|
||||
else
|
||||
minetest.log("warning", "[df_caverns] oil sea took "..chunk_generation_time.." ms to generate map block "
|
||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
||||
end
|
||||
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||
mapgen_helper.record_time("df_caverns oil sea", time_taken)
|
||||
end)
|
||||
|
||||
minetest.register_ore({
|
||||
|
425
df_caverns/primordial.lua
Normal file
@ -0,0 +1,425 @@
|
||||
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*0.5, 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*0.5, z=df_caverns.config.horizontal_cavern_scale},
|
||||
seed = 923444,
|
||||
octaves = 6,
|
||||
persist = 0.63
|
||||
}
|
||||
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10
|
||||
|
||||
-----------------------------------------------------------------------------------------
|
||||
-- Fungal biome
|
||||
|
||||
local c_orb = minetest.get_content_id("df_primordial_items:glow_orb_hanging")
|
||||
local c_mycelial_dirt = minetest.get_content_id("df_primordial_items:dirt_with_mycelium")
|
||||
local c_dirt = minetest.get_content_id("default:dirt")
|
||||
local c_giant_mycelium = minetest.get_content_id("df_primordial_items:giant_hypha_apical_mapgen")
|
||||
|
||||
local fungal_plants = {
|
||||
minetest.get_content_id("df_primordial_items:fungal_grass_1"),
|
||||
minetest.get_content_id("df_primordial_items:fungal_grass_2"),
|
||||
minetest.get_content_id("df_primordial_items:glow_orb"),
|
||||
minetest.get_content_id("df_primordial_items:glow_orb_stalks"),
|
||||
minetest.get_content_id("df_primordial_items:glow_pods"),
|
||||
}
|
||||
|
||||
local fungal_plant_names = {}
|
||||
local fungal_plants = {}
|
||||
for node_name, node_def in pairs(minetest.registered_nodes) do
|
||||
if minetest.get_item_group(node_name, "primordial_fungal_plant") > 0 then
|
||||
table.insert(fungal_plant_names, node_name)
|
||||
table.insert(fungal_plants, minetest.get_content_id(node_name))
|
||||
end
|
||||
end
|
||||
|
||||
local mushroom_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
local humidityfactor = humidity/200 + 0.5
|
||||
abs_cracks = abs_cracks * humidityfactor
|
||||
|
||||
if abs_cracks < 0.7 then
|
||||
data[vi] = c_mycelial_dirt
|
||||
elseif abs_cracks < 1 then
|
||||
data[vi] = c_dirt
|
||||
end
|
||||
|
||||
local rand = math.random() * math.min(abs_cracks, 1) * humidityfactor
|
||||
if rand < 0.0005 then
|
||||
local mycelium_index = vi+ystride
|
||||
data[mycelium_index] = c_giant_mycelium
|
||||
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||
elseif rand < 0.003 then
|
||||
local schematic = df_primordial_items.get_primordial_mushroom()
|
||||
local rotation = (math.random(1,4)-1)*90
|
||||
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), schematic, rotation)
|
||||
elseif rand < 0.05 then
|
||||
data[vi+ystride] = fungal_plants[math.random(1,5)]
|
||||
end
|
||||
end
|
||||
|
||||
local mushroom_cavern_ceiling = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
local humidityfactor = humidity/200 + 0.5
|
||||
abs_cracks = abs_cracks * humidityfactor
|
||||
|
||||
if abs_cracks < 0.5 then
|
||||
data[vi] = c_mycelial_dirt
|
||||
if abs_cracks < 0.3 then
|
||||
local rand = math.random() * humidityfactor
|
||||
if rand < 0.002 then
|
||||
local mycelium_index = vi-ystride
|
||||
data[mycelium_index] = c_giant_mycelium
|
||||
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||
elseif rand < 0.03 then
|
||||
df_primordial_items.spawn_ceiling_spire_vm(vi, area, data)
|
||||
elseif rand < 0.2 then
|
||||
data[vi-ystride] = c_orb
|
||||
data_param2[vi-ystride] = math.random(0,179)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local mushroom_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
|
||||
if abs_cracks < 0.3 then
|
||||
data[vi] = c_mycelial_dirt
|
||||
if abs_cracks < 0.2 then
|
||||
local rand = math.random()
|
||||
if rand < 0.001 then
|
||||
local mycelium_index = vi-ystride
|
||||
data[mycelium_index] = c_giant_mycelium
|
||||
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||
elseif rand < 0.2 then
|
||||
data[vi-ystride] = c_orb
|
||||
data_param2[vi-ystride] = math.random(0,179)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local mushroom_warren_floor = function(abs_cracks, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
if abs_cracks < 0.7 then
|
||||
data[vi] = c_mycelial_dirt
|
||||
elseif abs_cracks < 1 then
|
||||
data[vi] = c_dirt
|
||||
end
|
||||
local rand = math.random() * math.min(abs_cracks, 1)
|
||||
if rand < 0.001 then
|
||||
local mycelium_index = vi+ystride
|
||||
data[mycelium_index] = c_giant_mycelium
|
||||
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||
elseif rand < 0.03 then
|
||||
data[vi+ystride] = fungal_plants[math.random(1,5)]
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------------------------
|
||||
-- Jungle biome
|
||||
|
||||
local jungle_plant_names = {}
|
||||
local jungle_plants = {}
|
||||
for node_name, node_def in pairs(minetest.registered_nodes) do
|
||||
if minetest.get_item_group(node_name, "primordial_jungle_plant") > 0 then
|
||||
table.insert(jungle_plant_names, node_name)
|
||||
table.insert(jungle_plants, minetest.get_content_id(node_name))
|
||||
end
|
||||
end
|
||||
|
||||
local c_jungle_dirt = minetest.get_content_id("df_primordial_items:dirt_with_jungle_grass")
|
||||
local c_plant_matter = minetest.get_content_id("df_primordial_items:plant_matter")
|
||||
local c_packed_roots = minetest.get_content_id("df_primordial_items:packed_roots")
|
||||
local c_glowstone = minetest.get_content_id("df_underworld_items:glowstone")
|
||||
local c_ivy = minetest.get_content_id("df_primordial_items:jungle_ivy")
|
||||
local c_root_2 = minetest.get_content_id("df_primordial_items:jungle_roots_2")
|
||||
local c_root_1 = minetest.get_content_id("df_primordial_items:jungle_roots_1")
|
||||
|
||||
local c_fireflies
|
||||
if minetest.get_modpath("fireflies") then
|
||||
c_fireflies = minetest.get_content_id("fireflies:firefly")
|
||||
end
|
||||
|
||||
local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
local humidityfactor = humidity/100
|
||||
|
||||
data[vi] = c_jungle_dirt
|
||||
|
||||
local rand = math.random()
|
||||
if rand < 0.025 * humidityfactor then
|
||||
local fern_schematic = df_primordial_items.get_fern_schematic()
|
||||
local rotation = (math.random(1,4)-1)*90
|
||||
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), fern_schematic, rotation)
|
||||
elseif rand < 0.025 * (1-humidityfactor) then
|
||||
df_primordial_items.spawn_jungle_mushroom_vm(vi+ystride, area, data)
|
||||
elseif rand < 0.05 * (1-humidityfactor) then
|
||||
df_primordial_items.spawn_jungle_tree_vm(math.random(8,14), vi+ystride, area, data)
|
||||
elseif rand < 0.3 then
|
||||
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
|
||||
end
|
||||
|
||||
if c_fireflies and math.random() < 0.01 then
|
||||
local firefly_vi = vi + ystride * math.random(1, 5)
|
||||
if data[firefly_vi] == c_air then
|
||||
data[firefly_vi] = c_fireflies
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local jungle_cavern_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||
if abs_cracks < 0.25 then
|
||||
data[vi] = c_glowstone
|
||||
elseif abs_cracks > 0.75 and math.random() < 0.1 then
|
||||
local ystride = area.ystride
|
||||
data[vi] = c_dirt
|
||||
local index = vi - ystride
|
||||
local hanging_node
|
||||
if math.random() < 0.5 then
|
||||
hanging_node = c_ivy
|
||||
else
|
||||
hanging_node = c_root_2
|
||||
end
|
||||
for i = 1, math.random(16) do
|
||||
if data[index] == c_air then
|
||||
data[index] = hanging_node
|
||||
index = index - ystride
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local jungle_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||
if abs_cracks < 0.1 then
|
||||
data[vi] = c_glowstone
|
||||
elseif abs_cracks > 0.75 and math.random() < 0.1 then
|
||||
local ystride = area.ystride
|
||||
data[vi] = c_dirt
|
||||
local index = vi - ystride
|
||||
local hanging_node
|
||||
if math.random() < 0.5 then
|
||||
hanging_node = c_root_1
|
||||
else
|
||||
hanging_node = c_root_2
|
||||
end
|
||||
for i = 1, math.random(8) do
|
||||
if data[index] == c_air then
|
||||
data[index] = hanging_node
|
||||
index = index - ystride
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local jungle_warren_floor = function(abs_cracks, vi, area, data, data_param2)
|
||||
local ystride = area.ystride
|
||||
if abs_cracks < 0.7 then
|
||||
data[vi] = c_jungle_dirt
|
||||
local rand = math.random() * abs_cracks
|
||||
if rand < 0.1 then
|
||||
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
|
||||
end
|
||||
elseif abs_cracks < 1 then
|
||||
data[vi] = c_dirt
|
||||
end
|
||||
|
||||
if c_fireflies and math.random() < 0.005 then
|
||||
local firefly_vi = vi + ystride * math.random(1, 5)
|
||||
if data[firefly_vi] == c_air then
|
||||
data[firefly_vi] = c_fireflies
|
||||
end
|
||||
end
|
||||
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
|
||||
|
||||
local humiditymap = minetest.get_mapgen_object("humiditymap")
|
||||
|
||||
|
||||
---------------------------------------------------------
|
||||
-- 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 humidity = humiditymap[index2d]
|
||||
local jungle = nvals_cave[vi] < 0
|
||||
|
||||
if jungle then
|
||||
jungle_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2)
|
||||
else
|
||||
mushroom_cavern_floor(abs_cracks, humidity, 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[vi] < 0
|
||||
local humidity = humiditymap[index2d]
|
||||
if jungle then
|
||||
jungle_cavern_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||
else
|
||||
mushroom_cavern_ceiling(abs_cracks, humidity, 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
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local cracks = nvals_cracks[index2d]
|
||||
local abs_cracks = math.abs(cracks)
|
||||
local jungle = nvals_cave[vi] < 0
|
||||
|
||||
if jungle then
|
||||
jungle_warren_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||
else
|
||||
mushroom_warren_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
----------------------------------------------
|
||||
-- Warren floors
|
||||
|
||||
for _, vi in ipairs(node_arrays.warren_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[vi] < 0
|
||||
|
||||
if jungle then
|
||||
jungle_warren_floor(abs_cracks, vi, area, data, data_param2)
|
||||
else
|
||||
mushroom_warren_floor(abs_cracks, vi, area, data, data_param2)
|
||||
end
|
||||
end
|
||||
|
||||
-- columns
|
||||
-- no flowstone below the Sunless Sea, replace with something else
|
||||
local random_dir = {1, -1, area.zstride, -area.zstride}
|
||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||
local jungle = nvals_cave[vi] < 0
|
||||
if jungle then
|
||||
data[vi] = c_plant_matter
|
||||
minetest.get_node_timer(area:position(vi)):start(math.random(30, 120))
|
||||
else
|
||||
data[vi] = c_mycelial_dirt
|
||||
if math.random() < 0.05 then
|
||||
local rand_vi = vi + random_dir[math.random(1,4)]
|
||||
if data[rand_vi] == c_air then
|
||||
data[rand_vi] = c_giant_mycelium
|
||||
minetest.get_node_timer(area:position(rand_vi)):start(math.random(1,giant_mycelium_timer_spread))
|
||||
end
|
||||
end
|
||||
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 = "default:stone", -- no flowstone below the Sunless Sea, replace with something else
|
||||
weight = 0.5,
|
||||
maximum_count = 60,
|
||||
minimum_count = 10,
|
||||
},
|
||||
decorate = decorate_primordial,
|
||||
double_frequency = true,
|
||||
is_ground_content = df_caverns.is_ground_content,
|
||||
})
|
||||
|
||||
-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there.
|
||||
minetest.register_abm({
|
||||
label = "Primordial plant growth",
|
||||
nodenames = {"df_primordial_items:dirt_with_jungle_grass"},
|
||||
neighbors = {"air"},
|
||||
interval = 60.0,
|
||||
chance = 50,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if minetest.find_node_near(pos, 2, {"group:primordial_jungle_plant"}) == nil then
|
||||
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local node_above = minetest.get_node(pos_above)
|
||||
if node_above.name == "air" then
|
||||
minetest.set_node(pos_above, {name = jungle_plant_names[math.random(1,#jungle_plant_names)]})
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
label = "Primordial fungus growth",
|
||||
nodenames = {"df_primordial_items:dirt_with_mycelium"},
|
||||
neighbors = {"air"},
|
||||
interval = 60.0,
|
||||
chance = 50,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
if minetest.find_node_near(pos, 3, {"group:primordial_fungal_plant"}) == nil then
|
||||
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local node_above = minetest.get_node(pos_above)
|
||||
if node_above.name == "air" then
|
||||
minetest.set_node(pos_above, {name = fungal_plant_names[math.random(1,#fungal_plant_names)]})
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 146 KiB |
BIN
df_caverns/screenshots/mysterious_seal.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
df_caverns/screenshots/primordial_fungal.jpg
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
df_caverns/screenshots/primordial_jungle.jpg
Normal file
After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 40 KiB |
@ -37,4 +37,37 @@ 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
|
||||
dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8
|
||||
|
||||
[Underworld feature HUD]
|
||||
|
||||
dfcaverns_underworld_hud_requires_item (Require an item to view waypoints) bool true
|
||||
#Players can still discover the locations of volcanoes without this, but waypoints
|
||||
#will only be visible in their hud if they have this item in their inventory. You can also
|
||||
#specify "group:groupname" here. Leave it blank to default to map:mapping_kit.
|
||||
dfcaverns_underworld_hud_item_required (Specify the item or group required) string map:mapping_kit
|
||||
|
||||
|
||||
dfcaverns_show_pits_in_hud (Show pit locations in HUD) bool true
|
||||
dfcaverns_pit_discovery_range (Pit discovery range) int 60
|
||||
dfcaverns_pit_visibility_range (Pit visibility range) int 500
|
||||
|
||||
dfcaverns_show_seals_in_hud (Seal locations in HUD) bool true
|
||||
dfcaverns_seal_discovery_range (Seal discovery range) int 10
|
||||
dfcaverns_seal_visibility_range (Seal visibility range) int 200
|
||||
|
||||
dfcaverns_show_ruins_in_hud (Ruin locations visible in HUD) bool true
|
||||
dfcaverns_ruin_discovery_range (Ruin discovery range) int 40
|
||||
dfcaverns_ruin_visibility_range (Ruin visibility range) int 250
|
||||
|
||||
[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
|
||||
|
||||
# This setting is pretty technical, it spreads out the
|
||||
# construction of giant mycelium networks on mapgen
|
||||
# over this many seconds. If you're experiencing lag spikes
|
||||
# during mapgen of Primordial cavern layer mushroom caverns
|
||||
# then increasing this number may help.
|
||||
dcaverns_giant_mycelium_timer_spread (Giant Mycelium mapgen timer spread) int 10
|
@ -124,6 +124,9 @@ local content_in_list=function(content, list)
|
||||
end
|
||||
|
||||
df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet)
|
||||
if maxp.y > -30 then
|
||||
wet = false
|
||||
end
|
||||
local ystride = area.ystride
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local cracks = nvals_cracks[index2d]
|
||||
@ -148,6 +151,10 @@ df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, dat
|
||||
end
|
||||
|
||||
df_caverns.tunnel_ceiling = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet)
|
||||
if maxp.y > -30 then
|
||||
wet = false
|
||||
end
|
||||
|
||||
local ystride = area.ystride
|
||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||
local cracks = nvals_cracks[index2d]
|
||||
@ -207,4 +214,37 @@ df_caverns.place_shrub = function(vi, area, data, param2_data, shrub_list)
|
||||
|
||||
local shrub = shrub_list[math.random(#shrub_list)]
|
||||
shrub(vi, area, data, param2_data)
|
||||
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]
|
||||
end
|
@ -107,7 +107,7 @@ local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, da
|
||||
if math.random() < 0.01 then
|
||||
df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
|
||||
elseif math.random() < 0.01 then
|
||||
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data)
|
||||
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2)
|
||||
elseif math.random() < 0.02 then
|
||||
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
|
||||
end
|
||||
@ -131,7 +131,7 @@ local fungispore_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
||||
if math.random() < 0.025 then
|
||||
df_trees.spawn_fungiwood_vm(vi+ystride, area, data)
|
||||
elseif math.random() < 0.025 then
|
||||
df_trees.spawn_spore_tree_vm(vi+ystride, area, data)
|
||||
df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -223,15 +223,20 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d
|
||||
data[vi] = c_obsidian
|
||||
end
|
||||
end
|
||||
-- convert all air below sea level into water
|
||||
if y <= sea_level and data[vi] == c_air then
|
||||
data[vi] = c_water
|
||||
end
|
||||
else
|
||||
skip_next = false
|
||||
end
|
||||
end
|
||||
|
||||
if minp.y <= sea_level then
|
||||
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||
-- convert all air below sea level into water
|
||||
if y <= sea_level and data[vi] == c_air then
|
||||
data[vi] = c_water
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---------------------------------------------------------
|
||||
-- Cavern floors
|
||||
@ -375,6 +380,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d
|
||||
else
|
||||
data[vi] = c_coral_table[math.random(1,3)]
|
||||
data_param2[vi] = math.random(1,4)-1
|
||||
minetest.get_node_timer(area:position(vi)):start(math.random(10, 60))
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -401,4 +407,5 @@ subterrane.register_layer({
|
||||
},
|
||||
decorate = decorate_sunless_sea,
|
||||
double_frequency = false,
|
||||
is_ground_content = df_caverns.is_ground_content,
|
||||
})
|
||||
|
@ -1,8 +1,11 @@
|
||||
-- surface tunnels
|
||||
|
||||
local y_max = -10
|
||||
local y_max = 200
|
||||
local y_min = df_caverns.config.ymax
|
||||
|
||||
local c_stone = minetest.get_content_id("default:stone")
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
--if out of range of cave definition limits, abort
|
||||
if minp.y > y_max or maxp.y < y_min then
|
||||
@ -12,36 +15,55 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local t_start = os.clock()
|
||||
|
||||
local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2()
|
||||
|
||||
local eminp = {x=minp.x, y=area.MinEdge.y, z=minp.z}
|
||||
local emaxp = {x=maxp.x, y=area.MaxEdge.y, z=maxp.z}
|
||||
local minp_y = minp.y
|
||||
local maxp_y = maxp.y
|
||||
|
||||
local humiditymap = minetest.get_mapgen_object("humiditymap")
|
||||
local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks)
|
||||
|
||||
local previous_state = "outside_region"
|
||||
local previous_y = minp.y
|
||||
local previous_y = eminp.y-1
|
||||
|
||||
for vi, x, y, z in area:iterp_yxz(minp, maxp) do
|
||||
local previous_potential_floor_vi
|
||||
local previous_potential_floor_y
|
||||
local previous_node
|
||||
|
||||
for vi, x, y, z in area:iterp_yxz(eminp, emaxp) do
|
||||
|
||||
if y < previous_y then
|
||||
previous_state = "outside_region"
|
||||
-- we've started a new column, initialize everything
|
||||
previous_potential_floor_vi = nil
|
||||
previous_potential_floor_y = nil
|
||||
previous_node = nil
|
||||
end
|
||||
previous_y = y
|
||||
|
||||
if y < y_max then
|
||||
if mapgen_helper.buildable_to(data[vi]) then
|
||||
if previous_state == "in_rock" and not mapgen_helper.buildable_to(data[vi-area.ystride]) then
|
||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
||||
local humidity = humiditymap[index2d]
|
||||
df_caverns.tunnel_floor(minp, maxp, area, vi-area.ystride, nvals_cracks, data, data_param2, humidity > 30)
|
||||
local current_node = data[vi]
|
||||
if previous_node and y < y_max then
|
||||
if current_node == c_air and previous_node == c_stone then
|
||||
-- this may be a floor, but only if we eventually hit a ceiling in this column
|
||||
previous_potential_floor_vi = vi-area.ystride
|
||||
previous_potential_floor_y = y-1
|
||||
elseif current_node == c_stone and previous_node == c_air and previous_potential_floor_vi then
|
||||
-- we hit a ceiling after passing through a floor
|
||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
||||
local humidity = humiditymap[index2d]
|
||||
if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then
|
||||
df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30)
|
||||
end
|
||||
previous_state = "in_tunnel"
|
||||
else
|
||||
if previous_state == "in_tunnel" and not mapgen_helper.buildable_to(data[vi]) then
|
||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
||||
local humidity = humiditymap[index2d]
|
||||
if y <= maxp_y and y >= minp_y then
|
||||
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30)
|
||||
end
|
||||
previous_state = "in_rock"
|
||||
previous_potential_floor_vi = nil
|
||||
elseif not mapgen_helper.buildable_to(current_node) then
|
||||
-- we've entered a non-stone ceiling of some kind. Abort potential floor-ceiling pair detection.
|
||||
previous_potential_floor_vi = nil
|
||||
end
|
||||
end
|
||||
previous_node = current_node
|
||||
|
||||
end
|
||||
|
||||
--send data back to voxelmanip
|
||||
@ -55,12 +77,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
--write it to world
|
||||
vm:write_to_map()
|
||||
|
||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
||||
if chunk_generation_time < 1000 then
|
||||
minetest.log("info", "[df_caverns surface tunnels] "..chunk_generation_time.." ms") --tell people how long
|
||||
else
|
||||
minetest.log("warning", "[df_caverns surface tunnels] took "..chunk_generation_time.." ms to generate map block "
|
||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
||||
end
|
||||
|
||||
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||
mapgen_helper.record_time("df_caverns surface tunnels", time_taken)
|
||||
end)
|
||||
|
@ -1,10 +1,82 @@
|
||||
if not df_caverns.config.enable_underworld or not minetest.get_modpath("df_underworld_items") then
|
||||
return
|
||||
end
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local S = minetest.get_translator("df_caverns")
|
||||
|
||||
local bones_loot_path = minetest.get_modpath("bones_loot")
|
||||
local named_waypoints_path = minetest.get_modpath("named_waypoints")
|
||||
local namegen_path = minetest.get_modpath("namegen")
|
||||
|
||||
local name_pit = function() end
|
||||
local name_ruin = function() end
|
||||
|
||||
if named_waypoints_path then
|
||||
|
||||
local item_required = nil
|
||||
if minetest.settings:get_bool("dfcaverns_underworld_hud_requires_item", true) then
|
||||
local setting_item_required = minetest.settings:get("dfcaverns_underworld_hud_item_required")
|
||||
if setting_item_required == nil or setting_item_required == "" then
|
||||
setting_item_required = "map:mapping_kit"
|
||||
end
|
||||
item_required = setting_item_required
|
||||
end
|
||||
|
||||
local pit_waypoint_def = {
|
||||
default_name = S("A glowing pit"),
|
||||
default_color = 0xFF88FF,
|
||||
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_discovery_range")) or 60,
|
||||
visibility_requires_item = item_required,
|
||||
}
|
||||
|
||||
if minetest.settings:get_bool("dfcaverns_show_pits_in_hud", true) then
|
||||
pit_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_visibility_range")) or 500
|
||||
pit_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
|
||||
end
|
||||
named_waypoints.register_named_waypoints("glowing_pits", pit_waypoint_def)
|
||||
|
||||
local seal_waypoint_def = {
|
||||
default_name = S("Mysterious seal"),
|
||||
default_color = 0x9C2233,
|
||||
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_discovery_range")) or 10,
|
||||
visibility_requires_item = item_required,
|
||||
}
|
||||
|
||||
if minetest.settings:get_bool("dfcaverns_show_seals_in_hud", true) then
|
||||
seal_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_visibility_range")) or 200
|
||||
seal_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
|
||||
end
|
||||
named_waypoints.register_named_waypoints("puzzle_seals", seal_waypoint_def)
|
||||
|
||||
if namegen_path then
|
||||
namegen.parse_lines(io.lines(modpath.."/underworld_names.cfg"))
|
||||
|
||||
name_pit = function()
|
||||
return namegen.generate("glowing_pits")
|
||||
end
|
||||
name_ruin = function()
|
||||
return namegen.generate("underworld_ruins")
|
||||
end
|
||||
|
||||
local underworld_ruin_def = {
|
||||
default_name = S("Ancient ruin"),
|
||||
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_discovery_range")) or 40,
|
||||
visibility_requires_item = item_required,
|
||||
}
|
||||
if minetest.settings:get_bool("dfcaverns_show_ruins_in_hud", true) then
|
||||
underworld_ruin_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_visibility_range")) or 250
|
||||
underworld_ruin_def.on_discovery = named_waypoints.default_discovery_popup
|
||||
end
|
||||
|
||||
named_waypoints.register_named_waypoints("underworld_ruins", underworld_ruin_def)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
local c_slade = minetest.get_content_id("df_underworld_items:slade")
|
||||
local c_slade_block = minetest.get_content_id("df_underworld_items:slade_block")
|
||||
local c_air = minetest.get_content_id("air")
|
||||
local c_water = minetest.get_content_id("default:water_source")
|
||||
|
||||
@ -60,6 +132,9 @@ local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult
|
||||
|
||||
--df_caverns.config.underworld_min = y_min
|
||||
|
||||
--local poisson = mapgen_helper.get_poisson_points({x=-32000, z=-32000}, {x=32000, z=32000}, 1000)
|
||||
--minetest.debug(dump(poisson.objects))
|
||||
|
||||
---------------------------------------------------------
|
||||
-- Buildings
|
||||
|
||||
@ -67,8 +142,11 @@ local oubliette_threshold = 0.8
|
||||
local town_threshold = 1.1
|
||||
|
||||
local local_random = function(x, z)
|
||||
local next_seed = math.floor(math.random()*2^21)
|
||||
math.randomseed(x + z*2^16)
|
||||
return math.random()
|
||||
local ret = math.random()
|
||||
math.randomseed(next_seed)
|
||||
return ret
|
||||
end
|
||||
|
||||
-- create a deterministic list of buildings
|
||||
@ -196,9 +274,9 @@ local pit_region_size = region_mapblocks * mapgen_chunksize * 16
|
||||
local scatter_2d = function(min_xz, gridscale, border_width)
|
||||
local bordered_scale = gridscale - 2 * border_width
|
||||
local point = {}
|
||||
point.x = math.random() * bordered_scale + min_xz.x + border_width
|
||||
point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width)
|
||||
point.y = 0
|
||||
point.z = math.random() * bordered_scale + min_xz.z + border_width
|
||||
point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width)
|
||||
return point
|
||||
end
|
||||
|
||||
@ -207,19 +285,19 @@ local get_corner = function(pos)
|
||||
return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32}
|
||||
end
|
||||
|
||||
local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed"))
|
||||
local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^21
|
||||
|
||||
local get_pit = function(pos)
|
||||
if region_mapblocks < 1 then return nil end
|
||||
|
||||
local corner_xz = get_corner(pos)
|
||||
local next_seed = math.floor(math.random() * 2^31)
|
||||
local next_seed = math.floor(math.random() * 2^21)
|
||||
math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed)
|
||||
local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance)
|
||||
local variance_multiplier = math.random()
|
||||
local radius = variance_multiplier * (radius_pit_max - 15) + 15
|
||||
local variance = radius_pit_variance/2 + radius_pit_variance*variance_multiplier/2
|
||||
local depth = math.random(plasma_depth_min, plasma_depth_max)
|
||||
local depth = math.random(plasma_depth_min, plasma_depth_max)
|
||||
math.randomseed(next_seed)
|
||||
return {location = location, radius = radius, variance = variance, depth = depth}
|
||||
end
|
||||
@ -242,11 +320,12 @@ minetest.register_chatcommand("find_pit", {
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pit = get_pit(player:get_pos())
|
||||
minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z))
|
||||
if pit then
|
||||
minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z))
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
|
||||
--if out of range of cave definition limits, abort
|
||||
@ -266,7 +345,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
|
||||
local pit = get_pit(minp)
|
||||
--minetest.chat_send_all(minetest.pos_to_string(pit.location))
|
||||
|
||||
|
||||
local buildings = get_buildings(emin, emax, nvals_zone)
|
||||
|
||||
local pit_uninitialized = true
|
||||
@ -279,8 +358,16 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local wave = nvals_wave[index2d] * wave_mult
|
||||
|
||||
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
||||
|
||||
if named_waypoints_path and floor_height == y and pit and pit.location.x == x and pit.location.z == z then
|
||||
named_waypoints.add_waypoint("glowing_pits", {x=x, y=y, z=z}, {name=name_pit()})
|
||||
end
|
||||
|
||||
local underside_height = math.floor(y_min + math.abs(wave) / 5)+2 -- divide wave by five to smooth out the underside of the slade, we only want the interface to ripple a little down here
|
||||
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
|
||||
if y < floor_height and y > y_min + math.abs(wave) / 5 then -- divide wave by five to smooth out the underside of the slade, we only want the interface to ripple a little down here
|
||||
if (y == underside_height or y == underside_height - 1) and (x % 8 == 0 or z % 8 == 0) then
|
||||
data[vi] = c_air
|
||||
elseif y < floor_height and y > underside_height then
|
||||
data[vi] = c_slade
|
||||
if pit and
|
||||
pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and
|
||||
@ -290,13 +377,13 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
then
|
||||
-- there's a pit nearby
|
||||
if pit_uninitialized then
|
||||
nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) -- determine which areas are spongey with warrens
|
||||
nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit)
|
||||
pit_uninitialized = false
|
||||
end
|
||||
local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance
|
||||
local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value
|
||||
if distance < pit.radius -3 then
|
||||
if y < median + floor_displace + wave - pit.depth then
|
||||
if distance < pit.radius -2.5 then
|
||||
if y < median + floor_displace + wave - pit.depth or y < underside_height + plasma_depth_min then
|
||||
data[vi] = c_pit_plasma
|
||||
else
|
||||
data[vi] = c_air
|
||||
@ -308,8 +395,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
df_underworld_items.underworld_shard(data, area, vi)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif y < ceiling_height and data[vi] ~= c_amethyst then
|
||||
end
|
||||
elseif y >= floor_height and y < ceiling_height and data[vi] ~= c_amethyst then
|
||||
data[vi] = c_air
|
||||
elseif data[vi] == c_water then
|
||||
data[vi] = c_air -- no water down here
|
||||
@ -369,7 +456,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
building.pos.y = floor_height
|
||||
--minetest.chat_send_all("placing " .. building.building_type .. " at " .. minetest.pos_to_string(building.pos))
|
||||
if building.building_type == "oubliette" then
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic)
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic)
|
||||
elseif building.building_type == "open oubliette" then
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic, 0, {["df_underworld_items:slade_seal"] = "air"})
|
||||
elseif building.building_type == "lamppost" then
|
||||
@ -378,6 +465,11 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation)
|
||||
elseif building.building_type == "medium building" then
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation)
|
||||
if named_waypoints_path and namegen_path then
|
||||
if not next(named_waypoints.get_waypoints_in_area("underworld_ruins", vector.subtract(building.pos, 250), vector.add(building.pos, 250))) then
|
||||
named_waypoints.add_waypoint("underworld_ruins", {x=building.pos.x, y=floor_height+1, z=building.pos.z}, {name=name_ruin()})
|
||||
end
|
||||
end
|
||||
elseif building.building_type == "small slab" then
|
||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation)
|
||||
else
|
||||
@ -388,6 +480,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- puzzle seal
|
||||
local puzzle_seal = nil
|
||||
if pit_uninitialized and math.random() < 0.05 then
|
||||
local index2d = mapgen_helper.index2d(emin, emax, minp.x + 3, minp.z + 3)
|
||||
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
|
||||
local wave = nvals_wave[index2d] * wave_mult
|
||||
|
||||
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
||||
local underside_height = math.floor(y_min + math.abs(wave) / 5)
|
||||
|
||||
if floor_height < maxp.y and floor_height > minp.y then
|
||||
for plat_vi in area:iter(minp.x, floor_height-6, minp.z, minp.x+6, floor_height, minp.z+6) do
|
||||
data[plat_vi] = c_slade_block
|
||||
end
|
||||
puzzle_seal = {x=minp.x+3, y=floor_height+1, z=minp.z+3}
|
||||
minetest.log("info", "Puzzle seal generated at " .. minetest.pos_to_string(puzzle_seal))
|
||||
end
|
||||
end
|
||||
|
||||
--send data back to voxelmanip
|
||||
vm:set_data(data)
|
||||
@ -399,6 +510,17 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
--write it to world
|
||||
vm:write_to_map()
|
||||
|
||||
if puzzle_seal ~= nil then
|
||||
if named_waypoints_path then
|
||||
named_waypoints.add_waypoint("puzzle_seals", puzzle_seal)
|
||||
end
|
||||
|
||||
minetest.place_schematic({x=puzzle_seal.x-3, y=puzzle_seal.y, z=puzzle_seal.z-3}, df_underworld_items.seal_temple_schem, 0, {}, true)
|
||||
local node_name = minetest.get_node(puzzle_seal).name
|
||||
local node_def = minetest.registered_nodes[node_name]
|
||||
node_def.on_construct(puzzle_seal)
|
||||
end
|
||||
|
||||
if bones_loot_path then
|
||||
for i = 1, 30 do
|
||||
local x = math.random(minp.x, maxp.x)
|
||||
@ -406,7 +528,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local index2d = mapgen_helper.index2d(emin, emax, x, z)
|
||||
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
|
||||
local wave = nvals_wave[index2d] * wave_mult
|
||||
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
||||
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)-1
|
||||
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
|
||||
if floor_height < ceiling_height then
|
||||
local zone = math.abs(nvals_zone[index2d])
|
||||
@ -433,11 +555,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
end
|
||||
end
|
||||
|
||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
||||
if chunk_generation_time < 1000 then
|
||||
minetest.log("info", "[df_caverns] underworld mapblock generation took "..chunk_generation_time.." ms") --tell people how long
|
||||
else
|
||||
minetest.log("warning", "[df_caverns] underworld took "..chunk_generation_time.." ms to generate map block "
|
||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
||||
end
|
||||
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||
mapgen_helper.record_time("df_caverns underworld", time_taken)
|
||||
end)
|
||||
|
18
df_caverns/underworld_names.cfg
Normal file
@ -0,0 +1,18 @@
|
||||
name "glowing_pits" {
|
||||
customGroupA = "Actinic, Amethyst, Angry, Atrocious, Bad, Blighted, Baneful, Baleful, Beastly, Calamitous, Corrupt, Crazed, Damnable, Demoniacal, Demonic, Depraved, Destructive, Devilish, Diabolical, Disastrous, Execrable, Fiendish, Foul, Frenzied, Glaring, Harmful, Hateful, Heinous, Hellish, Hideous, Infernal, Iniquitous, Injurious, Loathsome, Lost, Maleficent, Malevolent, Malicious, Malignant, Manic, Nefarious, Nightmare, Obscene, Offensive, Pernicious, Poison, Possessed, Rancorous, Repugnant, Repulsive, Revolting, Spiteful, Unhallowed, Unpleasant, Vicious, Vile, Villainous, Violent, Wicked, Wrathful"
|
||||
|
||||
customGroupB = "Abyss, Aperture, Breach, Cavity, Chasm, Crevasse, Depth, Deep, Fissure, Funnel, Gate, Gulf, Hell, Hole, Hollow, Inferno, Maw, Mouth, Opening, Pit, Portal, Puncture, Ravager, Rent, Rift, Rim, Schism, Shaft, Split, Throat, Void, Well"
|
||||
|
||||
customGroupC = "Adversity, Affliction, Annihilation, Bale, Bane, Blight, Calamity, Cataclysm, Catastrophe, Collapse, Conclusion, Condemnation, Death, Defeat, Destiny, Destruction, Disaster, Doom, Downfall, Failure, Grief, Harm, Hazard, Judgment, Karma, Misadventure, Mischance, Misfortune, Mishap, Ruin, Ruination, Tragedy, Undoing, Verdict, Woe"
|
||||
|
||||
rules = "%50The_$A_$B, The_$B_of_$C, %10The_$A_$B_of_$C"
|
||||
}
|
||||
|
||||
name "underworld_ruins" {
|
||||
|
||||
customGroupA = "Abandoned, Absent, Adrift, Alien, Anonymous, Bare, Barren, Blank, Buried, Clandestine, Cloaked, Concealed, Covered, Cryptic, Dark, Dead, Depleted, Deserted, Desolate, Despoiled, Destitute, Devoid, Disappeared, Distant, Exhausted, Empty, Forfeit, Forfeited, Forsaken, Hidden, Incognito, Indiscernible, Invisible, Irretrievable, Irrevocable, Masked, Mislaid, Misplaced, Mystic, Mystical, Nameless, Obscured, Secluded, Secret, Sequestered, Shadowy, Shrouded, Stark, Strange, Uncelebrated, Uncharted, Undiscovered, Unexplained, Unexplored, Unfamiliar, Unfilled, Unidentified, Unknown, Unnamed, Unredeemed, Unsung, Untold, Vacant, Vacated, Vanished, Veiled, Wayward, Warrior's, King's, Knave's, Coward's, Cardinal's, Priest's, Soldier's, Noble, Steadfast, Children's, Howling, Silent, Grinding, Dusty"
|
||||
|
||||
customGroupB = "Temple, Chapel, House, Sanctuary, Shrine, Fortress, Tomb, Crypt, Graves, Citadel, Garrison, Rampart, Redoubt, Refuge, Asylum, Haven, Hideout, Retreat, Shelter, Stronghold, Covert, Den, Settlement, Preserve, Seat, Watch, Bulwark, Necropolis, Catacomb, Ruin, Hulk, Wreck"
|
||||
|
||||
rules = "The_$A_$B"
|
||||
}
|
@ -17,11 +17,18 @@ local register_cave_wheat = function(number)
|
||||
inventory_image = "dfcaverns_cave_wheat_"..tostring(number)..".png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
floodable = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
df_farming.grow_underground_plant(pos, name, elapsed)
|
||||
end,
|
||||
@ -96,12 +103,15 @@ minetest.register_craft({
|
||||
burntime = 2
|
||||
})
|
||||
|
||||
-------------
|
||||
--- Flour and bread
|
||||
|
||||
minetest.register_craftitem("df_farming:cave_flour", {
|
||||
description = S("Cave Wheat Flour"),
|
||||
_doc_items_longdesc = df_farming.doc.cave_flour_desc,
|
||||
_doc_items_usagehelp = df_farming.doc.cave_flour_usage,
|
||||
inventory_image = "dfcaverns_flour.png",
|
||||
groups = {flammable = 1, dfcaverns_cookable = 1},
|
||||
groups = {flammable = 1, dfcaverns_cookable = 1, food_flour = 1},
|
||||
})
|
||||
|
||||
minetest.register_craftitem("df_farming:cave_bread", {
|
||||
@ -109,6 +119,7 @@ minetest.register_craftitem("df_farming:cave_bread", {
|
||||
_doc_items_longdesc = df_farming.doc.cave_bread_desc,
|
||||
_doc_items_usagehelp = df_farming.doc.cave_bread_usage,
|
||||
inventory_image = "dfcaverns_prepared_food13x16.png",
|
||||
sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}},
|
||||
on_use = minetest.item_eat(5),
|
||||
groups = {flammable = 2, food = 5},
|
||||
})
|
||||
@ -146,3 +157,72 @@ minetest.register_craft({
|
||||
output = "df_farming:cave_bread",
|
||||
recipe = "df_farming:cave_flour"
|
||||
})
|
||||
|
||||
--------
|
||||
-- Straw
|
||||
|
||||
minetest.register_node("df_farming:cave_straw", {
|
||||
description = S("Cave Straw"),
|
||||
tiles = {"dfcaverns_cave_straw.png"},
|
||||
is_ground_content = false,
|
||||
groups = {snappy=3, flammable=4, fall_damage_add_percent=-30, straw=1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_farming:cave_straw 3",
|
||||
recipe = {
|
||||
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
|
||||
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
|
||||
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_farming:cave_wheat 3",
|
||||
recipe = {
|
||||
{"df_farming:cave_straw"},
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
---------
|
||||
-- Trample support
|
||||
|
||||
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
|
||||
minetest.register_node("df_farming:wheat_trampled", {
|
||||
description = S("Flattened Cave Wheat"),
|
||||
tiles = {"dfcaverns_cave_wheat_flattened.png"},
|
||||
inventory_image = "dfcaverns_cave_wheat_flattened.png",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
buildable_to = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {snappy = 3, flammable = 2, attached_node = 1},
|
||||
drop = "",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
trail.register_trample_node("df_farming:cave_wheat_5", {
|
||||
trampled_node_name = "df_farming:wheat_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:cave_wheat_6", {
|
||||
trampled_node_name = "df_farming:wheat_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:cave_wheat_7", {
|
||||
trampled_node_name = "df_farming:wheat_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:cave_wheat_8", {
|
||||
trampled_node_name = "df_farming:wheat_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
end
|
@ -7,11 +7,11 @@ local print_settingtypes = false
|
||||
local function setting(stype, name, default, description)
|
||||
local value
|
||||
if stype == "bool" then
|
||||
value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
|
||||
elseif stype == "string" then
|
||||
value = minetest.setting_get(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
|
||||
elseif stype == "int" or stype == "float" then
|
||||
value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name))
|
||||
value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name))
|
||||
end
|
||||
if value == nil then
|
||||
value = default
|
||||
@ -34,7 +34,7 @@ local plants = {
|
||||
|
||||
--Plants
|
||||
|
||||
setting("int", "plant_growth_time", 500, "Base plant growth time")
|
||||
setting("int", "plant_growth_time", 3600, "Base plant growth time") -- 60 minutes
|
||||
|
||||
for _, plant in pairs(plants) do
|
||||
setting("float", plant.name.."_delay_multiplier", plant.delay_multiplier, plant.name.." growth delay multiplier")
|
||||
|
@ -11,6 +11,7 @@ local register_cooking_recipes = function(def)
|
||||
_doc_items_longdesc = df_farming.doc.simple_meal_desc,
|
||||
_doc_items_usagehelp = df_farming.doc.simple_meal_usage,
|
||||
inventory_image = def.simple.image,
|
||||
sound = def.simple.sound,
|
||||
on_use = minetest.item_eat(4),
|
||||
groups = {food = 4},
|
||||
})
|
||||
@ -19,6 +20,7 @@ local register_cooking_recipes = function(def)
|
||||
_doc_items_longdesc = df_farming.doc.medium_meal_desc,
|
||||
_doc_items_usagehelp = df_farming.doc.medium_meal_usage,
|
||||
inventory_image = def.medium.image,
|
||||
sound = def.medium.sound,
|
||||
on_use = minetest.item_eat(6),
|
||||
groups = {food = 6},
|
||||
})
|
||||
@ -27,6 +29,7 @@ local register_cooking_recipes = function(def)
|
||||
_doc_items_longdesc = df_farming.doc.complex_meal_desc,
|
||||
_doc_items_usagehelp = df_farming.doc.complex_meal_usage,
|
||||
inventory_image = def.complex.image,
|
||||
sound = def.complex.sound,
|
||||
on_use = minetest.item_eat(8),
|
||||
groups = {food = 8},
|
||||
})
|
||||
@ -63,65 +66,71 @@ end
|
||||
-- prefix =,
|
||||
-- item =,
|
||||
-- replacements =,
|
||||
-- simple = {name = , image = },
|
||||
-- medium = {name = , image = },
|
||||
-- complex = {name = , image = },
|
||||
-- simple = {name = , image = , sound = },
|
||||
-- medium = {name = , image = , sound = },
|
||||
-- complex = {name = , image = , sound = },
|
||||
--}
|
||||
|
||||
local chomp = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}
|
||||
local crisp = {eat = {name = "df_farming_crisp_chew", gain = 1.0}}
|
||||
local gummy = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}
|
||||
local mushy = {eat = {name = "df_farming_mushy_chew", gain = 1.0}}
|
||||
local soft = {eat = {name = "df_farming_soft_chew", gain = 1.0}}
|
||||
|
||||
register_cooking_recipes({prefix="df_farming", item="cave_flour",
|
||||
simple = {name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png"},
|
||||
medium = {name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png"},
|
||||
complex = {name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png"},
|
||||
simple = {name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp},
|
||||
medium = {name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy},
|
||||
complex = {name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="cave_wheat_seed",
|
||||
simple = {name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png"},
|
||||
medium = {name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png"},
|
||||
complex = {name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png"},
|
||||
simple = {name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp},
|
||||
medium = {name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft},
|
||||
complex = {name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="sweet_pod_seed",
|
||||
simple = {name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png"},
|
||||
medium = {name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png"},
|
||||
complex = {name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png"},
|
||||
simple = {name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy},
|
||||
medium = {name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy},
|
||||
complex = {name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="sugar",
|
||||
simple = {name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png"},
|
||||
medium = {name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png"},
|
||||
complex = {name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png"},
|
||||
simple = {name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp},
|
||||
medium = {name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp},
|
||||
complex = {name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp},
|
||||
})
|
||||
register_cooking_recipes({prefix="group", item="plump_helmet",
|
||||
simple = {name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png"},
|
||||
medium = {name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png"},
|
||||
complex = {name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png"},
|
||||
simple = {name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy},
|
||||
medium = {name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy},
|
||||
complex = {name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="plump_helmet_spawn",
|
||||
simple = {name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png"},
|
||||
medium = {name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png"},
|
||||
complex = {name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png"},
|
||||
simple = {name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy},
|
||||
medium = {name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft},
|
||||
complex = {name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="quarry_bush_leaves",
|
||||
simple = {name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png"},
|
||||
medium = {name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png"},
|
||||
complex = {name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png"},
|
||||
simple = {name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft},
|
||||
medium = {name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft},
|
||||
complex = {name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="quarry_bush_seed",
|
||||
simple = {name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png"},
|
||||
medium = {name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png"},
|
||||
complex = {name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png"},
|
||||
simple = {name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft},
|
||||
medium = {name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp},
|
||||
complex = {name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="dimple_cup_seed",
|
||||
simple = {name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png"},
|
||||
medium = {name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png"},
|
||||
complex = {name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png"},
|
||||
simple = {name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp},
|
||||
medium = {name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp},
|
||||
complex = {name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="pig_tail_seed",
|
||||
simple = {name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png"},
|
||||
medium = {name=S("Pig Tail Spore Tofu"), image="dfcaverns_prepared_food30x16.png"},
|
||||
complex = {name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png"},
|
||||
simple = {name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft},
|
||||
medium = {name=S("Pig Tail Spore Tofu"), image="dfcaverns_prepared_food30x16.png", sound = gummy},
|
||||
complex = {name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy},
|
||||
})
|
||||
register_cooking_recipes({prefix="df_farming", item="dwarven_syrup_bucket", replacements={{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}},
|
||||
simple = {name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png"},
|
||||
medium = {name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png"},
|
||||
complex = {name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png"},
|
||||
simple = {name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy},
|
||||
medium = {name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy},
|
||||
complex = {name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy},
|
||||
})
|
||||
|
||||
-- dfcaverns_prepared_food28 is currently unused
|
||||
|
@ -1,9 +0,0 @@
|
||||
default
|
||||
farming?
|
||||
cottages?
|
||||
bucket?
|
||||
dynamic_liquid?
|
||||
wool?
|
||||
intllib?
|
||||
doc?
|
||||
crafting?
|
@ -1 +0,0 @@
|
||||
Adds farmable underground plants that die in sunlight. Also includes various cooking reactions.
|
@ -16,9 +16,16 @@ local register_dimple_cup = function(number)
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
floodable = true,
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, color_blue = 1, light_sensitive_fungus = 11, flower = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -8/16 + 4*number/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
df_farming.grow_underground_plant(pos, name, elapsed)
|
||||
|
@ -1,4 +1,4 @@
|
||||
name = df_farming
|
||||
description = Adds farmable underground plants that die in sunlight. Also includes various cooking reactions.
|
||||
depends = default
|
||||
optional_depends = farming, cottages, bucket, dynamic_liquid, wool, intllib, doc, crafting
|
||||
optional_depends = farming, cottages, bucket, dynamic_liquid, wool, intllib, doc, crafting, trail
|
||||
|
@ -17,10 +17,17 @@ local register_pig_tail = function(number)
|
||||
inventory_image = "dfcaverns_pig_tail_"..tostring(number)..".png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
df_farming.grow_underground_plant(pos, name, elapsed)
|
||||
@ -115,3 +122,40 @@ minetest.register_craft({
|
||||
burntime = 1,
|
||||
})
|
||||
|
||||
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
|
||||
minetest.register_node("df_farming:pig_tail_trampled", {
|
||||
description = S("Flattened Pig Tail"),
|
||||
tiles = {"dfcaverns_pig_tail_flattened.png"},
|
||||
inventory_image = "dfcaverns_pig_tail_flattened.png",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
buildable_to = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {snappy = 3, flammable = 2, attached_node = 1},
|
||||
drop = "",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
trail.register_trample_node("df_farming:pig_tail_5", {
|
||||
trampled_node_name = "df_farming:pig_tail_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:pig_tail_6", {
|
||||
trampled_node_name = "df_farming:pig_tail_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:pig_tail_7", {
|
||||
trampled_node_name = "df_farming:pig_tail_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
trail.register_trample_node("df_farming:pig_tail_8", {
|
||||
trampled_node_name = "df_farming:pig_tail_trampled",
|
||||
randomize_trampled_param2 = true,
|
||||
})
|
||||
end
|
@ -15,6 +15,7 @@ minetest.register_node("df_farming:dead_fungus", {
|
||||
inventory_image = "dfcaverns_dead_fungus.png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
floodable = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1},
|
||||
@ -47,6 +48,7 @@ minetest.register_node("df_farming:cavern_fungi", {
|
||||
inventory_image = "dfcaverns_fungi.png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
floodable = true,
|
||||
light_source = 6,
|
||||
@ -134,7 +136,7 @@ local place_seed = function(itemstack, placer, pointed_thing, plantname)
|
||||
-- add the node and remove 1 item from the itemstack
|
||||
minetest.add_node(pt.above, {name = plantname, param2 = 1})
|
||||
df_farming.plant_timer(pt.above, plantname)
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
if not minetest.settings:get_bool("creative_mode", false) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
@ -155,6 +157,7 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti
|
||||
_dfcaverns_next_stage_time = grow_time,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
sunlight_propagates = true,
|
||||
selection_box = {
|
||||
@ -180,6 +183,9 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti
|
||||
end
|
||||
|
||||
df_farming.grow_underground_plant = function(pos, plant_name, elapsed)
|
||||
if df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
local node_def = minetest.registered_nodes[plant_name]
|
||||
local next_stage = node_def._dfcaverns_next_stage
|
||||
if next_stage then
|
||||
@ -195,7 +201,33 @@ df_farming.grow_underground_plant = function(pos, plant_name, elapsed)
|
||||
end
|
||||
end
|
||||
|
||||
df_farming.kill_if_sunlit = function(pos, node)
|
||||
return false
|
||||
end
|
||||
if df_farming.config.light_kills_fungus then
|
||||
local kill_if_sunlit = function(pos, node)
|
||||
if not node then
|
||||
node = minetest.get_node(pos)
|
||||
end
|
||||
local node_def = minetest.registered_nodes[node.name]
|
||||
local light_sensitive_fungus_level = node_def.groups.light_sensitive_fungus
|
||||
|
||||
-- This should never be the case, but I've received a report of it happening anyway in the ABM so guarding against it.
|
||||
if not light_sensitive_fungus_level then return false end
|
||||
|
||||
local dead_node = node_def._dfcaverns_dead_node or "df_farming:dead_fungus"
|
||||
-- 11 is the value adjacent to a torch
|
||||
local light_level = minetest.get_node_light(pos, 0.5) -- check at 0.5 to get how bright it would be here at noon,
|
||||
-- prevents fungus from growing on the surface world by happenstance
|
||||
if light_level and light_level > light_sensitive_fungus_level then
|
||||
minetest.set_node(pos, {name=dead_node, param2 = node.param2})
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
df_farming.kill_if_sunlit = kill_if_sunlit
|
||||
|
||||
minetest.register_abm({
|
||||
label = "df_farming:kill_light_sensitive_fungus",
|
||||
nodenames = {"group:light_sensitive_fungus"},
|
||||
@ -203,15 +235,7 @@ if df_farming.config.light_kills_fungus then
|
||||
interval = 30,
|
||||
chance = 5,
|
||||
action = function(pos, node)
|
||||
local node_def = minetest.registered_nodes[node.name]
|
||||
local light_sensitive_fungus_level = node_def.groups.light_sensitive_fungus
|
||||
if not light_sensitive_fungus_level then return end -- This should never be the case, but I've received a report of it happening anyway so guarding against it.
|
||||
local dead_node = node_def._dfcaverns_dead_node or "df_farming:dead_fungus"
|
||||
-- 11 is the value adjacent to a torch
|
||||
local light_level = minetest.get_node_light(pos)
|
||||
if light_level and light_level > light_sensitive_fungus_level then
|
||||
minetest.set_node(pos, {name=dead_node, param2 = node.param2})
|
||||
end
|
||||
kill_if_sunlit(pos, node)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
@ -50,7 +50,7 @@ local plump_helmet_on_place = function(itemstack, placer, pointed_thing, plantn
|
||||
-- add the node and remove 1 item from the itemstack
|
||||
minetest.add_node(pt.above, {name = plantname, param2 = math.random(0,3)})
|
||||
df_farming.plant_timer(pt.above, plantname)
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
if not minetest.settings:get_bool("creative_mode", false) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
@ -71,6 +71,7 @@ minetest.register_node("df_farming:plump_helmet_spawn", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -103,6 +104,9 @@ minetest.register_node("df_farming:plump_helmet_1", {
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
walkable = false,
|
||||
floodable = true,
|
||||
node_box = {
|
||||
@ -140,7 +144,10 @@ minetest.register_node("df_farming:plump_helmet_2", {
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -175,7 +182,10 @@ minetest.register_node("df_farming:plump_helmet_3", {
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -208,7 +218,10 @@ minetest.register_node("df_farming:plump_helmet_4", {
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = false, -- I figure full grown plump helmets are sturdy enough to survive inundation
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -260,7 +273,10 @@ minetest.register_node("df_farming:plump_helmet_4_picked", {
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
floodable = false,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
|
@ -18,9 +18,16 @@ local register_quarry_bush = function(number)
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
floodable = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -8/16 + (16/5)*number/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
df_farming.grow_underground_plant(pos, name, elapsed)
|
||||
|
@ -1,4 +1,4 @@
|
||||
dfcaverns_plant_growth_time (Base plant growth timer interval) int 100
|
||||
dfcaverns_plant_growth_time (Base plant growth timer interval) int 3600
|
||||
dfcaverns_cave_wheat_delay_multiplier (cave_wheat growth delay multiplier) float 1
|
||||
dfcaverns_dimple_cup_delay_multiplier (dimple_cup growth delay multiplier) float 3
|
||||
dfcaverns_pig_tail_delay_multiplier (pig_tail growth delay multiplier) float 1
|
||||
|
BIN
df_farming/sounds/df_farming_chomp_crunch.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.4.ogg
Normal file
BIN
df_farming/sounds/df_farming_crisp_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_crisp_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.4.ogg
Normal file
5
df_farming/sounds/license.txt
Normal file
@ -0,0 +1,5 @@
|
||||
df_farming_gummy_chew 1,2 and 3 are from https://freesound.org/people/Breviceps/sounds/447916/ by Breviceps under the CC0 public domain license
|
||||
df_farming_chomp_crunch are from https://freesound.org/people/bbrocer/sounds/382650/ by bbrocer under the CC0 public domain license
|
||||
df_farming_crisp_chew 1 and 2 are from https://freesound.org/people/InspectorJ/sounds/412068/ by InspectorJ under the CC-BY-SA 3.0 license
|
||||
df_farming_soft_chew 1, 2, 3 and 4 are from https://freesound.org/people/miekyj/sounds/326464/ by miekyj under the CC0 public domain license
|
||||
df_farming_mushy_chew 1, 2 and 3 are from https://freesound.org/people/nickyg11p/sounds/390800/ by nickyg11p under the CC0 public domain license
|
@ -15,10 +15,17 @@ local register_sweet_pod = function(number)
|
||||
inventory_image = "dfcaverns_sweet_pod_"..tostring(number)..".png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
floodable = true,
|
||||
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, 8/16, -8/16 + (16/6)*number/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
df_farming.grow_underground_plant(pos, name, elapsed)
|
||||
|
BIN
df_farming/textures/dfcaverns_cave_straw.png
Normal file
After Width: | Height: | Size: 838 B |
BIN
df_farming/textures/dfcaverns_cave_wheat_flattened.png
Normal file
After Width: | Height: | Size: 196 B |
BIN
df_farming/textures/dfcaverns_pig_tail_flattened.png
Normal file
After Width: | Height: | Size: 694 B |
@ -4,12 +4,19 @@ dfcaverns_dwarven_syrup_source_animated - derived from default
|
||||
dfcaverns_dwarven_syrup - derived from default
|
||||
dfcaverns_dwarven_syrup_flowing_animated - derived from default
|
||||
dfcaverns_fungi - copied from caverealms
|
||||
|
||||
Farming textures are released under CC Attribution 3.0 Unported (CC BY 3.0) and list the following authors:
|
||||
Copyright (C) 2012-2016 PilzAdam
|
||||
Copyright (C) 2014-2016 BlockMen
|
||||
Copyright (C) 2015-2016 MasterGollum
|
||||
Copyright (C) 2015-2016 Gambit
|
||||
dfcaverns_cave_wheat - derived from farming wheat
|
||||
dfcaverns_cave_straw - derived from farming straw
|
||||
dfcaverns_flour - derived from farming
|
||||
dfcaverns_bread - derived from farming
|
||||
dfcaverns_pig_tail_thread - copied from farming
|
||||
dfcaverns_sugar - derived from farming
|
||||
dfcaverns_cave_wheat_seed, dfcaverns_pig_tail_seed - all derived from farming wheat seed
|
||||
dfcaverns_cave_wheat_seed, dfcaverns_pig_tail_seed - derived from farming wheat seed
|
||||
|
||||
|
||||
|
||||
|
@ -13,6 +13,7 @@ minetest.register_node("df_mapitems:castle_coral", {
|
||||
_doc_items_longdesc = df_mapitems.doc.castle_coral_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.castle_coral_usage,
|
||||
drawtype = "mesh",
|
||||
is_ground_content = false,
|
||||
light_source = 2,
|
||||
mesh = "octagonal_coral.obj",
|
||||
drop = "df_mapitems:castle_coral_skeleton",
|
||||
@ -34,6 +35,7 @@ minetest.register_node("df_mapitems:castle_coral_skeleton", {
|
||||
drawtype = "mesh",
|
||||
mesh = "octagonal_coral.obj",
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
@ -10,8 +10,14 @@ minetest.register_node("df_mapitems:cave_coral_3", {
|
||||
drop = "default:coral_skeleton",
|
||||
light_source = 3,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, dfcaverns_cave_coral = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_timer = function(pos)
|
||||
if minetest.find_node_near(pos, 1, {"default:water_source"}) == nil then
|
||||
minetest.set_node(pos, {name="default:coral_skeleton"})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("df_mapitems:cave_coral_2", {
|
||||
@ -22,8 +28,14 @@ minetest.register_node("df_mapitems:cave_coral_2", {
|
||||
drop = "default:coral_skeleton",
|
||||
light_source = 2,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, dfcaverns_cave_coral = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_timer = function(pos)
|
||||
if minetest.find_node_near(pos, 1, {"default:water_source"}) == nil then
|
||||
minetest.set_node(pos, {name="default:coral_skeleton"})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("df_mapitems:cave_coral_1", {
|
||||
@ -34,8 +46,14 @@ minetest.register_node("df_mapitems:cave_coral_1", {
|
||||
drop = "default:coral_skeleton",
|
||||
light_source = 1,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, dfcaverns_cave_coral = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_timer = function(pos)
|
||||
if minetest.find_node_near(pos, 1, {"default:water_source"}) == nil then
|
||||
minetest.set_node(pos, {name="default:coral_skeleton"})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local coral_names = {"df_mapitems:cave_coral_1", "df_mapitems:cave_coral_2", "df_mapitems:cave_coral_3"}
|
||||
|
@ -12,6 +12,7 @@ minetest.register_node("df_mapitems:cave_pearls", {
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 2},
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
climbable = true,
|
||||
light_source = 4,
|
||||
node_box = {
|
||||
|
@ -7,11 +7,11 @@ local print_settingtypes = false
|
||||
local function setting(stype, name, default, description)
|
||||
local value
|
||||
if stype == "bool" then
|
||||
value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
|
||||
elseif stype == "string" then
|
||||
value = minetest.setting_get(CONFIG_FILE_PREFIX..name)
|
||||
value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
|
||||
elseif stype == "int" or stype == "float" then
|
||||
value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name))
|
||||
value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name))
|
||||
end
|
||||
if value == nil then
|
||||
value = default
|
||||
|
@ -8,9 +8,9 @@ minetest.register_node("df_mapitems:glow_mese", {
|
||||
_doc_items_longdesc = df_mapitems.doc.glow_mese_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.glow_mese_usage,
|
||||
tiles = {"dfcaverns_glow_mese.png"},
|
||||
is_ground_content = true,
|
||||
groups = {cracky=3},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
is_ground_content = false,
|
||||
light_source = 13,
|
||||
paramtype = "light",
|
||||
use_texture_alpha = true,
|
||||
@ -36,7 +36,7 @@ minetest.register_node("df_mapitems:mese_crystal", {
|
||||
drawtype = "mesh",
|
||||
mesh = "underch_crystal.obj",
|
||||
light_source = 12,
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
|
@ -7,7 +7,7 @@ minetest.register_node("df_mapitems:glow_ruby_ore", {
|
||||
_doc_items_longdesc = df_mapitems.doc.glow_ruby_ore_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.glow_ruby_ore_usage,
|
||||
tiles = {"dfcaverns_glow_ruby_ore.png"},
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
groups = {cracky=2},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
})
|
||||
@ -25,6 +25,7 @@ minetest.register_node("df_mapitems:big_crystal", {
|
||||
use_texture_alpha = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
light_source = 12,
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
@ -52,6 +53,7 @@ minetest.register_node("df_mapitems:med_crystal", {
|
||||
use_texture_alpha = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
light_source = 12,
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
@ -81,6 +83,7 @@ minetest.register_node("df_mapitems:big_crystal_30", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
light_source = 12,
|
||||
drop = "df_mapitems:big_crystal",
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
@ -132,6 +135,7 @@ minetest.register_node("df_mapitems:med_crystal_30", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
light_source = 12,
|
||||
drop = "df_mapitems:med_crystal",
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
@ -168,6 +172,7 @@ minetest.register_node("df_mapitems:big_crystal_30_45", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
light_source = 12,
|
||||
drop = "df_mapitems:big_crystal",
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
@ -205,6 +210,7 @@ minetest.register_node("df_mapitems:med_crystal_30_45", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
light_source = 12,
|
||||
drop = "df_mapitems:med_crystal",
|
||||
groups = {cracky=2, dfcaverns_big_crystal = 1},
|
||||
|
@ -16,6 +16,7 @@ minetest.register_node("df_mapitems:salt_crystal", {
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
on_place = df_mapitems.place_against_surface,
|
||||
})
|
||||
|
||||
@ -26,7 +27,7 @@ minetest.register_node("df_mapitems:salty_cobble", {
|
||||
tiles = {"default_cobble.png^dfcaverns_salty.png"},
|
||||
groups = {cracky = 3, stone = 1, lava_heatable = 1},
|
||||
_magma_conduits_heats_to = "default:cobble",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
light_source = 2,
|
||||
drop = 'default:cobble',
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
|
@ -1,7 +0,0 @@
|
||||
default
|
||||
subterrane
|
||||
df_farming?
|
||||
farming?
|
||||
intllib?
|
||||
doc?
|
||||
radiant_damage?
|
@ -1 +0,0 @@
|
||||
Various node types used by the dfcaverns mapgen mod. Includes cave coral, flowstone, glowing crystals, glow worms, moss and fungi ground cover, and snare weed.
|
@ -13,6 +13,7 @@ df_mapitems.dry_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapite
|
||||
},
|
||||
groups = {cracky = 3, stone = 2},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
is_ground_content = false,
|
||||
})
|
||||
|
||||
minetest.register_node("df_mapitems:dry_flowstone", {
|
||||
@ -22,7 +23,7 @@ minetest.register_node("df_mapitems:dry_flowstone", {
|
||||
tiles = {"default_stone.png^[brighten"},
|
||||
groups = {cracky = 3, stone = 1, lava_heatable = 1},
|
||||
_magma_conduits_heats_to = "default:cobble",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
drop = 'default:cobble',
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
@ -38,6 +39,7 @@ df_mapitems.wet_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapite
|
||||
},
|
||||
groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
is_ground_content = false,
|
||||
}, "df_mapitems:dry_stal")
|
||||
|
||||
|
||||
@ -48,7 +50,7 @@ minetest.register_node("df_mapitems:wet_flowstone", {
|
||||
tiles = {"default_stone.png^[brighten^dfcaverns_dripstone_streaks.png"},
|
||||
groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1, lava_heatable = 1},
|
||||
_magma_conduits_heats_to = "df_mapitems:dry_flowstone",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
drop = 'default:cobble',
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
@ -24,7 +24,7 @@ minetest.register_node("df_mapitems:glow_worm", {
|
||||
},
|
||||
inventory_image = "dfcaverns_glow_worm.png",
|
||||
wield_image = "dfcaverns_glow_worm.png",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
groups = {oddly_breakable_by_hand=3, light_sensitive_fungus = 12},
|
||||
_dfcaverns_dead_node = "air",
|
||||
light_source = 9,
|
||||
|
@ -8,14 +8,14 @@ local S, NS = dofile(MP.."/intllib.lua")
|
||||
-- cyan/dark cyan
|
||||
|
||||
minetest.register_node("df_mapitems:dirt_with_cave_moss", {
|
||||
description = S("Dirt With Cave Moss"),
|
||||
description = S("Dirt with Cave Moss"),
|
||||
_doc_items_longdesc = df_mapitems.doc.cave_moss_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.cave_moss_usage,
|
||||
tiles = {"default_dirt.png^dfcaverns_cave_moss.png", "default_dirt.png",
|
||||
{name = "default_dirt.png^dfcaverns_cave_moss_side.png",
|
||||
tileable_vertical = false}},
|
||||
drop = "default:dirt",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
light_source = 2,
|
||||
paramtype = "light",
|
||||
groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8},
|
||||
@ -45,18 +45,31 @@ minetest.register_abm{
|
||||
end,
|
||||
}
|
||||
|
||||
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
|
||||
local HARDPACK_PROBABILITY = minetest.settings:get("trail_hardpack_probability") or 0.5 -- Chance walked dirt/grass is worn and compacted to trail:trail.
|
||||
local HARDPACK_COUNT = minetest.settings:get("trail_hardpack_count") or 5 -- Number of times the above chance needs to be passed for soil to compact.
|
||||
|
||||
trail.register_trample_node("df_mapitems:dirt_with_cave_moss", {
|
||||
trampled_node_def_override = {description = S("Dirt with Cave Moss and Footprint"),},
|
||||
hard_pack_node_name = "trail:trail",
|
||||
footprint_opacity = 128,
|
||||
hard_pack_probability = HARDPACK_PROBABILITY,
|
||||
hard_pack_count = HARDPACK_COUNT,
|
||||
})
|
||||
end
|
||||
|
||||
--------------------------------------------------
|
||||
-- floor fungus
|
||||
|
||||
-- white/yellow
|
||||
|
||||
minetest.register_node("df_mapitems:cobble_with_floor_fungus", {
|
||||
description = S("Cobblestone With Floor Fungus"),
|
||||
description = S("Cobblestone with Floor Fungus"),
|
||||
_doc_items_longdesc = df_mapitems.doc.floor_fungus_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage,
|
||||
tiles = {"default_cobble.png^dfcaverns_floor_fungus.png"},
|
||||
drops = "default:cobble",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8},
|
||||
_dfcaverns_dead_node = "default:cobble",
|
||||
@ -66,12 +79,12 @@ minetest.register_node("df_mapitems:cobble_with_floor_fungus", {
|
||||
})
|
||||
|
||||
minetest.register_node("df_mapitems:cobble_with_floor_fungus_fine", {
|
||||
description = S("Cobblestone With Floor Fungus"),
|
||||
description = S("Cobblestone with Floor Fungus"),
|
||||
_doc_items_longdesc = df_mapitems.doc.floor_fungus_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage,
|
||||
tiles = {"default_cobble.png^dfcaverns_floor_fungus_fine.png"},
|
||||
drops = "default:cobble",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8},
|
||||
_dfcaverns_dead_node = "default:cobble",
|
||||
@ -106,13 +119,14 @@ minetest.register_abm{
|
||||
-- Hoar moss
|
||||
|
||||
minetest.register_node("df_mapitems:ice_with_hoar_moss", {
|
||||
description = S("Ice With Hoar Moss"),
|
||||
description = S("Ice with Hoar Moss"),
|
||||
_doc_items_longdesc = df_mapitems.doc.hoar_moss_desc,
|
||||
_doc_items_usagehelp = df_mapitems.doc.hoar_moss_usage,
|
||||
tiles = {"default_ice.png^dfcaverns_hoar_moss.png"},
|
||||
drops = "default:ice",
|
||||
paramtype = "light",
|
||||
light_source = 2,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 2, light_sensitive_fungus = 8},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
_dfcaverns_dead_node = "default:ice",
|
||||
|
@ -1,4 +1,4 @@
|
||||
name = df_mapitems
|
||||
description = Various node types used by the dfcaverns mapgen mod. Includes cave coral, flowstone, glowing crystals, glow worms, moss and fungi ground cover, and snare weed.
|
||||
depends = default, subterrane
|
||||
optional_depends = df_farming, farming, intllib, doc, radiant_damage
|
||||
optional_depends = df_farming, farming, intllib, doc, radiant_damage, trail
|
@ -10,7 +10,7 @@ minetest.register_node("df_mapitems:snareweed", {
|
||||
drawtype="plantlike_rooted",
|
||||
paramtype2 = "leveled",
|
||||
special_tiles = {{name = "dfcaverns_snareweed.png", tileable_vertical = true}},
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
drop = 'default:dirt',
|
||||
light_source = 6,
|
||||
groups = {crumbly = 3, soil = 1},
|
||||
@ -25,7 +25,7 @@ if df_mapitems.config.snareweed_damage then
|
||||
if timer >= 1 then
|
||||
timer = timer - 1
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local player_pos = player:getpos() -- node player's feet are in this location.
|
||||
local player_pos = player:get_pos() -- node player's feet are in this location.
|
||||
local rounded_pos = vector.round(player_pos)
|
||||
local nearby_nodes = minetest.find_nodes_in_area(vector.add(rounded_pos, {x=0, y= -8, z=0}), rounded_pos, {"df_mapitems:snareweed"})
|
||||
for _, node_pos in ipairs(nearby_nodes) do
|
||||
|
Before Width: | Height: | Size: 629 B After Width: | Height: | Size: 477 B |
@ -59,7 +59,7 @@ df_mapitems.place_against_surface = function(itemstack, placer, pointed_thing)
|
||||
end
|
||||
-- add the node and remove 1 item from the itemstack
|
||||
minetest.add_node(above_pos, {name = itemstack:get_name(), param2 = param2})
|
||||
if not minetest.setting_getbool("creative_mode") and not minetest.check_player_privs(placer, "creative") then
|
||||
if not minetest.settings:get_bool("creative_mode", false) and not minetest.check_player_privs(placer, "creative") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
|
@ -9,7 +9,7 @@ minetest.register_node("df_mapitems:veinstone", {
|
||||
tiles = {"default_stone.png^dfcaverns_veins.png"},
|
||||
groups = {cracky = 3, stone = 1, lava_heatable = 1},
|
||||
_magma_conduits_heats_to = "default:cobble",
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
light_source = 2,
|
||||
drop = 'default:cobble',
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
|
113
df_primordial_items/ceiling_fungus.lua
Normal file
@ -0,0 +1,113 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
---------------------------------------------------------------------------------------
|
||||
-- Glownode and stalk
|
||||
|
||||
minetest.register_node("df_primordial_items:glownode", {
|
||||
description = S("Primordial Fungal Lantern"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glownode_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glownode_usage,
|
||||
drawtype = "glasslike",
|
||||
tiles = {"dfcaverns_mush_glownode.png"},
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
light_source = default.LIGHT_MAX,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:glownode_stalk", {
|
||||
description = S("Primordial Fungal Lantern Stalk"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glownode_stalk_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glownode_stalk_usage,
|
||||
tiles = {"dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_side.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:glow_orb_hanging", {
|
||||
description = S("Primordial Fungal Orb"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_orb_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage,
|
||||
tiles = {"dfcaverns_mush_orb_vert.png"},
|
||||
inventory_image = "dfcaverns_mush_orb_vert.png",
|
||||
wield_image = "dfcaverns_mush_orb_vert.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1},
|
||||
paramtype = "light",
|
||||
paramtype2 = "degrotate",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
local c_stalk = minetest.get_content_id("df_primordial_items:glownode_stalk")
|
||||
local c_node = minetest.get_content_id("df_primordial_items:glownode")
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
df_primordial_items.spawn_ceiling_spire_vm = function(vi, area, data)
|
||||
local spire_height = math.random(1,10)
|
||||
|
||||
local ystride = area.ystride
|
||||
local zstride = area.zstride
|
||||
|
||||
for i = 0, spire_height do
|
||||
if data[vi-i*ystride] == c_air then
|
||||
data[vi-i*ystride] = c_stalk
|
||||
end
|
||||
end
|
||||
local bottom = vi - (spire_height +1) * ystride
|
||||
if data[bottom] == c_air then
|
||||
data[bottom] = c_node
|
||||
end
|
||||
|
||||
if spire_height > 4 then -- thicken it all up
|
||||
for i = 0, math.floor(spire_height/2) do
|
||||
local current_vi = vi-i*ystride
|
||||
if data[current_vi+1] == c_air then
|
||||
data[current_vi+1] = c_stalk
|
||||
end
|
||||
if data[current_vi-1] == c_air then
|
||||
data[current_vi-1] = c_stalk
|
||||
end
|
||||
if data[current_vi+zstride] == c_air then
|
||||
data[current_vi+zstride] = c_stalk
|
||||
end
|
||||
if data[current_vi-zstride] == c_air then
|
||||
data[current_vi-zstride] = c_stalk
|
||||
end
|
||||
end
|
||||
|
||||
if spire_height > 7 then
|
||||
bottom = bottom-ystride
|
||||
if data[bottom] == c_air then
|
||||
data[bottom] = c_node
|
||||
end
|
||||
if data[bottom-ystride] == c_air then
|
||||
data[bottom-ystride] = c_node
|
||||
end
|
||||
if data[bottom+1] == c_air then
|
||||
data[bottom+1] = c_node
|
||||
end
|
||||
if data[bottom-1] == c_air then
|
||||
data[bottom-1] = c_node
|
||||
end
|
||||
if data[bottom+zstride] == c_air then
|
||||
data[bottom+zstride] = c_node
|
||||
end
|
||||
if data[bottom-zstride] == c_air then
|
||||
data[bottom-zstride] = c_node
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
72
df_primordial_items/doc.lua
Normal file
@ -0,0 +1,72 @@
|
||||
if not minetest.get_modpath("doc") then
|
||||
return
|
||||
end
|
||||
|
||||
df_primordial_items.doc.big_mushroom_desc = S("Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.")
|
||||
df_primordial_items.doc.big_mushroom_usage = S("The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.")
|
||||
|
||||
df_primordial_items.doc.dirt_with_jungle_grass_desc = S("The soil of the primordial jungle is rife with strange life at every scale.")
|
||||
df_primordial_items.doc.dirt_with_jungle_grass_usage = S("When left uncultivated primordial jungle soil will sprout all manner of strange wild plants.")
|
||||
df_primordial_items.doc.dirt_with_mycelium_desc = S("Fungal fibers have infiltrated the ground in a spongy mass, making the soil half mineral and half living matter.")
|
||||
df_primordial_items.doc.dirt_with_mycelium_usage = S("When left uncultivated mycelial soil will sprout all manner of strange wild fungi.")
|
||||
|
||||
df_primordial_items.doc.fern_desc = S("The dark-leaved ferns of the primordial jungle harken back to an earlier era of life in the world.")
|
||||
--df_primordial_items.doc.fern_usage = S("")
|
||||
df_primordial_items.doc.grass_desc = S("These fibrous plants that grow in the deep appear similar to grass at a glance, but they are more closely related to horsetails - a form of vegetation from before the advent of modern plant forms. Ironically, pale cave wheat is more kin to surface grass than this is.")
|
||||
--df_primordial_items.doc.grass_usage = S("")
|
||||
|
||||
df_primordial_items.doc.ivy_desc = S("Tangled weaves of ivy hang from the ceiling where there are wide enough gaps between the bright sources of light.")
|
||||
df_primordial_items.doc.ivy_usage = S("Ivy is climbable, if it hangs close enough to the ground it can serve as a path between floor and ceiling.")
|
||||
df_primordial_items.doc.roots_desc = S("Somewhere above an enormous plant has wedged its roots down through the rock and emerged from the ceiling of another cavern.")
|
||||
df_primordial_items.doc.roots_usage = S("These hanging roots are climbable.")
|
||||
|
||||
df_primordial_items.doc.fungal_grass_desc = S("Questing fibers of fungal mycelium sometimes erupt from the soil and reach upward, driven by chemical cues to seek out nourishment above. They look a lot like white grass, at a glance.")
|
||||
--df_primordial_items.doc.fungal_grass_usage = S("")
|
||||
|
||||
df_primordial_items.doc.tree_desc = S("The large woody plants of the primordial jungle are similar in appearance to the jungle trees of the surface, but are a result of convergent evolution from ancient cycad plants toward a common form.")
|
||||
df_primordial_items.doc.tree_usage = S("Like wood of the surface world, primordial jungle trees can be chopped and carved as building material or as fuel.")
|
||||
df_primordial_items.doc.tree_glowing_desc = S("The cracks in the bark of some primordial jungle trees become host to phosphorescent veins of symbiotic fungus.")
|
||||
df_primordial_items.doc.tree_glowing_usage = S("The glowing bark fungus doesn't extend into the wood of the trunk, resulting in surprisingly mundane building material when hewn.")
|
||||
--df_primordial_items.doc.leaves_desc = S("")
|
||||
--df_primordial_items.doc.leaves_usage = S("")
|
||||
df_primordial_items.doc.glowing_leaves_desc = S("Some fronds of primordial jungle trees also become host to the phosphorescent fungus that creeps through cracks in the bark.")
|
||||
--df_primordial_items.doc.glowing_leaves_usage = S("")
|
||||
|
||||
df_primordial_items.doc.giant_fern_desc = S("The still air of these ancient caverns have allowed ferns to grow to prodigious sizes, where storms and rain would normally tear their weaker fronds off on the surface of the world.")
|
||||
df_primordial_items.doc.giant_fern_usage = S("When a fern grows to such sizes its stem becomes dense enough to be used as a form of wood.")
|
||||
|
||||
df_primordial_items.doc.giant_hyphae_desc = S("Fungus in its purest form, these gigantic rope-like hyphae creep over the surface of soil and burrow in to feed wherever nutrients are sensed.")
|
||||
df_primordial_items.doc.giant_hyphae_usage = S("Much like a rope, hyphae have fibers inside that can be unraveled and used for a variety of crafts.")
|
||||
df_primordial_items.doc.mycelial_fibers_desc = S("Fibers extracted from gigantic fungal hyphae.")
|
||||
--df_primordial_items.doc.mycelial_fibers_usage = S("")
|
||||
df_primordial_items.doc.mycelial_thread_desc = df_primordial_items.doc.mycelial_fibers_desc
|
||||
--df_primordial_items.doc.mycelial_thread_usage = S("")
|
||||
|
||||
df_primordial_items.doc.giant_mushroom_desc = S("The grandest of the great mushroom species can be found in the deepest primordial caverns. Their broad caps have hanging gills.")
|
||||
df_primordial_items.doc.giant_mushroom_usage = S("Much like the giant mushrooms of higher cavern layers, these can be carved into woody material for use as fuel or for building things. The grain of these primordial mushrooms is knurled.")
|
||||
--df_primordial_items.doc.gills_desc = S("")
|
||||
--df_primordial_items.doc.gills_usage = S("")
|
||||
|
||||
--df_primordial_items.doc.glow_orb_desc = S("")
|
||||
--df_primordial_items.doc.glow_orb_usage = S("")
|
||||
--df_primordial_items.doc.glow_plant_desc = S("")
|
||||
--df_primordial_items.doc.glow_plant_usage = S("")
|
||||
--df_primordial_items.doc.glow_pod_desc = S("")
|
||||
--df_primordial_items.doc.glow_pod_usage = S("")
|
||||
|
||||
-- The giant hanging fungal structures from the ceiling
|
||||
--df_primordial_items.doc.glownode_desc = S("")
|
||||
--df_primordial_items.doc.glownode_usage = S("")
|
||||
--df_primordial_items.doc.glownode_stalk_desc = S("")
|
||||
--df_primordial_items.doc.glownode_stalk_usage = S("")
|
||||
|
||||
df_primordial_items.doc.packed_roots_desc = S("The steady light and unchanging growing conditions of the primordial caverns have led to great mountainous masses of plant material growing in particularly fertile spots, hardly identifiable as individual organisms.")
|
||||
df_primordial_items.doc.packed_roots_usage = S("The gnarled interwoven root-like foundations of this plant material is not useful as building material, but can serve as a fuel source.")
|
||||
df_primordial_items.doc.plant_matter_desc = df_primordial_items.doc.packed_roots_desc
|
||||
df_primordial_items.doc.plant_matter_usage = df_primordial_items.doc.packed_roots_usage
|
||||
|
||||
--df_primordial_items.doc.small_mushroom_desc = S("")
|
||||
--df_primordial_items.doc.small_mushroom_usage = S("")
|
||||
--
|
||||
--df_primordial_items.doc.thorn_desc = S("")
|
||||
--df_primordial_items.doc.thorn_usage = S("")
|
145
df_primordial_items/fungal_nodes.lua
Normal file
@ -0,0 +1,145 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
-- Plants
|
||||
|
||||
-- Grass
|
||||
|
||||
minetest.register_node("df_primordial_items:fungal_grass_1", {
|
||||
description = S("Primordial Fungal Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.fungal_grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.fungal_grass_usage,
|
||||
tiles = {"dfcaverns_mush_grass_01.png"},
|
||||
inventory_image = "dfcaverns_mush_grass_01.png",
|
||||
wield_image = "dfcaverns_mush_grass_01.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:fungal_grass_2", {
|
||||
description = S("Primordial Fungal Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.fungal_grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.fungal_grass_usage,
|
||||
tiles = {"dfcaverns_mush_grass_02.png"},
|
||||
inventory_image = "dfcaverns_mush_grass_02.png",
|
||||
wield_image = "dfcaverns_mush_grass_02.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
place_param2 = 3,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
-- Glowing
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_orb", {
|
||||
description = S("Primordial Fungal Orb"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_orb_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage,
|
||||
tiles = {"dfcaverns_mush_orb.png"},
|
||||
inventory_image = "dfcaverns_mush_orb.png",
|
||||
wield_image = "dfcaverns_mush_orb.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 9,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_orb_stalks", {
|
||||
description = S("Primordial Fungal Orb"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_orb_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage,
|
||||
tiles = {"dfcaverns_mush_stalks.png"},
|
||||
inventory_image = "dfcaverns_mush_stalks.png",
|
||||
wield_image = "dfcaverns_mush_stalks.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_pods", {
|
||||
description = S("Primordial Fungal Pod"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_pod_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_pod_usage,
|
||||
tiles = {"dfcaverns_mush_pods.png"},
|
||||
inventory_image = "dfcaverns_mush_pods.png",
|
||||
wield_image = "dfcaverns_mush_pods.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
------------------------------------------------------------------------------------
|
||||
-- Dirt
|
||||
|
||||
minetest.register_node("df_primordial_items:dirt_with_mycelium", {
|
||||
description = S("Dirt with Primordial Mycelium"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.dirt_with_mycelium_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.dirt_with_mycelium_usage,
|
||||
tiles = {"dfcaverns_mush_soil.png"},
|
||||
groups = {crumbly = 3, soil = 1},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
drops = "default:dirt",
|
||||
sounds = default.node_sound_dirt_defaults(),
|
||||
light_source = 3,
|
||||
})
|
||||
|
||||
minetest.register_abm{
|
||||
label = "df_primordial_items:dirt_with_mycelium_spread",
|
||||
nodenames = {"default:dirt"},
|
||||
neighbors = {"df_mapitems:dirt_with_mycelium"},
|
||||
interval = 60,
|
||||
chance = 50,
|
||||
catch_up = true,
|
||||
action = function(pos)
|
||||
minetest.swap_node(pos, {name="df_mapitems:dirt_with_mycelium"})
|
||||
end,
|
||||
}
|
||||
|
||||
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
|
||||
local HARDPACK_PROBABILITY = minetest.settings:get("trail_hardpack_probability") or 0.5 -- Chance walked dirt/grass is worn and compacted to trail:trail.
|
||||
local HARDPACK_COUNT = minetest.settings:get("trail_hardpack_count") or 5 -- Number of times the above chance needs to be passed for soil to compact.
|
||||
|
||||
trail.register_trample_node("df_primordial_items:dirt_with_mycelium", {
|
||||
trampled_node_def_override = {description = S("Dirt with Primordial Mycelium and Footprint"),},
|
||||
footprint_opacity = 196,
|
||||
hard_pack_node_name = "trail:trail",
|
||||
hard_pack_probability = HARDPACK_PROBABILITY,
|
||||
hard_pack_count = HARDPACK_COUNT,
|
||||
})
|
||||
end
|
312
df_primordial_items/giant_fern.lua
Normal file
@ -0,0 +1,312 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
------------------------------------------------------------------------------------
|
||||
-- Nodes
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_fern_tree", {
|
||||
description = S("Giant Fern Stem"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {"dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_bark.png",},
|
||||
groups = {tree=1, choppy=2, oddly_breakable_by_hand=1, flammable= 2, fern_stem = 1},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
sunlight_propagates = true,
|
||||
on_place = minetest.rotate_node,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_fern_tree_slant_bottom", {
|
||||
description = S("Giant Fern Stem"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {
|
||||
"dfcaverns_jungle_fern_stem.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_stem.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "mesh",
|
||||
mesh = "dfcaverns_fern_slant.obj",
|
||||
paramtype = "light",
|
||||
drop = "df_primordial_items:giant_fern_tree",
|
||||
groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
is_ground_content = false,
|
||||
on_place = minetest.rotate_node,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.625, 0.5, 0.0, 0.375},
|
||||
{-0.5, 0.0, -0.875, 0.5, 0.5, 0.125},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.625, 0.5, 0.0, 0.375},
|
||||
{-0.5, 0.0, -0.875, 0.5, 0.5, 0.125},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_fern_tree_slant_top", {
|
||||
description = S("Giant Fern Stem"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {
|
||||
"dfcaverns_jungle_fern_stem.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_stem.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "mesh",
|
||||
mesh = "dfcaverns_fern_slant_2.obj",
|
||||
paramtype = "light",
|
||||
drop = "df_primordial_items:giant_fern_tree",
|
||||
groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
is_ground_content = false,
|
||||
on_place = minetest.rotate_node,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.125, 0.5, 0.0, 0.875},
|
||||
{-0.5, 0.0, -0.375, 0.5, 0.5, 0.625},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.125, 0.5, 0.0, 0.875},
|
||||
{-0.5, 0.0, -0.375, 0.5, 0.5, 0.625},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_fern_tree_slant_full", {
|
||||
description = S("Giant Fern Stem"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {
|
||||
"dfcaverns_jungle_fern_stem.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
"dfcaverns_jungle_fern_bark.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "mesh",
|
||||
mesh = "dfcaverns_fern_slant_full.obj",
|
||||
paramtype = "light",
|
||||
drop = "df_primordial_items:giant_fern_tree",
|
||||
groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
is_ground_content = false,
|
||||
on_place = minetest.rotate_node,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.75, 0.5, 0, 0.25},
|
||||
{-0.5, 0, -1.25, 0.5, 0.5, -0.25},
|
||||
},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.75, 0.5, 0, 0.25},
|
||||
{-0.5, 0, -1.25, 0.5, 0.5, -0.25},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:fern_wood", {
|
||||
description = S("Fern Wood"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
paramtype2 = "facedir",
|
||||
tiles = {"default_wood.png^[multiply:#10FF10"},
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_primordial_items:fern_wood 4",
|
||||
recipe = {
|
||||
{"group:fern_stem"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_fern_leaves", {
|
||||
description = S("Giant Fern Leaves"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {"dfcaverns_jungle_fern_leaves_01.png"},
|
||||
visual_scale = 1.41,
|
||||
inventory_image = "dfcaverns_jungle_fern_leaves_01.png",
|
||||
wield_image = "dfcaverns_jungle_fern_leaves_01.png",
|
||||
groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
walkable = false,
|
||||
waving = 2,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
after_place_node = default.after_place_leaves,
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
-- player will get sapling with 1/10 chance
|
||||
items = {"df_primordial_items:fern_sapling"},
|
||||
rarity = 10,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:giant_fern_leaves"},
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
default.register_leafdecay({
|
||||
trunks = {"df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree"},
|
||||
leaves = {"df_primordial_items:giant_fern_leaves"},
|
||||
radius = 2,
|
||||
})
|
||||
|
||||
------------------------------------------------------------------------------------
|
||||
-- Schematics
|
||||
|
||||
local n1 = { name = "air", prob = 0 }
|
||||
local n2 = { name = "df_primordial_items:giant_fern_leaves" }
|
||||
local n3 = { name = "df_primordial_items:giant_fern_tree_slant_top" }
|
||||
local n4 = { name = "df_primordial_items:giant_fern_tree_slant_full" }
|
||||
local n5 = { name = "df_primordial_items:giant_fern_tree" }
|
||||
local n6 = { name = "df_primordial_items:giant_fern_tree_slant_bottom" }
|
||||
|
||||
|
||||
local fern_4_nodes_tall = {
|
||||
size = {y = 4, x = 3, z = 4},
|
||||
center_pos = {y = 0, x = 1, z = 3},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n2, n3, n2, n1, n4, n1, n1,
|
||||
n1, n1, n1, n6, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
}
|
||||
}
|
||||
|
||||
local fern_5_nodes_tall = {
|
||||
size = {y = 5, x = 3, z = 4},
|
||||
center_pos = {y = 0, x = 1, z = 3},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n3, n2, n1, n4, n1, n1, n1, n1, n1, n5, n1, n2, n6, n2,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
}
|
||||
}
|
||||
|
||||
local fern_6_nodes_tall = {
|
||||
size = {y = 6, x = 5, z = 4},
|
||||
center_pos = {y = 0, x = 2, z = 3},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n2, n3, n2, n2, n1, n1, n4, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n2, n5, n2, n1, n2, n2,
|
||||
n6, n2, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1,
|
||||
}
|
||||
}
|
||||
|
||||
local fern_9_nodes_tall = {
|
||||
size = {y = 9, x = 5, z = 5},
|
||||
center_pos = {y = 0, x = 2, z = 4},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n2, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n2, n3, n2, n2, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n2, n3, n2, n2, n2, n2, n6, n2, n2, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1,
|
||||
n5, n1, n1, n1, n2, n5, n2, n1, n1, n2, n6, n2, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1,
|
||||
}
|
||||
}
|
||||
|
||||
local ferns = {fern_4_nodes_tall, fern_5_nodes_tall, fern_6_nodes_tall, fern_9_nodes_tall}
|
||||
local rotations = {0, 90, 180, 270}
|
||||
|
||||
df_primordial_items.get_fern_schematic = function()
|
||||
return ferns[math.random(1,4)]
|
||||
end
|
||||
|
||||
minetest.register_node("df_primordial_items:fern_sapling", {
|
||||
description = S("Giant Fern Sapling"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage,
|
||||
tiles = {"dfcaverns_jungle_fern_03.png"},
|
||||
inventory_image = "dfcaverns_jungle_fern_03.png",
|
||||
wield_image = "dfcaverns_jungle_fern_03.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
|
||||
},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
on_construct = function(pos)
|
||||
if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then
|
||||
return
|
||||
end
|
||||
minetest.get_node_timer(pos):start(math.random(
|
||||
df_trees.config.tree_min_growth_delay,
|
||||
df_trees.config.tree_max_growth_delay))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if df_farming and df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
|
||||
if minetest.get_node_light(pos) > 6 then
|
||||
local fern = df_primordial_items.get_fern_schematic()
|
||||
local rotation = rotations[math.random(1,#rotations)]
|
||||
minetest.set_node(pos, {name="air"}) -- clear sapling so fern can replace it
|
||||
mapgen_helper.place_schematic(pos, fern, rotation)
|
||||
else
|
||||
minetest.get_node_timer(pos):start(df_trees.config.tree_min_growth_delay)
|
||||
end
|
||||
end,
|
||||
})
|
433
df_primordial_items/giant_mycelium.lua
Normal file
@ -0,0 +1,433 @@
|
||||
-- This file defines a type of root-like growth that spreads over the surface of the ground in a random web-like pattern
|
||||
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
-- hub_thickness -- the bit in the middle that's seen at the ends and corners of long hypha runs
|
||||
-- connector_thickness
|
||||
local get_node_box = function(hub_thickness, connector_thickness)
|
||||
return {
|
||||
type = "connected",
|
||||
fixed = {-hub_thickness,-hub_thickness,-hub_thickness,hub_thickness,hub_thickness,hub_thickness},
|
||||
connect_top = {-connector_thickness, 0, -connector_thickness, connector_thickness, 0.5, connector_thickness},
|
||||
connect_bottom = {-connector_thickness, -0.5, -connector_thickness, connector_thickness, 0, connector_thickness},
|
||||
connect_back = {-connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness, 0.5},
|
||||
connect_right = {0, -connector_thickness, -connector_thickness, 0.5, connector_thickness, connector_thickness},
|
||||
connect_front = {-connector_thickness, -connector_thickness, -0.5, connector_thickness, connector_thickness, 0},
|
||||
connect_left = {-0.5, -connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness},
|
||||
disconnected = {-connector_thickness, -connector_thickness, -connector_thickness, connector_thickness, connector_thickness, connector_thickness},
|
||||
}
|
||||
end
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_hypha_root", {
|
||||
description = S("Rooted Giant Hypha"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_hyphae_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_hyphae_usage,
|
||||
tiles = {
|
||||
{name="dfcaverns_mush_giant_hypha.png"},
|
||||
},
|
||||
connects_to = {"group:soil", "group:hypha"},
|
||||
connect_sides = { "top", "bottom", "front", "left", "back", "right" },
|
||||
drawtype = "nodebox",
|
||||
node_box = get_node_box(0.1875, 0.25),
|
||||
collision_box = get_node_box(0.125, 0.1875),
|
||||
paramtype = "light",
|
||||
light_source = 2,
|
||||
is_ground_content = false,
|
||||
climbable = true,
|
||||
groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
items = {"df_primordial_items:mycelial_fibers","df_primordial_items:giant_hypha_apical_meristem"},
|
||||
rarity = 100,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:mycelial_fibers"},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
minetest.register_node("df_primordial_items:giant_hypha", {
|
||||
description = S("Giant Hypha"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_hyphae_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_hyphae_usage,
|
||||
tiles = {
|
||||
{name="dfcaverns_mush_giant_hypha.png"},
|
||||
},
|
||||
connects_to = {"group:hypha"},
|
||||
connect_sides = { "top", "bottom", "front", "left", "back", "right" },
|
||||
drawtype = "nodebox",
|
||||
node_box = get_node_box(0.1875, 0.25),
|
||||
collision_box = get_node_box(0.125, 0.1875),
|
||||
paramtype = "light",
|
||||
light_source = 2,
|
||||
is_ground_content = false,
|
||||
climbable = true,
|
||||
groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
items = {"df_primordial_items:mycelial_fibers","df_primordial_items:giant_hypha_apical_meristem"},
|
||||
rarity = 100,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:mycelial_fibers"},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craftitem("df_primordial_items:mycelial_fibers", {
|
||||
description = S("Giant Mycelial Fibers"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.mycelial_fibers_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.mycelial_fibers_usage,
|
||||
groups = {wool = 1},
|
||||
inventory_image = "dfcaverns_mush_mycelial_fibers.png",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("df_primordial_items:mycelial_thread", {
|
||||
description = S("Mycelial thread"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.mycelial_thread_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.mycelial_thread_usage,
|
||||
inventory_image = "dfcaverns_pig_tail_thread.png",
|
||||
groups = {flammable = 1, thread = 1},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_primordial_items:mycelial_thread 4",
|
||||
type = "shapeless",
|
||||
recipe = { "df_primordial_items:mycelial_fibers"},
|
||||
})
|
||||
|
||||
-- Check each of the six cardinal directions to see if it's buildable-to,
|
||||
-- if it has an adjacent "soil" node (or if it's going out over the corner of an adjacent soil node),
|
||||
-- and does *not* have an adjacent hypha already.
|
||||
-- By growing with these conditions hyphae will hug the ground and will not immediately loop back on themselves
|
||||
-- (though they can run into other pre-existing growths, forming larger loops - which is fine, large loops are nice)
|
||||
|
||||
local ystride = 3
|
||||
local zstride = 9
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node = minetest.get_node
|
||||
local registered_nodes = minetest.registered_nodes
|
||||
local math_random = math.random
|
||||
|
||||
local find_mycelium_growth_targets = function(pos)
|
||||
local nodes = {}
|
||||
local pos_x = pos.x
|
||||
local pos_y = pos.y
|
||||
local pos_z = pos.z
|
||||
|
||||
for x = -1, 1 do
|
||||
for y = -1, 1 do
|
||||
for z = -1, 1 do
|
||||
if not (x == y and y == z) then -- we don't care about the diagonals or the center node
|
||||
local node = get_node({x=pos_x+x, y=pos_y+y, z=pos_z+z})
|
||||
local node_name = node.name
|
||||
if node_name == "ignore" then
|
||||
-- Pause growth! We're at the edge of the known world.
|
||||
return nil
|
||||
end
|
||||
if get_item_group(node_name, "soil") > 0 or
|
||||
get_item_group(node_name, "stone") > 0 and math_random() < 0.5 then -- let hyphae explore out over stone
|
||||
nodes[x + y*ystride + z*zstride] = "soil"
|
||||
elseif get_item_group(node_name, "hypha") > 0 then
|
||||
nodes[x + y*ystride + z*zstride] = "hypha"
|
||||
elseif registered_nodes[node_name] and registered_nodes[node_name].buildable_to then
|
||||
nodes[x + y*ystride + z*zstride] = "buildable"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--TODO there's probably some clever way to turn this into a subroutine, but I'm tired right now and
|
||||
--copy and pasting is easy and nobody's going to decide whether to hire or fire me based on this
|
||||
--particular snippet of code so what the hell. I'll fix it later when that clever way comes to me.
|
||||
local valid_targets = {}
|
||||
if nodes[-1] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[-1 -ystride] == "soil" or
|
||||
nodes[-1 +ystride] == "soil" or
|
||||
nodes[-1 -zstride] == "soil" or
|
||||
nodes[-1 +zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-ystride] == "soil" or
|
||||
nodes[ystride] == "soil" or
|
||||
nodes[-zstride] == "soil" or
|
||||
nodes[zstride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[-1 -ystride] == "hypha" or
|
||||
nodes[-1 +ystride] == "hypha" or
|
||||
nodes[-1 -zstride] == "hypha" or
|
||||
nodes[-1 +zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x-1, y=pos_y, z=pos_z})
|
||||
end
|
||||
if nodes[1] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[1 -ystride] == "soil" or
|
||||
nodes[1 +ystride] == "soil" or
|
||||
nodes[1 -zstride] == "soil" or
|
||||
nodes[1 +zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-ystride] == "soil" or
|
||||
nodes[ystride] == "soil" or
|
||||
nodes[-zstride] == "soil" or
|
||||
nodes[zstride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[1 -ystride] == "hypha" or
|
||||
nodes[1 +ystride] == "hypha" or
|
||||
nodes[1 -zstride] == "hypha" or
|
||||
nodes[1 +zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x+1, y=pos_y, z=pos_z})
|
||||
end
|
||||
if nodes[-ystride] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[-1 -ystride] == "soil" or
|
||||
nodes[1 -ystride] == "soil" or
|
||||
nodes[-ystride -zstride] == "soil" or
|
||||
nodes[-ystride +zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-1] == "soil" or
|
||||
nodes[1] == "soil" or
|
||||
nodes[-zstride] == "soil" or
|
||||
nodes[zstride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[-1 -ystride] == "hypha" or
|
||||
nodes[1 -ystride] == "hypha" or
|
||||
nodes[-ystride -zstride] == "hypha" or
|
||||
nodes[-ystride +zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x, y=pos_y-1, z=pos_z})
|
||||
end
|
||||
if nodes[ystride] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[-1 +ystride] == "soil" or
|
||||
nodes[1 +ystride] == "soil" or
|
||||
nodes[ystride -zstride] == "soil" or
|
||||
nodes[ystride +zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-1] == "soil" or
|
||||
nodes[1] == "soil" or
|
||||
nodes[-zstride] == "soil" or
|
||||
nodes[zstride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[-1] == "hypha" or
|
||||
nodes[1 + ystride] == "hypha" or
|
||||
nodes[ystride -zstride] == "hypha" or
|
||||
nodes[ystride +zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x, y=pos_y+1, z=pos_z})
|
||||
end
|
||||
if nodes[-zstride] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[-1 -zstride] == "soil" or
|
||||
nodes[1 -zstride] == "soil" or
|
||||
nodes[-ystride -zstride] == "soil" or
|
||||
nodes[ystride -zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-1] == "soil" or
|
||||
nodes[1] == "soil" or
|
||||
nodes[-ystride] == "soil" or
|
||||
nodes[ystride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[-1 -zstride] == "hypha" or
|
||||
nodes[1 -zstride] == "hypha" or
|
||||
nodes[-ystride -zstride] == "hypha" or
|
||||
nodes[ystride -zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x, y=pos_y, z=pos_z-1})
|
||||
end
|
||||
if nodes[zstride] == "buildable" and
|
||||
-- test for soil to directly support new growth
|
||||
(nodes[-1 +zstride] == "soil" or
|
||||
nodes[1 +zstride] == "soil" or
|
||||
nodes[-ystride +zstride] == "soil" or
|
||||
nodes[ystride +zstride] == "soil" or
|
||||
-- test for soil "around the corner" to allow for growth over an edge
|
||||
nodes[-1] == "soil" or
|
||||
nodes[1] == "soil" or
|
||||
nodes[-ystride] == "soil" or
|
||||
nodes[ystride] == "soil")
|
||||
and not -- no adjacent hypha
|
||||
(nodes[-1 +zstride] == "hypha" or
|
||||
nodes[1 +zstride] == "hypha" or
|
||||
nodes[-ystride + zstride] == "hypha" or
|
||||
nodes[ystride +zstride] == "hypha")
|
||||
then
|
||||
table.insert(valid_targets, {x=pos_x, y=pos_y, z=pos_z+1})
|
||||
end
|
||||
|
||||
return valid_targets
|
||||
end
|
||||
|
||||
local grow_mycelium = function(pos, meristem_name)
|
||||
local new_meristems = {}
|
||||
-- Can we grow? If so, pick a random direction and add a new meristem there
|
||||
local targets = find_mycelium_growth_targets(pos)
|
||||
|
||||
if targets == nil then
|
||||
return nil -- We hit the edge of the known world, pause!
|
||||
end
|
||||
|
||||
local target_count = #targets
|
||||
if target_count > 0 then
|
||||
local target = targets[math.random(1,target_count)]
|
||||
minetest.set_node(target, {name=meristem_name})
|
||||
table.insert(new_meristems, target)
|
||||
else
|
||||
--nowhere to grow, turn into a rooted hypha and we're done
|
||||
minetest.set_node(pos, {name="df_primordial_items:giant_hypha_root"})
|
||||
return new_meristems
|
||||
end
|
||||
|
||||
if math.random() < 0.06 then -- Note: hypha growth pattern is very sensitive to this branching factor. Higher than about 0.06 will blanket the landscape with fungus.
|
||||
-- Split - try again from here next time
|
||||
table.insert(new_meristems, pos)
|
||||
-- Otherwise, just turn into a hypha and we're done
|
||||
elseif math.random() < 0.333 then
|
||||
minetest.set_node(pos, {name="df_primordial_items:giant_hypha_root"})
|
||||
else
|
||||
minetest.set_node(pos, {name="df_primordial_items:giant_hypha"})
|
||||
end
|
||||
return new_meristems
|
||||
end
|
||||
|
||||
local min_growth_delay = tonumber(minetest.settings:get("dfcaverns_mycelium_min_growth_delay")) or 240
|
||||
local max_growth_delay = tonumber(minetest.settings:get("dfcaverns_mycelium_max_growth_delay")) or 400
|
||||
local avg_growth_delay = (min_growth_delay + max_growth_delay) / 2
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_hypha_apical_meristem", {
|
||||
description = S("Giant Hypha Apical Meristem"),
|
||||
tiles = {
|
||||
{name="dfcaverns_mush_giant_hypha.png^[brighten"},
|
||||
},
|
||||
connects_to = {"group:hypha"},
|
||||
connect_sides = { "top", "bottom", "front", "left", "back", "right" },
|
||||
drawtype = "nodebox",
|
||||
light_source = 6,
|
||||
node_box = get_node_box(0.25, 0.375),
|
||||
paramtype = "light",
|
||||
|
||||
is_ground_content = false,
|
||||
groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "df_primordial_items:giant_hypha_root",
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
on_construct = function(pos)
|
||||
minetest.get_node_timer(pos):start(math.random(min_growth_delay, max_growth_delay))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if df_farming and df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
|
||||
if elapsed > max_growth_delay then
|
||||
-- We've been unloaded for a while, need to do multiple growth iterations.
|
||||
local iterations = math.floor(elapsed / avg_growth_delay) -- the number of iterations we've missed
|
||||
local stack = {pos} -- initialize with the current location
|
||||
for i = 1, iterations do
|
||||
local new_stack = {} -- populate this with new node output.
|
||||
for _, stackpos in ipairs(stack) do -- for each currently growing location
|
||||
local ret = grow_mycelium(stackpos, "df_primordial_items:giant_hypha_apical_meristem")
|
||||
if ret == nil then
|
||||
-- We hit the edge of the known world, stop and retry later
|
||||
minetest.get_node_timer(stackpos):start(math.random(min_growth_delay,max_growth_delay))
|
||||
else
|
||||
for _, retpos in ipairs(ret) do
|
||||
-- put the new locations into new_stack
|
||||
table.insert(new_stack, retpos)
|
||||
end
|
||||
end
|
||||
end
|
||||
stack = new_stack -- replace the old stack with the new
|
||||
end
|
||||
for _, donepos in ipairs(stack) do
|
||||
-- After all the iterations are done, if there's any leftover growing positions set a timer for each of them
|
||||
minetest.get_node_timer(donepos):start(math.random(min_growth_delay,max_growth_delay))
|
||||
end
|
||||
else
|
||||
-- just do one iteration.
|
||||
local new_meristems = grow_mycelium(pos, "df_primordial_items:giant_hypha_apical_meristem")
|
||||
if new_meristems == nil then
|
||||
-- We hit the end of the known world, try again later. Unlikely in this case, but theoretically possible I guess.
|
||||
minetest.get_node_timer(pos):start(math.random(min_growth_delay,max_growth_delay))
|
||||
else
|
||||
for _, newpos in ipairs(new_meristems) do
|
||||
minetest.get_node_timer(newpos):start(math.random(min_growth_delay,max_growth_delay))
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- this version grows instantly, it is meant for mapgen usage.
|
||||
|
||||
local grow_mycelium_immediately = function(pos)
|
||||
local stack = {pos}
|
||||
while #stack > 0 do
|
||||
local pos = table.remove(stack)
|
||||
if not (df_farming and df_farming.kill_if_sunlit(pos)) then
|
||||
local new_poses = grow_mycelium(pos, "df_primordial_items:giant_hypha_apical_mapgen")
|
||||
if new_poses then
|
||||
for _, new_pos in ipairs(new_poses) do
|
||||
table.insert(stack, new_pos)
|
||||
end
|
||||
else
|
||||
-- if we hit the end of the world, just stop. There'll be a mapgen meristem left here, re-trigger it.
|
||||
minetest.get_node_timer(pos):start(math.random(10,60))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("df_primordial_items:giant_hypha_apical_mapgen", {
|
||||
description = S("Giant Hypha Apical Meristem"),
|
||||
tiles = {
|
||||
{name="dfcaverns_mush_giant_hypha.png^[brighten"},
|
||||
},
|
||||
connects_to = {"group:hypha"},
|
||||
connect_sides = { "top", "bottom", "front", "left", "back", "right" },
|
||||
drawtype = "nodebox",
|
||||
_dfcaverns_dead_node = "df_primordial_items:giant_hypha_root",
|
||||
light_source = 6,
|
||||
node_box = get_node_box(0.25, 0.375),
|
||||
paramtype = "light",
|
||||
|
||||
is_ground_content = false,
|
||||
groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, not_in_creative_inventory = 1, light_sensitive_fungus = 13},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
on_timer = function(pos, elapsed)
|
||||
grow_mycelium_immediately(pos)
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
minetest.get_node_timer(pos):start(1)
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
})
|
||||
|
||||
-- Just in case mapgen fails to trigger the timer on a mapgen mycelium this ABM will clean up.
|
||||
minetest.register_abm({
|
||||
label = "df_primordial_items ensure giant mycelium growth",
|
||||
nodenames = {"df_primordial_items:giant_hypha_apical_mapgen"},
|
||||
interval = 10.0,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
if not timer:is_started() then
|
||||
timer:start(math.random(1,10))
|
||||
end
|
||||
end,
|
||||
})
|
14
df_primordial_items/init.lua
Normal file
@ -0,0 +1,14 @@
|
||||
df_primordial_items = {}
|
||||
df_primordial_items.doc = {}
|
||||
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
dofile(MP.."/doc.lua")
|
||||
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.."/ceiling_fungus.lua")
|
||||
dofile(MP.."/primordial_mushroom.lua")
|
||||
dofile(MP.."/giant_mycelium.lua")
|
45
df_primordial_items/intllib.lua
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
-- Fallback functions for when `intllib` is not installed.
|
||||
-- Code released under Unlicense <http://unlicense.org>.
|
||||
|
||||
-- Get the latest version of this file at:
|
||||
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
|
||||
|
||||
local function format(str, ...)
|
||||
local args = { ... }
|
||||
local function repl(escape, open, num, close)
|
||||
if escape == "" then
|
||||
local replacement = tostring(args[tonumber(num)])
|
||||
if open == "" then
|
||||
replacement = replacement..close
|
||||
end
|
||||
return replacement
|
||||
else
|
||||
return "@"..open..num..close
|
||||
end
|
||||
end
|
||||
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
|
||||
end
|
||||
|
||||
local gettext, ngettext
|
||||
if minetest.get_modpath("intllib") then
|
||||
if intllib.make_gettext_pair then
|
||||
-- New method using gettext.
|
||||
gettext, ngettext = intllib.make_gettext_pair()
|
||||
else
|
||||
-- Old method using text files.
|
||||
gettext = intllib.Getter()
|
||||
end
|
||||
end
|
||||
|
||||
-- Fill in missing functions.
|
||||
|
||||
gettext = gettext or function(msgid, ...)
|
||||
return format(msgid, ...)
|
||||
end
|
||||
|
||||
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
|
||||
return format(n==1 and msgid or msgid_plural, ...)
|
||||
end
|
||||
|
||||
return gettext, ngettext
|
176
df_primordial_items/jungle_mushroom.lua
Normal file
@ -0,0 +1,176 @@
|
||||
-- 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 = df_trees.node_sound_tree_soft_fungus_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 = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_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 = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_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_craftitem("df_primordial_items:diced_mushroom", {
|
||||
description = S("Diced Mushroom"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage,
|
||||
inventory_image = "dfcaverns_mush_diced_giant_mushroom.png",
|
||||
groups = {food = 1, dfcaverns_cookable = 1},
|
||||
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
|
||||
on_use = minetest.item_eat(1),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_primordial_items:diced_mushroom 4",
|
||||
type = "shapeless",
|
||||
recipe = { "group:primordial_mushroom_cap"},
|
||||
})
|
||||
|
||||
-- Note: no wood-making recipe for the trunk, it's pretty useless
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "df_primordial_items:jungle_mushroom_trunk",
|
||||
burntime = 15,
|
||||
})
|
||||
|
||||
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, light_sensitive_fungus = 13},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
|
||||
},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
|
||||
on_construct = function(pos)
|
||||
if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then
|
||||
return
|
||||
end
|
||||
minetest.get_node_timer(pos):start(math.random(
|
||||
df_trees.config.tree_min_growth_delay,
|
||||
df_trees.config.tree_max_growth_delay))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
|
||||
on_timer = function(pos)
|
||||
if df_farming and df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
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")
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
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, c_air, 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, c_air, stem_height, cap_radius)
|
||||
end
|
454
df_primordial_items/jungle_nodes.lua
Normal file
@ -0,0 +1,454 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
local vegetation =
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
----------------------------------------------------
|
||||
-- Ferns
|
||||
|
||||
minetest.register_node("df_primordial_items:fern_1", {
|
||||
description = S("Primordial Fern"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.fern_usage,
|
||||
tiles = {"dfcaverns_jungle_fern_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_fern_01.png",
|
||||
wield_image = "dfcaverns_jungle_fern_01.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
visual_scale = 1.69,
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:fern_2", {
|
||||
description = S("Primordial Fern"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.fern_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.fern_usage,
|
||||
tiles = {"dfcaverns_jungle_fern_02.png"},
|
||||
visual_scale = 1.69,
|
||||
inventory_image = "dfcaverns_jungle_fern_02.png",
|
||||
wield_image = "dfcaverns_jungle_fern_02.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
---------------------------------------------------------
|
||||
-- Glowing plants
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_plant_1", {
|
||||
description = S("Primordial Flower"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_plant_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage,
|
||||
tiles = {"dfcaverns_jungle_flower_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_flower_01.png",
|
||||
wield_image = "dfcaverns_jungle_flower_01.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_plant_2", {
|
||||
description = S("Primordial Jungle Pod"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_plant_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage,
|
||||
tiles = {"dfcaverns_jungle_glow_plant_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_glow_plant_01.png",
|
||||
wield_image = "dfcaverns_jungle_glow_plant_01.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:glow_plant_3", {
|
||||
description = S("Primordial Jungle Pod"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glow_plant_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage,
|
||||
tiles = {"dfcaverns_jungle_glow_plant_02.png"},
|
||||
inventory_image = "dfcaverns_jungle_glow_plant_02.png",
|
||||
wield_image = "dfcaverns_jungle_glow_plant_02.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
|
||||
-------------------------------------------------------------------
|
||||
-- Grass
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_grass_1", {
|
||||
description = S("Primordial Jungle Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.grass_usage,
|
||||
tiles = {"dfcaverns_jungle_grass_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_grass_01.png",
|
||||
wield_image = "dfcaverns_jungle_grass_01.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node ="default:dry_grass_3",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_grass_2", {
|
||||
description = S("Primordial Jungle Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.grass_usage,
|
||||
tiles = {"dfcaverns_jungle_grass_02.png"},
|
||||
inventory_image = "dfcaverns_jungle_grass_02.png",
|
||||
wield_image = "dfcaverns_jungle_grass_02.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node ="default:dry_grass_4",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
place_param2 = 3,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_grass_3", {
|
||||
description = S("Primordial Jungle Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.grass_usage,
|
||||
tiles = {"dfcaverns_jungle_grass_03.png"},
|
||||
inventory_image = "dfcaverns_jungle_grass_03.png",
|
||||
wield_image = "dfcaverns_jungle_grass_03.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node ="default:dry_grass_4",
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
place_param2 = 3,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------
|
||||
-- Ivy
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_ivy", {
|
||||
description = S("Primordial Jungle Ivy"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.ivy_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.ivy_usage,
|
||||
tiles = {"dfcaverns_jungle_ivy_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_ivy_01.png",
|
||||
wield_image = "dfcaverns_jungle_ivy_01.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
place_param2 = 3,
|
||||
--paramtype2 = "wallmouinted",
|
||||
--drawtype = "signlike",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
climbable = true,
|
||||
-- selection_box = {
|
||||
-- type = "wallmounted",
|
||||
-- },
|
||||
})
|
||||
|
||||
-------------------------------------------------------------------------------------
|
||||
-- Small jungle mushrooms
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_mushroom_1", {
|
||||
description = S("Primordial Jungle Mushroom"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.small_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.small_mushroom_usage,
|
||||
tiles = {"dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a"},
|
||||
inventory_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a",
|
||||
wield_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 11},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_mushroom_2", {
|
||||
description = S("Large Primordial Jungle Mushroom"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.small_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.small_mushroom_usage,
|
||||
tiles = {"dfcaverns_jungle_mushroom_02.png"},
|
||||
inventory_image = "dfcaverns_jungle_mushroom_02.png",
|
||||
wield_image = "dfcaverns_jungle_mushroom_02.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 11},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
})
|
||||
|
||||
----------------------------------------------------------------------------------------
|
||||
-- Dirt
|
||||
|
||||
minetest.register_node("df_primordial_items:dirt_with_jungle_grass", {
|
||||
description = S("Dirt With Primordial Jungle Grass"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.dirt_with_jungle_grass_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.dirt_with_jungle_grass_usage,
|
||||
tiles = {"dfcaverns_jungle_plant_grass_node_01.png"},
|
||||
paramtype = "light",
|
||||
groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dirt",
|
||||
is_ground_content = false,
|
||||
drops = "default:dirt",
|
||||
sounds = default.node_sound_dirt_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_abm{
|
||||
label = "df_primordial_items:jungle_grass_spread",
|
||||
nodenames = {"default:dirt"},
|
||||
neighbors = {"df_mapitems:dirt_with_jungle_grass"},
|
||||
interval = 60,
|
||||
chance = 50,
|
||||
catch_up = true,
|
||||
action = function(pos)
|
||||
local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name]
|
||||
if above_def and (above_def.buildable_to == true or above_def.walkable == false) then
|
||||
minetest.swap_node(pos, {name="df_mapitems:dirt_with_jungle_grass"})
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
minetest.register_node("df_primordial_items:plant_matter", {
|
||||
description = S("Primordial Plant Matter"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.plant_matter_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.plant_matter_usage,
|
||||
tiles = {"dfcaverns_jungle_plant_matter_01.png"},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
groups = {crumbly = 3, soil = 1},
|
||||
sounds = default.node_sound_dirt_defaults(),
|
||||
on_timer = function(pos, elapsed)
|
||||
if elapsed > 130 then
|
||||
-- the timer triggered more than ten seconds after it was suppposed to,
|
||||
-- it may have been in an unloaded block. Rather than have all the timers
|
||||
-- go off at once now that the block's loaded, stagger them out again.
|
||||
minetest.get_node_timer(pos):start(math.random(10, 120))
|
||||
return
|
||||
end
|
||||
if minetest.find_node_near(pos, 1, {"air"}) == nil then
|
||||
minetest.set_node(pos, {name="df_primordial_items:packed_roots"})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:packed_roots", {
|
||||
description = S("Packed Primordial Jungle Roots"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.packed_roots_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.packed_roots_usage,
|
||||
tiles = {"dfcaverns_jungle_plant_packed_roots_01.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
|
||||
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
|
||||
local HARDPACK_PROBABILITY = minetest.settings:get("trail_hardpack_probability") or 0.5 -- Chance walked dirt/grass is worn and compacted to trail:trail.
|
||||
local HARDPACK_COUNT = minetest.settings:get("trail_hardpack_count") or 5 -- Number of times the above chance needs to be passed for soil to compact.
|
||||
|
||||
trail.register_trample_node("df_primordial_items:dirt_with_jungle_grass", {
|
||||
trampled_node_def_override = {description = S("Dirt With Primordial Jungle Grass and Footprint"),},
|
||||
footprint_opacity = 128,
|
||||
hard_pack_node_name = "trail:trail",
|
||||
hard_pack_probability = HARDPACK_PROBABILITY,
|
||||
hard_pack_count = HARDPACK_COUNT,
|
||||
})
|
||||
trail.register_trample_node("df_primordial_items:plant_matter", {
|
||||
trampled_node_def_override = {description = S("Primordial Plant Matter with Footprint"),},
|
||||
footprint_opacity = 128,
|
||||
hard_pack_node_name = "df_primordial_items:packed_roots",
|
||||
hard_pack_probability = HARDPACK_PROBABILITY,
|
||||
hard_pack_count = HARDPACK_COUNT,
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "df_primordial_items:packed_roots",
|
||||
burntime = 40,
|
||||
})
|
||||
|
||||
----------------------------------------------------------------------------------------
|
||||
-- Roots
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_roots_1", {
|
||||
description = S("Primordial Jungle Roots"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.roots_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.roots_usage,
|
||||
tiles = {"dfcaverns_jungle_root_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_root_01.png",
|
||||
wield_image = "dfcaverns_jungle_root_01.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
climbable = true,
|
||||
is_ground_content = false,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_roots_2", {
|
||||
description = S("Primordial Jungle Root"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.roots_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.roots_usage,
|
||||
tiles = {"dfcaverns_jungle_root_02.png"},
|
||||
inventory_image = "dfcaverns_jungle_root_02.png",
|
||||
wield_image = "dfcaverns_jungle_root_02.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
climbable = true,
|
||||
})
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Thorns
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_thorns", {
|
||||
description = S("Primordial Jungle Thorns"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.thorn_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.thorn_usage,
|
||||
tiles = {"dfcaverns_jungle_thorns_01.png"},
|
||||
visual_scale = 1.41,
|
||||
inventory_image = "dfcaverns_jungle_thorns_01.png",
|
||||
wield_image = "dfcaverns_jungle_thorns_01.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1, primordial_jungle_plant = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
place_param2 = 3,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
damage_per_second = 1,
|
||||
})
|
||||
|
||||
|
||||
-- TODO I had an idea to make thorns grow into mazes naturally using cellular automata rules, but it turned out to be
|
||||
-- complicated and probably not worth it right now. Deal with it later.
|
||||
|
||||
--local thorn_dir =
|
||||
--{
|
||||
-- {x=1,y=0,z=1},
|
||||
-- {x=-1,y=0,z=-1},
|
||||
-- {x=1,y=0,z=0},
|
||||
-- {x=1,y=0,z=-1},
|
||||
-- {x=-1,y=0,z=0},
|
||||
-- {x=-1,y=0,z=1},
|
||||
--}
|
||||
--
|
||||
--
|
||||
--local thorn_name = "df_primordial_items:jungle_thorns"
|
||||
--minetest.register_abm({
|
||||
-- label = "Primordial thorn growth",
|
||||
-- nodenames = {thorn_name},
|
||||
-- neighbors = {"group:soil"},
|
||||
-- interval = 1.0,
|
||||
-- chance = 5,
|
||||
-- catch_up = true,
|
||||
-- action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
-- if math.random() < 0.1 then
|
||||
-- local above = vector.add({x=0,y=1,z=0},pos)
|
||||
-- local below = vector.add({x=0,y=-1,z=0},pos)
|
||||
-- local above_node = minetest.get_node(above)
|
||||
-- local below_node = minetest.get_node(below)
|
||||
-- if above_node.name == "air" and minetest.get_item_group(below_node.name, "soil") then
|
||||
-- minetest.set_node(above, {name=thorn_name})
|
||||
-- end
|
||||
-- if below_node.name == "air" then
|
||||
-- minetest.set_node(below, {name=thorn_name})
|
||||
-- end
|
||||
-- return
|
||||
-- end
|
||||
--
|
||||
-- local dir = thorn_dir[math.random(#thorn_dir)]
|
||||
-- local target_pos = vector.add(dir, pos)
|
||||
-- -- This gets the corners of the target zone
|
||||
-- local pos1 = vector.add(target_pos, thorn_dir[1])
|
||||
-- local pos2 = vector.add(target_pos, thorn_dir[2])
|
||||
--
|
||||
-- local list, counts = minetest.find_nodes_in_area(pos1, pos2, {thorn_name})
|
||||
-- local count = counts[thorn_name]
|
||||
-- local target_node = minetest.get_node(target_pos)
|
||||
-- -- Cellular automaton rule B3/S12345, approximately
|
||||
-- if count == 3 and target_node.name == "air" then
|
||||
-- minetest.set_node(target_pos, {name=thorn_name})
|
||||
-- elseif count > 5 then
|
||||
-- minetest.set_node(target_pos, {name="air"})
|
||||
-- end
|
||||
-- end
|
||||
--})
|
262
df_primordial_items/jungle_tree.lua
Normal file
@ -0,0 +1,262 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
-- Leaves
|
||||
minetest.register_node("df_primordial_items:jungle_leaves", {
|
||||
description = S("Primordial Jungle Tree Leaves"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.leaves_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.leaves_usage,
|
||||
drawtype = "plantlike",
|
||||
walkable = false,
|
||||
waving = 2,
|
||||
visual_scale = 1.4,
|
||||
tiles = {"dfcaverns_jungle_leaves_01.png"},
|
||||
inventory_image = "dfcaverns_jungle_leaves_01.png",
|
||||
wield_image = "dfcaverns_jungle_leaves_01.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
items = {"df_primordial_items:jungletree_sapling"},
|
||||
rarity = 10,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:jungle_leaves"},
|
||||
}
|
||||
}
|
||||
},
|
||||
after_place_node = default.after_place_leaves,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_leaves_glowing", {
|
||||
description = S("Phosphorescent Primordial Jungle Tree Leaves"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.glowing_leaves_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.glowing_leaves_usage,
|
||||
drawtype = "plantlike",
|
||||
walkable = false,
|
||||
waving = 2,
|
||||
visual_scale = 1.4,
|
||||
tiles = {"dfcaverns_jungle_leaves_02.png"},
|
||||
inventory_image = "dfcaverns_jungle_leaves_02.png",
|
||||
wield_image = "dfcaverns_jungle_leaves_02.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
buildable_to = true,
|
||||
light_source = 2,
|
||||
groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
items = {"df_primordial_items:jungletree_sapling"},
|
||||
rarity = 10,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:jungle_leaves_glowing"},
|
||||
}
|
||||
}
|
||||
},
|
||||
after_place_node = default.after_place_leaves,
|
||||
})
|
||||
|
||||
-- Trunk
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_tree", {
|
||||
description = S("Primordial Jungle Tree"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.tree_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.tree_usage,
|
||||
tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_01.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_tree_mossy", {
|
||||
description = S("Mossy Primordial Jungle Tree"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.tree_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.tree_usage,
|
||||
tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_03.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:jungle_tree_glowing", {
|
||||
description = S("Phosphorescent Primordial Jungle Tree"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.tree_glowing_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.tree_glowing_usage,
|
||||
tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_04.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
light_source = 4,
|
||||
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
default.register_leafdecay({
|
||||
trunks = {"df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:jungle_tree_glowing"},
|
||||
leaves = {"df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing"},
|
||||
radius = 1,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "default:junglewood 4",
|
||||
recipe = {
|
||||
{"group:primordial_jungle_tree"},
|
||||
}
|
||||
})
|
||||
|
||||
----------------------------
|
||||
-- Spawn
|
||||
|
||||
-- TODO: make use of the variant trunk and leaf nodes
|
||||
local c_leaves = minetest.get_content_id("df_primordial_items:jungle_leaves")
|
||||
local c_leaves_glow = minetest.get_content_id("df_primordial_items:jungle_leaves_glowing")
|
||||
local c_trunk = minetest.get_content_id("df_primordial_items:jungle_tree")
|
||||
local c_trunk_mossy = minetest.get_content_id("df_primordial_items:jungle_tree_mossy")
|
||||
local c_trunk_glow = minetest.get_content_id("df_primordial_items:jungle_tree_glowing")
|
||||
|
||||
df_primordial_items.spawn_jungle_tree = function(pos)
|
||||
local x, y, z = pos.x, pos.y, pos.z
|
||||
local height = math.random(8,14)
|
||||
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local minp, maxp = vm:read_from_map(
|
||||
{x = x - 2, y = y - 2, z = z - 2},
|
||||
{x = x + 2, y = y + height, z = z + 2}
|
||||
)
|
||||
local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
||||
local data = vm:get_data()
|
||||
local vi = area:indexp(pos)
|
||||
|
||||
df_primordial_items.spawn_jungle_tree_vm(height, vi, area, data)
|
||||
|
||||
vm:set_data(data)
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
|
||||
local get_tree_nodes = function()
|
||||
local rand = math.random()
|
||||
if rand < 0.5 then
|
||||
return c_trunk_glow, c_leaves_glow
|
||||
end
|
||||
if rand < 0.75 then
|
||||
return c_trunk_mossy, c_leaves
|
||||
end
|
||||
return c_trunk, c_leaves
|
||||
end
|
||||
|
||||
df_primordial_items.spawn_jungle_tree_vm = function(height, vi, area, data)
|
||||
local ystride = area.ystride
|
||||
local zstride = area.zstride
|
||||
local buildable_to = mapgen_helper.buildable_to
|
||||
|
||||
local roots_done = {[vi] = true}
|
||||
for i = 1, 6 do
|
||||
local root_column = vi + math.random(-1,1) + math.random(-1,1)*zstride
|
||||
if not roots_done[root_column] then
|
||||
local trunknode = get_tree_nodes()
|
||||
for y = -2, math.random(0,1) do -- root height is 1 to 2 nodes above ground
|
||||
local root_index = root_column + y * ystride
|
||||
if buildable_to(data[root_index]) then
|
||||
data[root_index] = trunknode
|
||||
end
|
||||
end
|
||||
end
|
||||
roots_done[root_column] = true
|
||||
end
|
||||
|
||||
-- puts a trunk node in the center and surrounds it with leaves
|
||||
local branch = function(bi, glow)
|
||||
local trunknode, leafnode
|
||||
if buildable_to(data[bi]) then
|
||||
trunknode, leafnode = get_tree_nodes()
|
||||
data[bi] = trunknode
|
||||
else
|
||||
return -- if a branch is placed in a non-viable place, don't add leaves
|
||||
end
|
||||
for x = -1, 1 do
|
||||
for z = -1, 1 do
|
||||
for y = -1, 1 do
|
||||
if math.random() < 0.75 then
|
||||
local li = bi + x + z*zstride + y*ystride
|
||||
if buildable_to(data[li]) then
|
||||
data[li] = leafnode
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 0, height-2 do
|
||||
local y_index = vi + i * ystride
|
||||
if buildable_to(data[y_index]) then
|
||||
data[y_index] = get_tree_nodes()
|
||||
else
|
||||
return -- if we hit something we can't grow through, stop.
|
||||
end
|
||||
if i > 4 then
|
||||
local branch_index = y_index + math.random(-1,1) + math.random(-1,1)*zstride
|
||||
branch(branch_index)
|
||||
end
|
||||
end
|
||||
branch(vi + (height-1)*ystride) -- topper
|
||||
end
|
||||
|
||||
minetest.register_node("df_primordial_items:jungletree_sapling", {
|
||||
description = S("Primordial Jungle Tree Sapling"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.tree_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.tree_usage,
|
||||
tiles = {"dfcaverns_jungle_sapling.png"},
|
||||
inventory_image = "dfcaverns_jungle_sapling.png",
|
||||
wield_image = "dfcaverns_jungle_sapling.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13},
|
||||
_dfcaverns_dead_node = "default:dry_shrub",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
|
||||
},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
on_construct = function(pos)
|
||||
if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then
|
||||
return
|
||||
end
|
||||
minetest.get_node_timer(pos):start(math.random(
|
||||
df_trees.config.tree_min_growth_delay,
|
||||
df_trees.config.tree_max_growth_delay))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if df_farming and df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
if minetest.get_node_light(pos) > 6 then
|
||||
df_primordial_items.spawn_jungle_tree(pos)
|
||||
else
|
||||
minetest.get_node_timer(pos):start(df_trees.config.tree_min_growth_delay)
|
||||
end
|
||||
end,
|
||||
})
|
24
df_primordial_items/license.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details.
|
||||
|
||||
License for Code
|
||||
----------------
|
||||
|
||||
Copyright (C) 2019 FaceDeer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
389
df_primordial_items/locale/template.pot
Normal file
@ -0,0 +1,389 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-01-26 16:09-0700\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: df_primordial_items\ceiling_fungus.lua:9
|
||||
msgid "Primordial Fungal Lantern"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\ceiling_fungus.lua:23
|
||||
msgid "Primordial Fungal Lantern Stalk"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\ceiling_fungus.lua:35
|
||||
#: df_primordial_items\fungal_nodes.lua:50
|
||||
#: df_primordial_items\fungal_nodes.lua:69
|
||||
msgid "Primordial Fungal Orb"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:5
|
||||
msgid ""
|
||||
"Compared to the behemoths found elsewhere in the deep places of the world, "
|
||||
"the giant mushrooms of the primordial jungles are on the smaller side - "
|
||||
"often overwhelmed by the green plants that grow in the mysterious light "
|
||||
"below. Still, they can become substantial resources."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:6
|
||||
msgid ""
|
||||
"The soft flesh of these large mushrooms is much less woody than other giant "
|
||||
"mushrooms, making it ill-suited to structural use. This makes it rather more "
|
||||
"nutritious, however."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:8
|
||||
msgid ""
|
||||
"The soil of the primordial jungle is rife with strange life at every scale."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:9
|
||||
msgid ""
|
||||
"When left uncultivated primordial jungle soil will sprout all manner of "
|
||||
"strange wild plants."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:10
|
||||
msgid ""
|
||||
"Fungal fibers have infiltrated the ground in a spongy mass, making the soil "
|
||||
"half mineral and half living matter."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:11
|
||||
msgid ""
|
||||
"When left uncultivated mycelial soil will sprout all manner of strange wild "
|
||||
"fungi."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:13
|
||||
msgid ""
|
||||
"The dark-leaved ferns of the primordial jungle harken back to an earlier era "
|
||||
"of life in the world."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:15
|
||||
msgid ""
|
||||
"These fibrous plants that grow in the deep appear similar to grass at a "
|
||||
"glance, but they are more closely related to horsetails - a form of "
|
||||
"vegetation from before the advent of modern plant forms. Ironically, pale "
|
||||
"cave wheat is more kin to surface grass than this is."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:18
|
||||
msgid ""
|
||||
"Tangled weaves of ivy hang from the ceiling where there are wide enough gaps "
|
||||
"between the bright sources of light."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:19
|
||||
msgid ""
|
||||
"Ivy is climbable, if it hangs close enough to the ground it can serve as a "
|
||||
"path between floor and ceiling."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:20
|
||||
msgid ""
|
||||
"Somewhere above an enormous plant has wedged its roots down through the rock "
|
||||
"and emerged from the ceiling of another cavern."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:21
|
||||
msgid "These hanging roots are climbable."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:23
|
||||
msgid ""
|
||||
"Questing fibers of fungal mycelium sometimes erupt from the soil and reach "
|
||||
"upward, driven by chemical cues to seek out nourishment above. They look a "
|
||||
"lot like white grass, at a glance."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:26
|
||||
msgid ""
|
||||
"The large woody plants of the primordial jungle are similar in appearance to "
|
||||
"the jungle trees of the surface, but are a result of convergent evolution "
|
||||
"from ancient cycad plants toward a common form."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:27
|
||||
msgid ""
|
||||
"Like wood of the surface world, primordial jungle trees can be chopped and "
|
||||
"carved as building material or as fuel."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:28
|
||||
msgid ""
|
||||
"The cracks in the bark of some primordial jungle trees become host to "
|
||||
"phosphorescent veins of symbiotic fungus."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:29
|
||||
msgid ""
|
||||
"The glowing bark fungus doesn't extend into the wood of the trunk, resulting "
|
||||
"in surprisingly mundane building material when hewn."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:32
|
||||
msgid ""
|
||||
"Some fronds of primordial jungle trees also become host to the "
|
||||
"phosphorescent fungus that creeps through cracks in the bark."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:35
|
||||
msgid ""
|
||||
"The still air of these ancient caverns have allowed ferns to grow to "
|
||||
"prodigious sizes, where storms and rain would normally tear their weaker "
|
||||
"fronds off on the surface of the world."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:36
|
||||
msgid ""
|
||||
"When a fern grows to such sizes its stem becomes dense enough to be used as "
|
||||
"a form of wood."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:38
|
||||
msgid ""
|
||||
"Fungus in its purest form, these gigantic rope-like hyphae creep over the "
|
||||
"surface of soil and burrow in to feed wherever nutrients are sensed."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:39
|
||||
msgid ""
|
||||
"Much like a rope, hyphae have fibers inside that can be unraveled and used "
|
||||
"for a variety of crafts."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:40
|
||||
msgid "Fibers extracted from gigantic fungal hyphae."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:45
|
||||
msgid ""
|
||||
"The grandest of the great mushroom species can be found in the deepest "
|
||||
"primordial caverns. Their broad caps have hanging gills."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:46
|
||||
msgid ""
|
||||
"Much like the giant mushrooms of higher cavern layers, these can be carved "
|
||||
"into woody material for use as fuel or for building things. The grain of "
|
||||
"these primordial mushrooms is knurled."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:63
|
||||
msgid ""
|
||||
"The steady light and unchanging growing conditions of the primordial caverns "
|
||||
"have led to great mountainous masses of plant material growing in "
|
||||
"particularly fertile spots, hardly identifiable as individual organisms."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\doc.lua:64
|
||||
msgid ""
|
||||
"The gnarled interwoven root-like foundations of this plant material is not "
|
||||
"useful as building material, but can serve as a fuel source."
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\fungal_nodes.lua:11
|
||||
#: df_primordial_items\fungal_nodes.lua:29
|
||||
msgid "Primordial Fungal Grass"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\fungal_nodes.lua:88
|
||||
msgid "Primordial Fungal Pod"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\fungal_nodes.lua:110
|
||||
msgid "Dirt with Primordial Mycelium"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\fungal_nodes.lua:126
|
||||
msgid "Dirt with Primordial Mycelium and Footprint"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_fern.lua:9
|
||||
#: df_primordial_items\giant_fern.lua:23
|
||||
#: df_primordial_items\giant_fern.lua:60
|
||||
#: df_primordial_items\giant_fern.lua:97
|
||||
msgid "Giant Fern Stem"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_fern.lua:134
|
||||
msgid "Fern Wood"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_fern.lua:152
|
||||
msgid "Giant Fern Leaves"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_fern.lua:267
|
||||
msgid "Giant Fern Sapling"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_mycelium.lua:24
|
||||
msgid "Rooted Giant Hypha"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_mycelium.lua:53
|
||||
msgid "Giant Hypha"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_mycelium.lua:83
|
||||
msgid "Giant Mycelial Fibers"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_mycelium.lua:91
|
||||
msgid "Mycelial thread"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\giant_mycelium.lua:297
|
||||
#: df_primordial_items\giant_mycelium.lua:362
|
||||
msgid "Giant Hypha Apical Meristem"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_mushroom.lua:9
|
||||
msgid "Primordial Jungle Mushroom Trunk"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_mushroom.lua:21
|
||||
msgid "Pale Jungle Mushroom Cap"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_mushroom.lua:45
|
||||
msgid "Dark Jungle Mushroom Cap"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_mushroom.lua:69
|
||||
msgid "Diced Mushroom"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_mushroom.lua:91
|
||||
msgid "Primordial Jungle Mushroom Sapling"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:14
|
||||
#: df_primordial_items\jungle_nodes.lua:33
|
||||
msgid "Primordial Fern"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:55
|
||||
msgid "Primordial Flower"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:74
|
||||
#: df_primordial_items\jungle_nodes.lua:93
|
||||
msgid "Primordial Jungle Pod"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:116
|
||||
#: df_primordial_items\jungle_nodes.lua:134
|
||||
#: df_primordial_items\jungle_nodes.lua:153
|
||||
msgid "Primordial Jungle Grass"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:176
|
||||
msgid "Primordial Jungle Ivy"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:203
|
||||
#: df_primordial_items\jungle_nodes.lua:221
|
||||
msgid "Primordial Jungle Mushroom"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:242
|
||||
msgid "Dirt With Primordial Jungle Grass"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:252
|
||||
msgid "Primordial Plant Matter"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:270
|
||||
msgid "Dirt With Primordial Jungle Grass and Footprint"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:277
|
||||
msgid "Primordial Plant Matter with Footprint"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:286
|
||||
msgid "Packed Primordial Jungle Roots"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:300
|
||||
msgid "Primordial Jungle Roots"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:318
|
||||
msgid "Primordial Jungle Root"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_nodes.lua:339
|
||||
msgid "Primordial Jungle Thorns"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:7
|
||||
msgid "Primordial Jungle Tree Leaves"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:38
|
||||
msgid "Phosphorescent Primordial Jungle Tree Leaves"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:72
|
||||
msgid "Primordial Jungle Tree"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:84
|
||||
msgid "Mossy Primordial Jungle Tree"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:96
|
||||
msgid "Phosphorescent Primordial Jungle Tree"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\jungle_tree.lua:225
|
||||
msgid "Primordial Jungle Tree Sapling"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:6
|
||||
msgid "Primordial Mushroom Trunk"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:18
|
||||
msgid "Primordial Mushroom Cap"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:30
|
||||
msgid "Primordial Mushroom Gills"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:61
|
||||
msgid "Glowing Primordial Mushroom Gills"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:99
|
||||
msgid "Primordial Mushroom Trunk Wood"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:117
|
||||
msgid "Primordial Cap Wood"
|
||||
msgstr ""
|
||||
|
||||
#: df_primordial_items\primordial_mushroom.lua:692
|
||||
msgid "Primordial Mushroom Spawn"
|
||||
msgstr ""
|
6
df_primordial_items/locale/update.bat
Normal file
@ -0,0 +1,6 @@
|
||||
@echo off
|
||||
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
|
||||
cd ..
|
||||
set LIST=
|
||||
for /r %%X in (*.lua) do set LIST=!LIST! %%X
|
||||
..\..\intllib\tools\xgettext.bat %LIST%
|
4
df_primordial_items/mod.conf
Normal file
@ -0,0 +1,4 @@
|
||||
name = df_primordial_items
|
||||
description = A collection of flora found in the "primordial" cavern layer of DF Caverns
|
||||
depends = default, mapgen_helper, subterrane, df_underworld_items, df_trees
|
||||
optional_depends = trail, df_farming
|
74
df_primordial_items/models/dfcaverns_fern_slant.obj
Normal file
@ -0,0 +1,74 @@
|
||||
# Blender v2.79 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
g tunnel_tube_slant_2_Bottom_tunnel_tube_slant_Cube.002_Bottom
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 0.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -1.0000 -0.0000
|
||||
s 1
|
||||
f 1/1/1 2/2/1 4/3/1 3/4/1
|
||||
g tunnel_tube_slant_5_Front_tunnel_tube_slant_Cube.002_Front
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v 0.500000 0.500000 0.000000
|
||||
v -0.500000 0.500000 0.000000
|
||||
v -0.500000 -0.500000 0.500000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vn 0.0000 0.4472 0.8944
|
||||
s 1
|
||||
f 5/5/2 6/6/2 7/7/2 8/8/2
|
||||
g tunnel_tube_slant_1_Top_tunnel_tube_slant_Cube.002_Top
|
||||
v 0.500000 0.500000 -1.000000
|
||||
v -0.500000 0.500000 -1.000000
|
||||
v 0.500000 0.500000 0.000000
|
||||
v -0.500000 0.500000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 1.000000 -0.000000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
s 1
|
||||
f 9/9/3 10/10/3 12/11/3 11/12/3
|
||||
g tunnel_tube_slant_3_Left_tunnel_tube_slant_Cube.002_Left
|
||||
v -0.500000 -0.500000 0.500000
|
||||
v -0.500000 0.500000 0.000000
|
||||
v -0.500000 0.500000 -1.000000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
vt -0.000000 0.000000
|
||||
vt 0.500000 1.000000
|
||||
vt 1.500000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vn -1.0000 0.0000 0.0000
|
||||
s 1
|
||||
f 13/13/4 14/14/4 15/15/4 16/16/4
|
||||
g tunnel_tube_slant_6_Back_tunnel_tube_slant_Cube.002_Back
|
||||
v 0.500000 0.500000 -1.000000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 0.500000 -1.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -0.4472 -0.8944
|
||||
s 1
|
||||
f 17/17/5 18/18/5 19/19/5 20/20/5
|
||||
g tunnel_tube_slant_4_Right_tunnel_tube_slant_Cube.002_Right
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 0.500000 -1.000000
|
||||
v 0.500000 0.500000 0.000000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.500000 1.000000
|
||||
vt 0.500000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vn 1.0000 0.0000 0.0000
|
||||
s 1
|
||||
f 21/21/6 22/22/6 23/23/6 24/24/6
|
74
df_primordial_items/models/dfcaverns_fern_slant_2.obj
Normal file
@ -0,0 +1,74 @@
|
||||
# Blender v2.79 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
g tunnel_tube_slant_Cube.002_Bottom.001
|
||||
v 0.500000 -0.500000 -0.000000
|
||||
v 0.500000 -0.500000 1.000000
|
||||
v -0.500000 -0.500000 -0.000000
|
||||
v -0.500000 -0.500000 1.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -1.0000 -0.0000
|
||||
s 1
|
||||
f 1/1/1 2/2/1 4/3/1 3/4/1
|
||||
g tunnel_tube_slant_Cube.002_Front.001
|
||||
v 0.500000 -0.500000 1.000000
|
||||
v 0.500000 0.500000 0.500000
|
||||
v -0.500000 0.500000 0.500000
|
||||
v -0.500000 -0.500000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vn 0.0000 0.4472 0.8944
|
||||
s 1
|
||||
f 5/5/2 6/6/2 7/7/2 8/8/2
|
||||
g tunnel_tube_slant_Cube.002_Top.001
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
v 0.500000 0.500000 0.500000
|
||||
v -0.500000 0.500000 0.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 1.000000 -0.000000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
s 1
|
||||
f 9/9/3 10/10/3 12/11/3 11/12/3
|
||||
g tunnel_tube_slant_Cube.002_Left.001
|
||||
v -0.500000 -0.500000 1.000000
|
||||
v -0.500000 0.500000 0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
v -0.500000 -0.500000 -0.000000
|
||||
vt -0.500000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.500000 0.000000
|
||||
vn -1.0000 -0.0000 0.0000
|
||||
s 1
|
||||
f 13/13/4 14/14/4 15/15/4 16/16/4
|
||||
g tunnel_tube_slant_Cube.002_Back.001
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v 0.500000 -0.500000 -0.000000
|
||||
v -0.500000 -0.500000 -0.000000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -0.4472 -0.8944
|
||||
s 1
|
||||
f 17/17/5 18/18/5 19/19/5 20/20/5
|
||||
g tunnel_tube_slant_Cube.002_Right.001
|
||||
v 0.500000 -0.500000 -0.000000
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v 0.500000 0.500000 0.500000
|
||||
v 0.500000 -0.500000 1.000000
|
||||
vt 0.500000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt -0.500000 0.000000
|
||||
vn 1.0000 -0.0000 0.0000
|
||||
s 1
|
||||
f 21/21/6 22/22/6 23/23/6 24/24/6
|
74
df_primordial_items/models/dfcaverns_fern_slant_full.obj
Normal file
@ -0,0 +1,74 @@
|
||||
# Blender v2.79 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
g tunnel_tube_slant_Cube.002_Bottom.002
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 0.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -1.0000 -0.0000
|
||||
s 1
|
||||
f 1/1/1 2/2/1 4/3/1 3/4/1
|
||||
g tunnel_tube_slant_Cube.002_Front.002
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
v -0.500000 -0.500000 0.500000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vn 0.0000 0.7071 0.7071
|
||||
s 1
|
||||
f 5/5/2 6/6/2 7/7/2 8/8/2
|
||||
g tunnel_tube_slant_Cube.002_Top.002
|
||||
v 0.500000 0.500000 -1.500000
|
||||
v -0.500000 0.500000 -1.500000
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt -0.000000 0.000000
|
||||
vt 1.000000 -0.000000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
s 1
|
||||
f 9/9/3 10/10/3 12/11/3 11/12/3
|
||||
g tunnel_tube_slant_Cube.002_Left.002
|
||||
v -0.500000 -0.500000 0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
v -0.500000 0.500000 -1.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
vt -0.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 2.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vn -1.0000 0.0000 0.0000
|
||||
s 1
|
||||
f 13/13/4 14/14/4 15/15/4 16/16/4
|
||||
g tunnel_tube_slant_Cube.002_Back.002
|
||||
v 0.500000 0.500000 -1.500000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 0.500000 -1.500000
|
||||
vt 1.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 0.0000 -0.7071 -0.7071
|
||||
s 1
|
||||
f 17/17/5 18/18/5 19/19/5 20/20/5
|
||||
g tunnel_tube_slant_Cube.002_Right.002
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 0.500000 -1.500000
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
vt 1.000000 0.000000
|
||||
vt 2.000000 1.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vn 1.0000 -0.0000 0.0000
|
||||
s 1
|
||||
f 21/21/6 22/22/6 23/23/6 24/24/6
|
728
df_primordial_items/primordial_mushroom.lua
Normal file
@ -0,0 +1,728 @@
|
||||
-- internationalization boilerplate
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local S, NS = dofile(MP.."/intllib.lua")
|
||||
|
||||
minetest.register_node("df_primordial_items:mushroom_trunk", {
|
||||
description = S("Primordial Mushroom Trunk"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage,
|
||||
tiles = {"dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:mushroom_cap", {
|
||||
description = S("Primordial Mushroom Cap"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage,
|
||||
tiles = {"dfcaverns_mush_cap.png"},
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
|
||||
sounds = df_trees.node_sound_tree_soft_fungus_defaults(),
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:mushroom_gills", {
|
||||
description = S("Primordial Mushroom Gills"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.gills_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.gills_usage,
|
||||
tiles = {"dfcaverns_mush_gills.png"},
|
||||
inventory_image = "dfcaverns_mush_gills.png",
|
||||
wield_image = "dfcaverns_mush_gills.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1, leaves = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
waving = 2,
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
-- player will get sapling with 1/20 chance
|
||||
items = {"df_primordial_items:mush_sapling"},
|
||||
rarity = 20,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:mushroom_gills"},
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:mushroom_gills_glowing", {
|
||||
description = S("Glowing Primordial Mushroom Gills"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.gills_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.gills_usage,
|
||||
tiles = {"dfcaverns_mush_gills_glow.png"},
|
||||
inventory_image = "dfcaverns_mush_gills_glow.png",
|
||||
wield_image = "dfcaverns_mush_gills_glow.png",
|
||||
groups = {snappy = 3, flora = 1, flammable = 1, leaves = 1},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
waving = 2,
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
light_source = 6,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
drop = {
|
||||
max_items = 1,
|
||||
items = {
|
||||
{
|
||||
-- player will get sapling with 1/20 chance
|
||||
items = {"df_primordial_items:mush_sapling"},
|
||||
rarity = 20,
|
||||
},
|
||||
{
|
||||
items = {"df_primordial_items:mushroom_gills_glowing"},
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
default.register_leafdecay({
|
||||
trunks = {"df_primordial_items:mushroom_trunk", "df_primordial_items:mushroom_cap"},
|
||||
leaves = {"df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing"},
|
||||
radius = 5,
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:primordial_mush_trunk_wood", {
|
||||
description = S("Primordial Mushroom Trunk Wood"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage,
|
||||
paramtype2 = "facedir",
|
||||
tiles = {"dfcaverns_mush_shaft_side.png^(dfcaverns_mush_gills.png^[multiply:#888888)"},
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_primordial_items:primordial_mush_trunk_wood 4",
|
||||
recipe = {
|
||||
{"df_primordial_items:mushroom_trunk"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("df_primordial_items:primordial_mush_cap_wood", {
|
||||
description = S("Primordial Cap Wood"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage,
|
||||
paramtype2 = "facedir",
|
||||
tiles = {"dfcaverns_mush_cap.png^dfcaverns_mush_gills.png"},
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "df_primordial_items:primordial_mush_cap_wood 4",
|
||||
recipe = {
|
||||
{"df_primordial_items:mushroom_cap"},
|
||||
}
|
||||
})
|
||||
|
||||
------
|
||||
-- Schematics:
|
||||
-- Originally created by ClockGen, released under CC-BY 4.0
|
||||
|
||||
local replace_on_buildable_to = function(old_node_id, data, area, vi)
|
||||
return mapgen_helper.buildable_to(old_node_id)
|
||||
end
|
||||
|
||||
local n1 = {name="air", prob=0}
|
||||
local n2 = {name="df_primordial_items:mushroom_gills"}
|
||||
local n3 = {name="df_primordial_items:mushroom_cap", place_on_condition = replace_on_buildable_to}
|
||||
local n4 = {name="df_primordial_items:mushroom_trunk", place_on_condition = replace_on_buildable_to}
|
||||
local n5 = {name="df_primordial_items:mushroom_gills_glowing"}
|
||||
|
||||
local bc_mushroom_3 = {
|
||||
size = {x=3, y=3, z=3},
|
||||
center_pos = {x=1, y=0, z=1},
|
||||
data = {
|
||||
n1, n1, n1, n2, n2, n1, n3, n3, n3, n1, n4, n1, n2, n4, n5, n3, n3,
|
||||
n3, n1, n1, n1, n1, n5, n1, n3, n3, n3,
|
||||
},
|
||||
}
|
||||
|
||||
local bc_mushroom_5 = {
|
||||
size = {x=5, y=5, z=5},
|
||||
center_pos = {x=2, y=0, z=2},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n1, n1, n1, n3, n2, n5, n2, n3, n1, n3, n3, n3, n1, n1,
|
||||
n1, n4, n1, n1, n1, n1, n4, n1, n1, n1, n2, n4, n5, n1, n3, n2, n4,
|
||||
n5, n3, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n5, n2, n1, n1, n3, n5, n2, n2, n3, n1, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3,
|
||||
n1, n1, n1, n1, n1, n1,
|
||||
},
|
||||
}
|
||||
|
||||
local bc_mushroom_9 = {
|
||||
size = {x=9, y=9, z=9},
|
||||
center_pos = {x=4, y=0, z=4},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3,
|
||||
n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n3, n3, n3, n1,
|
||||
n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5,
|
||||
n2, n1, n1, n1, n1, n3, n3, n2, n5, n2, n3, n3, n1, n1, n1, n1, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1,
|
||||
n3, n3, n2, n2, n5, n2, n2, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1,
|
||||
n1, n1, n1, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1, n4, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1, n4, n1,
|
||||
n1, n5, n1, n1, n5, n1, n1, n4, n2, n1, n5, n1, n1, n5, n1, n5, n4,
|
||||
n2, n1, n5, n1, n1, n5, n1, n5, n4, n2, n2, n5, n1, n3, n5, n2, n5,
|
||||
n4, n2, n5, n5, n3, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n2, n1, n2, n2, n1, n1,
|
||||
n1, n1, n1, n2, n5, n2, n2, n1, n1, n3, n3, n5, n2, n5, n2, n2, n3,
|
||||
n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5,
|
||||
n1, n1, n1, n1, n1, n1, n3, n3, n5, n2, n2, n3, n3, n1, n1, n1, n1,
|
||||
n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1,
|
||||
n1, n1, n3, n3, n3, n5, n3, n3, n3, n1, n1, n1, n1, n1, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
},
|
||||
}
|
||||
|
||||
local bc_mushroom_21 = {
|
||||
size = {y = 21, x = 19, z = 19},
|
||||
center_pos = {x=9, y=0, z=9},
|
||||
data = {
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3,
|
||||
n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5,
|
||||
n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n3, n3, n5, n5, n5, n5, n2, n3, n3, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n3, n5, n3, n3, n3, n3, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n1, n1, n2, n1, n5,
|
||||
n2, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n2, n5, n2,
|
||||
n2, n5, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3,
|
||||
n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n2,
|
||||
n1, n1, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1,
|
||||
n2, n2, n1, n1, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n5, n1, n2, n2, n1, n2, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n5, n2, n5, n1, n2, n2, n1, n2, n5, n2, n5, n3, n1, n1, n1, n1, n1,
|
||||
n1, n3, n3, n3, n5, n2, n2, n2, n5, n2, n5, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2,
|
||||
n1, n1, n1, n1, n1, n1, n3, n3, n2, n5, n1, n2, n1, n1, n1, n2, n2,
|
||||
n2, n2, n3, n3, n1, n1, n1, n1, n3, n3, n3, n5, n2, n2, n5, n5, n2,
|
||||
n2, n2, n2, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n4,
|
||||
n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3,
|
||||
n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n2, n1,
|
||||
n2, n1, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n2,
|
||||
n2, n1, n2, n5, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1,
|
||||
n1, n2, n2, n2, n2, n5, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2,
|
||||
n1, n1, n1, n2, n2, n2, n2, n5, n2, n1, n1, n1, n1, n3, n3, n2, n1,
|
||||
n1, n2, n1, n1, n5, n2, n2, n2, n2, n5, n2, n3, n3, n1, n1, n3, n3,
|
||||
n3, n2, n2, n2, n2, n5, n4, n2, n2, n2, n2, n5, n3, n3, n3, n1, n1,
|
||||
n1, n1, n3, n3, n3, n3, n4, n4, n4, n4, n4, n3, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2,
|
||||
n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n2, n5, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n2, n5, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n2, n1, n1, n2,
|
||||
n5, n1, n1, n1, n3, n2, n1, n2, n1, n1, n1, n2, n4, n5, n1, n2, n1,
|
||||
n1, n2, n5, n3, n1, n1, n3, n3, n2, n2, n5, n5, n2, n4, n4, n4, n2,
|
||||
n2, n2, n2, n2, n3, n3, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n4,
|
||||
n4, n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3,
|
||||
n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4,
|
||||
n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n2, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n4, n4, n4, n2, n2, n2,
|
||||
n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n4, n4, n4, n2,
|
||||
n2, n2, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n5, n2, n4, n4,
|
||||
n4, n2, n2, n2, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n5, n2,
|
||||
n4, n4, n4, n2, n2, n2, n1, n5, n2, n1, n1, n3, n3, n5, n5, n1, n1,
|
||||
n5, n2, n4, n4, n4, n2, n2, n2, n1, n5, n2, n3, n3, n3, n3, n3, n5,
|
||||
n5, n2, n5, n4, n4, n4, n4, n4, n2, n2, n2, n5, n3, n3, n3, n1, n1,
|
||||
n3, n3, n3, n4, n4, n4, n4, n4, n4, n4, n4, n4, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4,
|
||||
n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n4, n4,
|
||||
n4, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n5,
|
||||
n4, n4, n4, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n5,
|
||||
n1, n5, n4, n4, n4, n2, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1,
|
||||
n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1, n2, n1, n1, n2,
|
||||
n1, n1, n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1, n2, n1,
|
||||
n1, n2, n1, n1, n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1,
|
||||
n2, n1, n3, n2, n1, n1, n1, n5, n2, n4, n4, n4, n4, n4, n5, n1, n1,
|
||||
n2, n1, n2, n3, n3, n3, n2, n2, n5, n5, n4, n4, n4, n4, n4, n4, n4,
|
||||
n2, n2, n2, n2, n3, n3, n1, n1, n3, n3, n3, n4, n4, n4, n4, n4, n4,
|
||||
n4, n4, n4, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3,
|
||||
n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4,
|
||||
n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4, n4, n4, n5, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4, n4, n4,
|
||||
n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4,
|
||||
n4, n4, n5, n1, n1, n1, n1, n1, n1, n1, n3, n3, n2, n2, n1, n1, n1,
|
||||
n2, n4, n4, n4, n5, n1, n1, n1, n1, n2, n3, n3, n3, n3, n3, n2, n2,
|
||||
n5, n5, n4, n4, n4, n4, n4, n2, n5, n5, n2, n3, n3, n3, n1, n1, n3,
|
||||
n3, n3, n4, n4, n4, n4, n4, n4, n4, n4, n4, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n5, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n2, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n1, n1, n3, n5, n1, n1, n1, n1, n1, n5, n4, n2, n1, n1, n1, n1, n1,
|
||||
n5, n3, n1, n1, n3, n3, n5, n5, n2, n5, n2, n4, n4, n4, n2, n2, n2,
|
||||
n2, n5, n3, n3, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n4, n4, n4,
|
||||
n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3,
|
||||
n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1,
|
||||
n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n5, n1, n1, n1, n1,
|
||||
n1, n2, n5, n5, n1, n1, n1, n5, n3, n3, n1, n1, n3, n3, n3, n5, n2,
|
||||
n5, n2, n2, n4, n5, n5, n2, n2, n5, n3, n3, n3, n1, n1, n1, n1, n3,
|
||||
n3, n3, n3, n4, n4, n4, n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1,
|
||||
n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1,
|
||||
n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n2, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n2, n5, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n2, n5, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n2, n5, n1, n2, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n3, n3, n2, n1, n1, n1, n2, n5, n2, n2, n2, n1, n2, n3, n3,
|
||||
n1, n1, n1, n1, n3, n3, n3, n5, n2, n5, n2, n5, n2, n2, n2, n5, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n3, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3,
|
||||
n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n5, n1, n1, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n2,
|
||||
n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n2, n5, n1, n5, n1,
|
||||
n2, n2, n2, n1, n5, n5, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2,
|
||||
n5, n2, n2, n2, n2, n5, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2,
|
||||
n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n5, n2, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n3, n3, n3, n2, n5, n2, n2, n1, n1, n2, n3, n3, n3, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n3, n5, n2, n2, n5, n5, n3, n3, n3, n3,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1,
|
||||
n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1,
|
||||
n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n5, n5, n1,
|
||||
n2, n5, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3,
|
||||
n3, n2, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n3, n3, n3, n2, n3, n3, n3, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3,
|
||||
n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
|
||||
}
|
||||
}
|
||||
|
||||
df_primordial_items.get_primordial_mushroom = function()
|
||||
local rand = math.random()
|
||||
if rand < 0.3 then
|
||||
return bc_mushroom_3
|
||||
elseif rand < 0.7 then
|
||||
return bc_mushroom_5
|
||||
elseif rand < 0.975 then
|
||||
return bc_mushroom_9
|
||||
end
|
||||
return bc_mushroom_21
|
||||
end
|
||||
|
||||
minetest.register_node("df_primordial_items:mush_sapling", {
|
||||
description = S("Primordial Mushroom Spawn"),
|
||||
_doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc,
|
||||
_doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage,
|
||||
tiles = {"dfcaverns_mush_sapling.png"},
|
||||
inventory_image = "dfcaverns_mush_sapling.png",
|
||||
wield_image = "dfcaverns_mush_sapling.png",
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 11},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
|
||||
},
|
||||
paramtype = "light",
|
||||
drawtype = "plantlike",
|
||||
buildable_to = true,
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
use_texture_alpha = true,
|
||||
sunlight_propagates = true,
|
||||
on_construct = function(pos)
|
||||
if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then
|
||||
return
|
||||
end
|
||||
minetest.get_node_timer(pos):start(math.random(
|
||||
df_trees.config.tree_min_growth_delay,
|
||||
df_trees.config.tree_max_growth_delay))
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if df_farming and df_farming.kill_if_sunlit(pos) then
|
||||
return
|
||||
end
|
||||
local mushroom = df_primordial_items.get_primordial_mushroom()
|
||||
local rotation = (math.random(1,4)-1)*90
|
||||
minetest.set_node(pos, {name="air"}) -- clear sapling so mushroom can replace it
|
||||
mapgen_helper.place_schematic(pos, mushroom, rotation)
|
||||
end,
|
||||
})
|
||||
|
5
df_primordial_items/settingtypes.txt
Normal file
@ -0,0 +1,5 @@
|
||||
dfcaverns_mycelium_min_growth_delay (Minimum mycelium growth delay) int 240
|
||||
dfcaverns_mycelium_max_growth_delay (Maximum mycelium growth delay) int 400
|
||||
|
||||
dfcaverns_jungle_min_growth_delay (Minimum growth delay for large jungle plants) int 300
|
||||
dfcaverns_jungle_max_growth_delay (Maximum growth delay for large jungle plants) int 1500
|
BIN
df_primordial_items/textures/dfcaverns_jungle_fern_01.png
Normal file
After Width: | Height: | Size: 421 B |
BIN
df_primordial_items/textures/dfcaverns_jungle_fern_02.png
Normal file
After Width: | Height: | Size: 239 B |