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
This commit is contained in:
FaceDeer
2020-02-12 23:49:17 -07:00
committed by GitHub
parent 12919e9a16
commit 98fb313eb1
221 changed files with 7159 additions and 445 deletions

View 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

View 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("")

View 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

View 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,
})

View 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,
})

View 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")

View 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

View 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

View 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
--})

View 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,
})

View 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.

View 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 ""

View 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%

View 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

View 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

View 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

View 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

View 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,
})

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 B

View File

@ -0,0 +1,10 @@
All primordial item textures not explicitly listed here were created by ClockGen and licensed under the CC BY 4.0
Created by FaceDeer and also licened under CC BY 4.0 (as well as CC0 public domain):
dfcaverns_mush_diced_giant_mushroom.png
dfcaverns_mush_giant_hypha.png
dfcaverns_mush_sapling.png
dfcaverns_mush_mycelial_fibers.png
From Minetest default mod:
dfcaverns_jungle_sapling.png