Merge pull request #3 from FaceDeer/sunless-sea

Sunless sea
This commit is contained in:
FaceDeer 2018-05-31 20:33:22 -06:00 committed by GitHub
commit f2801ef9ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 3203 additions and 314 deletions

33
README.md Normal file
View File

@ -0,0 +1,33 @@
Inspired by the world of Dwarf Fortress, this mod adds a series of vast cavern layers to the depths of Minetest with a variety of biomes that are populated with the flora of Dwarf Fortress.
## Cavern Layers
The underworld is divided into a number of cavern "layers" with a variety of biomes and other features distributed throughout. As one goes deeper one will find increasingly bizzare flora and exotic environments that provide new challenges and opportunities for players.
The uppermost layer has "flooded" and "dry" caverns, as well as caverns containing the massive tree-like fungal growths of Fungiwood and Tower-Cap mushrooms. These provide a source of underground wood. Also found in this region are plump helmets (an edible farmable mushroom), pig tails (a fibrous fungus that can be grown and harvested for thread), and cave wheat (a pale grass-like growth whose seeds can be ground for flour).
Fungiwood and Tower Caps can still be found the next layer down, though in smaller ranges as they are crowded by several new types of giant fungi. Here you can find Goblin Cap mushrooms, the squatter cousins of the Tower Caps. Spore Trees sprout in the warmer and wetter corners of the caverns, raising a climbable three-dimensional mesh or hyphyae above the ground that emits a gentle rain of spore powder. Tunnel Tubes grow in the hottest regions - tall, curved stalks with fruiting bodies at the tips that burst violently when ripe. And in the dryest regions are the pitch-black caverns of the Black Cap forests, rich with carbonaceous deposits that have accumulated over millions of years. Smaller plants that can be found here include quarry bushes (farmable for their spicy leaves) and dimple cups (whose eponymous parts can be ground to produce a brilliant blue dye).
The third cavern layer no longer supports Fungiwood or Tower Caps, with strange new growths crowding them out. The frigid Nethercap caverns can be found here, the blue-tinted mushrooms leaching heat out of their environment in ways that shouldn't be thermodynamically possible. In the hotter areas the vicious Bloodthorn grows, with wicked spines that suck moisture from anything they can pierce. In caves too dry to support biological life enormous glowing crystals grow instead. Sweet pods can be found down here, a fungus whose fruiting bodies are rich in sugary substances.
The third layer stops on the shores of the Sunless Sea, the ultimate destination of all water that flows downward through the twisty caves of Minetest. The caverns of the Sunless Sea are vast in extent but are flooded with water, and below the surface grows treacherous Snareweed and the rare hanging forests of softly-glowing Cave Coral.
Below the Sunless Sea is a sea of a more dangerous sort: the Magma Ocean. These caverns are filled with dangerous molten rock, though there are riches to be had as well; mineral growths fed by the heat and pressure.
By default, caverns belonging to the first cavern layer can be found between -300 and -900, the second cavern layer between -900 and -1500, and the third cavern layer between -1500 and -2100. The surface level of the Sunless Sea is at -2300 and the magma sea's surface is at -3150.
## Other features
The giant caverns generated by this mod differ slightly from the default giant caverns found in some mapgens, they use an additional source of noise to generate more ledges and horizontal floors. They also contain stalactites and stalagmites of various sizes - from single-node spikes decorating the default twisty tunnels to mountainous behemoths in the main caverns that can reach tens of meters in diameter and hundreds of meters in height.
The trees and plants mentioned above are all farmable, but in contrast to the usual farmable plants and trees they only grow in the *absence* of bright light; attempting to plant them in sunlight will kill them. A set of recipes is added for cooking the edible ones into a variety of biscuits, stews, and roasts, and sweet pods can be refined into syrup.
Some of the other cave decorations provide dim bioluminescent lighting in some caverns. Cave moss and hanging glow-worms are most common. There is also non-glowing floor fungus found coating the stone in less hospitable biomes, capable of spreading to adjacent cobblestone structures like a slow-creeping infection.
## Dependencies and synergies with other mods
This mod depends on the utility mod "subterrane", which was derived from Caverealms code which in turn was derived from Paramat's subterrain.
"dynamic liquid" is also recommended to provide Dwarf Fortress-like fluid dynamics. "magma conduits" is recommended for a Dwarf Fortress like magmatic landscape.
The "doc" mod is supported to provide in-game documentation for all of the new items and nodes this mod adds.

View File

@ -5,6 +5,7 @@ local c_sand = minetest.get_content_id("default:sand")
local c_dirt = minetest.get_content_id("default:dirt")
local c_coal_ore = minetest.get_content_id("default:stone_with_coal")
local c_gravel = minetest.get_content_id("default:gravel")
local c_obsidian = minetest.get_content_id("default:obsidian")
local c_sweet_pod = minetest.get_content_id("dfcaverns:sweet_pod_6") -- param2 = 0
local c_quarry_bush = minetest.get_content_id("dfcaverns:quarry_bush_5") -- param2 = 4
@ -18,6 +19,7 @@ local c_cavern_fungi = minetest.get_content_id("dfcaverns:cavern_fungi") -- para
local c_dirt_moss = minetest.get_content_id("dfcaverns:dirt_with_cave_moss")
local c_cobble_fungus = minetest.get_content_id("dfcaverns:cobble_with_floor_fungus")
local c_wet_flowstone = minetest.get_content_id("dfcaverns:wet_flowstone")
local shallow_cave_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
@ -28,7 +30,7 @@ local shallow_cave_floor = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.025 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.025 * 4)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
end
end
@ -41,7 +43,7 @@ local shallow_cave_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.025 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.025 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
@ -83,6 +85,14 @@ subterrane:register_cave_layer({
cave_threshold = dfcaverns.config.cavern_threshold,
perlin_cave = perlin_cave,
perlin_wave = perlin_wave,
columns = {
maximum_radius = 10,
minimum_radius = 4,
node = c_wet_flowstone,
weight = 0.25,
maximum_count = 20,
minimum_count = 0,
},
})
subterrane:register_cave_layer({
@ -91,6 +101,14 @@ subterrane:register_cave_layer({
cave_threshold = dfcaverns.config.cavern_threshold,
perlin_cave = perlin_cave,
perlin_wave = perlin_wave,
columns = {
maximum_radius = 15,
minimum_radius = 4,
node = c_wet_flowstone,
weight = 0.25,
maximum_count = 30,
minimum_count = 5,
},
})
subterrane:register_cave_layer({
@ -99,6 +117,14 @@ subterrane:register_cave_layer({
cave_threshold = dfcaverns.config.cavern_threshold,
perlin_cave = perlin_cave,
perlin_wave = perlin_wave,
columns = {
maximum_radius = 20,
minimum_radius = 5,
node = c_wet_flowstone,
weight = 0.25,
maximum_count = 50,
minimum_count = 10,
},
})
local perlin_cave_lava = {
@ -121,12 +147,38 @@ local perlin_wave_lava = {
subterrane:register_cave_layer({
minimum_depth = dfcaverns.config.level3_min,
maximum_depth = dfcaverns.config.lava_sea_min,
maximum_depth = dfcaverns.config.sunless_sea_min,
cave_threshold = dfcaverns.config.lava_sea_threshold,
perlin_cave = perlin_cave_lava,
perlin_wave = perlin_wave_lava,
columns = {
maximum_radius = 25,
minimum_radius = 5,
node = c_stone,
weight = 0.25,
maximum_count = 100,
minimum_count = 25,
},
})
if dfcaverns.config.enable_lava_sea then
subterrane:register_cave_layer({
minimum_depth = dfcaverns.config.lava_sea_max,
maximum_depth = dfcaverns.config.lava_sea_min,
cave_threshold = dfcaverns.config.lava_sea_threshold,
perlin_cave = perlin_cave_lava,
perlin_wave = perlin_wave_lava,
columns = {
maximum_radius = 30,
minimum_radius = 5,
node = c_obsidian,
weight = 0.5,
maximum_count = 100,
minimum_count = 25,
},
})
end
dfcaverns.can_support_vegetation = {[c_sand] = true, [c_dirt] = true, [c_coal_ore] = true, [c_gravel] = true}
dfcaverns.place_shrub = function(data, vi, param2_data, shrub_list)

View File

@ -5,66 +5,117 @@ local c_cobble = minetest.get_content_id("default:cobble")
local c_dirt = minetest.get_content_id("default:dirt")
local c_sand = minetest.get_content_id("default:sand")
local c_lava = minetest.get_content_id("default:lava_source")
local c_dirt_moss = minetest.get_content_id("dfcaverns:dirt_with_cave_moss")
local c_cobble_fungus = minetest.get_content_id("dfcaverns:cobble_with_floor_fungus")
local c_dead_fungus = minetest.get_content_id("dfcaverns:dead_fungus") -- param2 = 0
local c_cavern_fungi = minetest.get_content_id("dfcaverns:cavern_fungi") -- param2 = 0
local c_meseore = minetest.get_content_id("default:stone_with_mese")
local c_mesecry = minetest.get_content_id("dfcaverns:glow_mese")
-------------------------------------------------------------------------------------------
local lava_sea_biome_def = {
local mese_crystal_ceiling = function(area, data, ai, vi, bi)
if math.random() < 0.025 then
if math.random() < 0.25 then
subterrane:giant_stalactite(ai, area, data, 6, 13, c_meseore, c_meseore, c_mesecry)
else
data[vi] = c_meseore
if math.random() < 0.25 then
data[bi] = c_mesecry
end
end
end
end
local mese_ore_ceiling = function(area, data, ai, vi, bi)
if math.random() < 0.025 then
data[vi] = c_meseore
if math.random() < 0.25 then
data[bi] = c_mesecry
end
end
end
local mese_ore_floor = function(area, data, ai, vi, bi)
if math.random() < 0.01 then
data[vi] = c_meseore
if math.random() < 0.25 then
data[ai] = c_mesecry
end
end
end
local lava_sea_crystal_biome_def = {
name = "dfcaverns_lava_sea_with_mese_crystal",
y_min = dfcaverns.config.lava_sea_min,
y_max = dfcaverns.config.lava_sea_max,
heat_point = 60,
humidity_point = 30,
_subterrane_ceiling_decor = mese_crystal_ceiling,
_subterrane_floor_decor = mese_ore_floor,
}
local lava_sea_mese_biome_def = {
name = "dfcaverns_lava_sea_with_mese",
y_min = dfcaverns.config.lava_sea_min,
y_max = dfcaverns.config.lava_sea_max,
heat_point = 50,
humidity_point = 40,
_subterrane_ceiling_decor = mese_ore_ceiling,
}
local lava_sea_barren_biome_def = {
name = "dfcaverns_lava_sea",
y_min = dfcaverns.config.lava_sea_min,
y_max = dfcaverns.config.level3_min,
heat_point = 50,
y_max = dfcaverns.config.lava_sea_max,
heat_point = 30,
humidity_point = 50,
}
if not dfcaverns.config.bottom_sea_contains_lava then
lava_sea_biome_def._subterrane_mitigate_lava = true
end
minetest.register_biome(lava_sea_biome_def)
minetest.register_biome(lava_sea_crystal_biome_def)
minetest.register_biome(lava_sea_mese_biome_def)
minetest.register_biome(lava_sea_barren_biome_def)
local c_sea
if dfcaverns.config.bottom_sea_contains_lava then
c_sea = c_lava
else
c_sea = c_water
end
local airspace = 256
local airspace = (dfcaverns.config.lava_sea_max - dfcaverns.config.lava_sea_min) / 2.75
local lava_sea_level = dfcaverns.config.lava_sea_max - airspace
local data = {}
local lavasurface_buffer = {}
local lavasurface_noise
local lavasurface_noise_params = {
offset = 0,
scale = 2,
spread = {x=20, y=20, z=20},
seed = 5033,
octaves = 3,
persist = 0.6
}
minetest.register_on_generated(function(minp, maxp, seed)
--if out of range of cave definition limits, abort
if minp.y > dfcaverns.config.level3_min - airspace or maxp.y < dfcaverns.config.lava_sea_min then
if minp.y > lava_sea_level or maxp.y < dfcaverns.config.lava_sea_min then
return
end
--easy reference to commonly used values
local t_start = os.clock()
local x_max = maxp.x
local y_max = maxp.y
local z_max = maxp.z
local x_min = minp.x
local y_min = minp.y
local z_min = minp.z
if not lavasurface_noise then
local sidelen = maxp.x - minp.x + 1 --length of a mapblock
local chunk_lengths = {x = sidelen, y = sidelen, z = sidelen} --table of chunk edges
lavasurface_noise = minetest.get_perlin_map(lavasurface_noise_params, chunk_lengths)
end
local nvals_lavasurface = lavasurface_noise:get2dMap({x=minp.x, y=minp.z}, lavasurface_buffer)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
vm:get_data(data)
for z = z_min, z_max do -- for each xy plane progressing northwards
for y = y_min, y_max do -- for each x row progressing upwards
local vi = area:index(x_min, y, z) --current node index
for x = x_min, x_max do -- for each node do
if data[vi] == c_air or data[vi] == c_water then
data[vi] = c_sea
end
vi = vi + 1
local minx = minp.x-1
local minz = minp.z-1
for vi, x, y, z in area:iterp_xyz(minp, maxp) do
local lavaheight = nvals_lavasurface[x-minx][z-minz]
if y < lava_sea_level + lavaheight then
if data[vi] == c_air or data[vi] == c_water then
data[vi] = c_lava
end
end
end
@ -74,6 +125,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
--calc lighting
vm:set_lighting({day = 0, night = 0})
vm:calc_lighting()
vm:update_liquids()
--write it to world
vm:write_to_map()
end)

View File

@ -8,10 +8,8 @@ local c_dirt = minetest.get_content_id("default:dirt")
local c_dirt_moss = minetest.get_content_id("dfcaverns:dirt_with_cave_moss")
local c_cobble_fungus = minetest.get_content_id("dfcaverns:cobble_with_floor_fungus")
local c_wet_flowstone = minetest.get_content_id("subterrane:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("subterrane:dry_flowstone")
local subsea_level = (dfcaverns.config.level1_min - dfcaverns.config.ymax) * 0.3 + dfcaverns.config.level1_min
local c_wet_flowstone = minetest.get_content_id("dfcaverns:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("dfcaverns:dry_flowstone")
local c_sweet_pod = minetest.get_content_id("dfcaverns:sweet_pod_6") -- param2 = 0
local c_quarry_bush = minetest.get_content_id("dfcaverns:quarry_bush_5") -- param2 = 4
@ -22,6 +20,9 @@ local c_cave_wheat = minetest.get_content_id("dfcaverns:cave_wheat_8") -- param2
local c_dead_fungus = minetest.get_content_id("dfcaverns:dead_fungus") -- param2 = 0
local c_cavern_fungi = minetest.get_content_id("dfcaverns:cavern_fungi") -- param2 = 0
local subsea_level = (dfcaverns.config.ymax - dfcaverns.config.level1_min) * 0.3 + dfcaverns.config.level1_min
local flooded_biomes = dfcaverns.config.flooded_biomes
local level_1_tower_cap_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
@ -41,7 +42,7 @@ local level_1_tower_cap_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.005 then
dfcaverns.spawn_tower_cap_vm(vi, area, data)
end
@ -67,7 +68,7 @@ local level_1_fungiwood_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.005 then
dfcaverns.spawn_fungiwood_vm(vi, area, data)
end
@ -83,7 +84,7 @@ local level_1_moist_ceiling = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.03 then
dfcaverns.glow_worm_ceiling(area, data, ai, vi, bi)
end
@ -110,7 +111,7 @@ local level_1_wet_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.025 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.025 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
@ -134,7 +135,7 @@ local level_1_dry_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
end
end
@ -148,7 +149,7 @@ local level_1_dry_ceiling = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
@ -161,11 +162,17 @@ local level_1_underwater_floor = function(area, data, ai, vi, bi, param2_data)
else
data[bi] = c_dirt
end
if data[vi] == c_air then
data[vi] = c_water
end
if data[ai] == c_air then
data[ai] = c_water
if flooded_biomes then
if data[vi] == c_air then
data[vi] = c_water
end
if data[ai] == c_air then
data[ai] = c_water
end
elseif math.random() < 0.001 then
if data[vi] == c_air then
data[vi] = c_water
end
end
end
@ -189,7 +196,7 @@ local level_1_cave_floor = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 4)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
@ -203,12 +210,18 @@ local level_1_cave_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
end
end
-------------------------------------------------------------------------------------------
local c_flood_fill
if flooded_biomes then
c_flood_fill = c_water
else
c_flood_fill = c_air
end
minetest.register_biome({
name = "dfcaverns_level1_flooded_biome_lower",
@ -216,10 +229,10 @@ minetest.register_biome({
y_max = subsea_level,
heat_point = 50,
humidity_point = 100,
_subterrane_fill_node = c_water,
_subterrane_cave_fill_node = c_water,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_floor_decor = level_1_underwater_floor,
_subterrane_mitigate_lava = false, -- no need to mitigate lava in a flooded cave, problem is self-solving
_subterrane_mitigate_lava = true,
})
minetest.register_biome({
@ -231,7 +244,7 @@ minetest.register_biome({
_subterrane_ceiling_decor = level_1_moist_ceiling,
_subterrane_floor_decor = level_1_wet_floor,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_mitigate_lava = true,
})
@ -298,9 +311,9 @@ minetest.register_biome({
heat_point = 20,
humidity_point = 80,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_floor_decor = level_1_underwater_floor,
_subterrane_mitigate_lava = false, -- no need to mitigate lava in a flooded cave, problem is self-solving
_subterrane_mitigate_lava = true,
})
@ -325,9 +338,9 @@ minetest.register_biome({
heat_point = 80,
humidity_point = 80,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_floor_decor = level_1_underwater_floor,
_subterrane_mitigate_lava = false, -- no need to mitigate lava in a flooded cave, problem is self-solving
_subterrane_mitigate_lava = true,
})
minetest.register_biome({

View File

@ -10,13 +10,13 @@ local c_stone = minetest.get_content_id("default:stone")
local c_cobble = minetest.get_content_id("default:cobble")
local c_mossycobble = minetest.get_content_id("default:mossycobble")
local c_dirt = minetest.get_content_id("default:dirt")
local c_stone_with_coal = minetest.get_content_id("default:stone_with_coal")
local c_dirt_moss = minetest.get_content_id("dfcaverns:dirt_with_cave_moss")
local c_cobble_fungus = minetest.get_content_id("dfcaverns:cobble_with_floor_fungus")
local c_wet_flowstone = minetest.get_content_id("subterrane:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("subterrane:dry_flowstone")
local c_wet_flowstone = minetest.get_content_id("dfcaverns:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("dfcaverns:dry_flowstone")
local c_sweet_pod = minetest.get_content_id("dfcaverns:sweet_pod_6") -- param2 = 0
local c_quarry_bush = minetest.get_content_id("dfcaverns:quarry_bush_5") -- param2 = 4
@ -27,8 +27,8 @@ local c_cave_wheat = minetest.get_content_id("dfcaverns:cave_wheat_8") -- param2
local c_dead_fungus = minetest.get_content_id("dfcaverns:dead_fungus") -- param2 = 0
local c_cavern_fungi = minetest.get_content_id("dfcaverns:cavern_fungi") -- param2 = 0
local subsea_level = (dfcaverns.config.level2_min - dfcaverns.config.level1_min) * 0.3 + dfcaverns.config.level2_min
local subsea_level = (dfcaverns.config.level1_min - dfcaverns.config.level2_min) * 0.3 + dfcaverns.config.level2_min
local flooded_biomes = dfcaverns.config.flooded_biomes
local level_2_tower_cap_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
@ -49,7 +49,7 @@ local level_2_tower_cap_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.005 then
dfcaverns.spawn_tower_cap_vm(vi, area, data)
end
@ -73,7 +73,7 @@ local level_2_fungiwood_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.005 then
dfcaverns.spawn_fungiwood_vm(vi, area, data)
end
@ -97,7 +97,7 @@ local level_2_tunnel_tube_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.05 then
dfcaverns.spawn_tunnel_tube_vm(vi, area, data, param2_data)
end
@ -109,7 +109,7 @@ local level_2_black_cap_floor = function(area, data, ai, vi, bi, param2_data)
end
if math.random() < 0.25 then
data[bi] = c_dirt
data[bi] = c_stone_with_coal
else
data[bi] = c_cobble_fungus
end
@ -123,7 +123,7 @@ local level_2_black_cap_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.025 then
dfcaverns.spawn_black_cap_vm(vi, area, data)
end
@ -149,7 +149,7 @@ local level_2_spore_tree_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.05 then
dfcaverns.spawn_spore_tree_vm(vi, area, data)
end
@ -175,7 +175,7 @@ local level_2_goblin_cap_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.025 then
dfcaverns.spawn_goblin_cap_vm(vi, area, data)
end
@ -192,7 +192,7 @@ local level_2_moist_ceiling = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.07 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.07 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.025 then
dfcaverns.glow_worm_ceiling(area, data, ai, vi, bi)
end
@ -219,7 +219,7 @@ local level_2_wet_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
@ -243,7 +243,7 @@ local level_2_dry_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
end
end
@ -255,7 +255,38 @@ local level_2_dry_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
local level_2_black_cap_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
return
end
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
elseif math.random() < 0.25 then
data[ai] = c_stone_with_coal
end
end
local level_2_crystal_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
return
end
if math.random() < 0.0025 then
dfcaverns.place_big_crystal_cluster(area, data, param2_data, vi, math.random(0,1), true)
end
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
@ -264,6 +295,19 @@ local level_2_underwater_floor = function(area, data, ai, vi, bi, param2_data)
return
end
data[bi] = c_dirt
if flooded_biomes then
if data[vi] == c_air then
data[vi] = c_water
end
if data[ai] == c_air then
data[ai] = c_water
end
elseif math.random() < 0.001 then
if data[vi] == c_air then
data[vi] = c_water
end
end
end
local level_2_cave_floor = function(area, data, ai, vi, bi, param2_data)
@ -285,7 +329,7 @@ local level_2_cave_floor = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 4)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
@ -299,12 +343,18 @@ local level_2_cave_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
end
end
-------------------------------------------------------------------------------------------
local c_flood_fill
if flooded_biomes then
c_flood_fill = c_water
else
c_flood_fill = c_air
end
minetest.register_biome({
name = "dfcaverns_level2_flooded_biome_lower",
@ -312,8 +362,8 @@ minetest.register_biome({
y_max = subsea_level,
heat_point = 50,
humidity_point = 90,
_subterrane_fill_node = c_water,
_subterrane_cave_fill_node = c_water,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_floor_decor = level_2_underwater_floor,
_subterrane_mitigate_lava = false,
})
@ -327,7 +377,7 @@ minetest.register_biome({
_subterrane_ceiling_decor = level_2_moist_ceiling,
_subterrane_floor_decor = level_2_wet_floor,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_mitigate_lava = true,
})
@ -479,9 +529,10 @@ minetest.register_biome({
y_max = subsea_level,
heat_point = 50,
humidity_point = 20,
_subterrane_ceiling_decor = level_2_dry_ceiling,
_subterrane_ceiling_decor = level_2_black_cap_ceiling,
_subterrane_floor_decor = level_2_black_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_cave_floor_decor = level_2_cave_floor,
_subterrane_cave_ceiling_decor = level_2_cave_ceiling,
_subterrane_mitigate_lava = true,
@ -493,9 +544,10 @@ minetest.register_biome({
y_max = dfcaverns.config.level1_min,
heat_point = 50,
humidity_point = 20,
_subterrane_ceiling_decor = level_2_dry_ceiling,
_subterrane_ceiling_decor = level_2_black_cap_ceiling,
_subterrane_floor_decor = level_2_black_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_cave_floor_decor = level_2_cave_floor,
_subterrane_cave_ceiling_decor = level_2_cave_ceiling,
_subterrane_mitigate_lava = true,
@ -507,9 +559,10 @@ minetest.register_biome({
y_max = subsea_level,
heat_point = 50,
humidity_point = 15,
_subterrane_ceiling_decor = level_2_dry_ceiling,
_subterrane_ceiling_decor = level_2_crystal_ceiling,
_subterrane_floor_decor = level_2_dry_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_mitigate_lava = false,
})
@ -522,5 +575,6 @@ minetest.register_biome({
_subterrane_ceiling_decor = level_2_dry_ceiling,
_subterrane_floor_decor = level_2_dry_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_mitigate_lava = false,
})

View File

@ -12,6 +12,7 @@ local c_cobble = minetest.get_content_id("default:cobble")
local c_mossycobble = minetest.get_content_id("default:mossycobble")
local c_dirt = minetest.get_content_id("default:dirt")
local c_sand = minetest.get_content_id("default:sand")
local c_stone_with_coal = minetest.get_content_id("default:stone_with_coal")
local c_silver_sand = minetest.get_content_id("default:silver_sand")
local c_snow = minetest.get_content_id("default:snow")
@ -20,8 +21,8 @@ local c_ice = minetest.get_content_id("default:ice")
local c_dirt_moss = minetest.get_content_id("dfcaverns:dirt_with_cave_moss")
local c_cobble_fungus = minetest.get_content_id("dfcaverns:cobble_with_floor_fungus")
local c_wet_flowstone = minetest.get_content_id("subterrane:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("subterrane:dry_flowstone")
local c_wet_flowstone = minetest.get_content_id("dfcaverns:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("dfcaverns:dry_flowstone")
local c_sweet_pod = minetest.get_content_id("dfcaverns:sweet_pod_6") -- param2 = 0
local c_quarry_bush = minetest.get_content_id("dfcaverns:quarry_bush_5") -- param2 = 4
@ -32,7 +33,8 @@ local c_cave_wheat = minetest.get_content_id("dfcaverns:cave_wheat_8") -- param2
local c_dead_fungus = minetest.get_content_id("dfcaverns:dead_fungus") -- param2 = 0
local c_cavern_fungi = minetest.get_content_id("dfcaverns:cavern_fungi") -- param2 = 0
local subsea_level = (dfcaverns.config.level3_min - dfcaverns.config.level2_min) * 0.3 + dfcaverns.config.level3_min
local subsea_level = (dfcaverns.config.level2_min - dfcaverns.config.level3_min) * 0.3 + dfcaverns.config.level3_min
local flooded_biomes = dfcaverns.config.flooded_biomes
local level_3_moist_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
@ -44,7 +46,7 @@ local level_3_moist_ceiling = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.03 then
dfcaverns.glow_worm_ceiling(area, data, ai, vi, bi)
end
@ -70,10 +72,33 @@ local level_3_dry_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
end
end
local level_3_crystal_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
end
floor_item = math.random()
if floor_item < 0.005 then
dfcaverns.place_big_crystal_cluster(area, data, param2_data, vi, math.random(0,2), false)
elseif floor_item < 0.5 then
data[bi] = c_cobble
end
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if drip_rand < 0.001 then
subterrane:giant_stalagmite(bi, area, data, 6, 20, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
elseif drip_rand < 0.025 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.025 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
end
end
local level_3_wet_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
@ -95,16 +120,28 @@ local level_3_wet_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
local level_3_underwater_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
end
data[bi] = c_dirt
if flooded_biomes then
if data[vi] == c_air then
data[vi] = c_water
end
if data[ai] == c_air then
data[ai] = c_water
end
elseif math.random() < 0.001 then
if data[vi] == c_air then
data[vi] = c_water
end
end
end
local level_3_dry_ceiling = function(area, data, ai, vi, bi, param2_data)
@ -115,7 +152,39 @@ local level_3_dry_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
local level_3_black_cap_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
return
end
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
elseif math.random() < 0.25 then
data[ai] = c_stone_with_coal
end
end
local level_3_crystal_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
return
end
if math.random() < 0.005 then
dfcaverns.place_big_crystal_cluster(area, data, param2_data, vi, math.random(0,3), true)
end
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if drip_rand < 0.025 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.025 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.dry_stalagmite_ids)
end
end
@ -132,11 +201,11 @@ local level_3_blood_thorn_floor = function(area, data, ai, vi, bi, param2_data)
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if math.random() < 0.1 then
dfcaverns.place_shrub(data, vi, param2_data, {c_sweet_pod, c_sweet_pod, c_plump_helmet, c_dead_fungus, c_dead_fungus, c_dead_fungus, c_cavern_fungi})
dfcaverns.place_shrub(data, vi, param2_data, {c_sweet_pod, c_sweet_pod, c_dead_fungus, c_dead_fungus, c_dead_fungus, c_cavern_fungi})
elseif drip_rand < 0.05 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.05 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
elseif math.random() < 0.05 then
dfcaverns.spawn_blood_thorn_vm(vi, area, data, param2_data)
end
@ -160,12 +229,12 @@ local level_3_nether_cap_floor = function(area, data, ai, vi, bi, param2_data)
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if math.random() < 0.01 and data[bi] ~= c_ice then
dfcaverns.place_shrub(data, vi, param2_data, {c_dimple_cup, c_plump_helmet, c_dead_fungus, c_dead_fungus, c_dead_fungus, c_cavern_fungi})
dfcaverns.place_shrub(data, vi, param2_data, {c_dimple_cup, c_dead_fungus, c_dead_fungus, c_dead_fungus, c_cavern_fungi})
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
data[vi] = c_air
subterrane:stalagmite(vi, area, data, param2_data, param2, height, false)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.icicle_ids)
elseif math.random() < 0.005 then
dfcaverns.spawn_nether_cap_vm(vi, area, data)
end
@ -190,7 +259,7 @@ local level_3_tunnel_tube_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.05 then
dfcaverns.spawn_tunnel_tube_vm(vi, area, data, param2_data)
end
@ -216,7 +285,7 @@ local level_3_spore_tree_floor = function(area, data, ai, vi, bi, param2_data)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.05 then
dfcaverns.spawn_spore_tree_vm(vi, area, data)
end
@ -228,7 +297,7 @@ local level_3_black_cap_floor = function(area, data, ai, vi, bi, param2_data)
end
if math.random() < 0.25 then
data[bi] = c_dirt
data[bi] = c_stone_with_coal
else
data[bi] = c_cobble_fungus
end
@ -241,8 +310,8 @@ local level_3_black_cap_floor = function(area, data, ai, vi, bi, param2_data)
subterrane:giant_stalagmite(bi, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
local height = math.floor(drip_rand/0.1 * 5)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.dry_stalagmite_ids)
elseif math.random() < 0.025 then
dfcaverns.spawn_black_cap_vm(vi, area, data)
end
@ -262,11 +331,11 @@ local level_3_goblin_cap_floor = function(area, data, ai, vi, bi, param2_data)
local drip_rand = subterrane:vertically_consistent_random(vi, area)
if math.random() < 0.1 then
dfcaverns.place_shrub(data, vi, param2_data, {c_plump_helmet, c_sweet_pod, c_sweet_pod, c_quarry_bush, c_dead_fungus, c_cavern_fungi})
dfcaverns.place_shrub(data, vi, param2_data, {c_plump_helmet, c_plump_helmet, c_sweet_pod, c_dead_fungus, c_cavern_fungi})
elseif drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
elseif math.random() < 0.025 then
dfcaverns.spawn_goblin_cap_vm(vi, area, data)
end
@ -296,7 +365,7 @@ local level_3_cave_floor = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.075 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.075 * 4)
subterrane:stalagmite(vi, area, data, param2_data, param2, height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, dfcaverns.wet_stalagmite_ids)
end
end
@ -310,20 +379,26 @@ local level_3_cave_ceiling = function(area, data, ai, vi, bi, param2_data)
if drip_rand < 0.1 then
local param2 = drip_rand*1000000 - math.floor(drip_rand*1000000/4)*4
local height = math.floor(drip_rand/0.1 * 5)
subterrane:stalagmite(vi, area, data, param2_data, param2, -height, true)
subterrane:small_stalagmite(vi, area, data, param2_data, param2, -height, dfcaverns.wet_stalagmite_ids)
end
end
-------------------------------------------------------------------------------------------
local c_flood_fill
if flooded_biomes then
c_flood_fill = c_water
else
c_flood_fill = c_air
end
minetest.register_biome({
name = "dfcaverns_level3_flooded_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 50,
humidity_point = 90,
_subterrane_fill_node = c_water,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_floor_decor = level_3_underwater_floor,
})
@ -337,22 +412,25 @@ minetest.register_biome({
_subterrane_ceiling_decor = level_3_moist_ceiling,
_subterrane_floor_decor = level_3_wet_floor,
_subterrane_fill_node = c_air,
_subterrane_cave_fill_node = c_water,
_subterrane_cave_fill_node = c_flood_fill,
_subterrane_mitigate_lava = true,
})
minetest.register_biome({
name = "dfcaverns_level3_blood_thorn_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 10,
humidity_point = 30,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_ceiling_decor = level_3_crystal_ceiling,
_subterrane_floor_decor = level_3_blood_thorn_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_coral",
_subterrane_mitigate_lava = true,
})
@ -362,8 +440,9 @@ minetest.register_biome({
y_max = dfcaverns.config.level2_min,
heat_point = 10,
humidity_point = 30,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_ceiling_decor = level_3_crystal_ceiling,
_subterrane_floor_decor = level_3_blood_thorn_floor,
_subterrane_column_node = c_dry_flowstone,
_subterrane_fill_node = c_air,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
@ -372,15 +451,18 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_nether_cap_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 90,
humidity_point = 50,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_floor_decor = level_3_nether_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_ice,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_snareweed",
_subterrane_mitigate_lava = true,
})
@ -393,6 +475,7 @@ minetest.register_biome({
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_floor_decor = level_3_nether_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_ice,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_mitigate_lava = true,
@ -400,7 +483,7 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_goblin_cap_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 20,
humidity_point = 60,
@ -409,6 +492,8 @@ minetest.register_biome({
_subterrane_fill_node = c_air,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_coral",
_subterrane_mitigate_lava = true,
})
@ -428,7 +513,7 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_spore_tree_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 60,
humidity_point = 60,
@ -437,6 +522,8 @@ minetest.register_biome({
_subterrane_fill_node = c_air,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_snareweed",
_subterrane_mitigate_lava = true,
})
@ -456,7 +543,7 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_tunnel_tube_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 60,
humidity_point = 40,
@ -465,6 +552,8 @@ minetest.register_biome({
_subterrane_fill_node = c_air,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_snareweed",
_subterrane_mitigate_lava = true,
})
@ -484,27 +573,31 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_black_cap_biome_lower",
y_min = dfcaverns.config.level2_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 50,
humidity_point = 15,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_ceiling_decor = level_3_black_cap_ceiling,
_subterrane_floor_decor = level_3_black_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_barren",
_subterrane_mitigate_lava = true,
})
minetest.register_biome({
name = "dfcaverns_level3_black_cap_biome_upper",
y_min = subsea_level,
y_max = dfcaverns.config.level3_min,
y_max = dfcaverns.config.level2_min,
heat_point = 50,
humidity_point = 15,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_ceiling_decor = level_3_black_cap_ceiling,
_subterrane_floor_decor = level_3_black_cap_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_cave_floor_decor = level_3_cave_floor,
_subterrane_cave_ceiling_decor = level_3_cave_ceiling,
_subterrane_mitigate_lava = true,
@ -512,13 +605,16 @@ minetest.register_biome({
minetest.register_biome({
name = "dfcaverns_level3_dry_biome_lower",
y_min = dfcaverns.config.level3_min,
y_min = dfcaverns.config.sunless_sea_level,
y_max = subsea_level,
heat_point = 50,
humidity_point = 10,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_floor_decor = level_3_dry_floor,
_subterrane_ceiling_decor = level_3_crystal_ceiling,
_subterrane_floor_decor = level_3_crystal_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_override_sea_level = dfcaverns.config.sunless_sea_level,
_subterrane_override_under_sea_biome = "dfcaverns_sunless_sea_barren",
_subterrane_mitigate_lava = false,
})
@ -528,8 +624,9 @@ minetest.register_biome({
y_max = dfcaverns.config.level2_min,
heat_point = 50,
humidity_point = 10,
_subterrane_ceiling_decor = level_3_dry_ceiling,
_subterrane_floor_decor = level_3_dry_floor,
_subterrane_ceiling_decor = level_3_crystal_ceiling,
_subterrane_floor_decor = level_3_crystal_floor,
_subterrane_fill_node = c_air,
_subterrane_column_node = c_dry_flowstone,
_subterrane_mitigate_lava = false,
})

129
biomes/sunless_sea.lua Normal file
View File

@ -0,0 +1,129 @@
local c_water = minetest.get_content_id("default:water_source")
local c_air = minetest.get_content_id("air")
local c_stone = minetest.get_content_id("default:stone")
local c_dirt = minetest.get_content_id("default:dirt")
local c_sand = minetest.get_content_id("default:sand")
-------------------------------------------------------------------------------------------
local sea_level = dfcaverns.config.sunless_sea_level
local sunless_sea_barren_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
end
data[bi] = c_sand
end
local sunless_sea_snareweed_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
end
if math.random() < 0.005 then
dfcaverns.place_snareweed_patch(area, data, bi, param2_data, 6)
else
data[bi] = c_dirt
end
end
local sunless_sea_coral_ceiling = function(area, data, ai, vi, bi, param2_data)
if data[ai] ~= c_stone then
return
end
local coral_rand = subterrane:vertically_consistent_random(vi, area)
if coral_rand < 0.01 then
local iterations = math.ceil(coral_rand / 0.01 * 6)
dfcaverns.spawn_cave_coral(area, data, vi, iterations)
end
end
local sunless_sea_coral_floor = function(area, data, ai, vi, bi, param2_data)
if data[bi] ~= c_stone then
return
end
local coral_rand = subterrane:vertically_consistent_random(vi, area)
if coral_rand < 0.01 then
local iterations = math.ceil(coral_rand / 0.01 * 6)
dfcaverns.spawn_coral_pile(area, data, vi, iterations)
end
end
minetest.register_biome({
name = "dfcaverns_sunless_sea_barren",
y_min = dfcaverns.config.sunless_sea_min,
y_max = dfcaverns.config.sunless_sea_level,
heat_point = 80,
humidity_point = 10,
_subterrane_fill_node = c_water,
_subterrane_cave_fill_node = c_air,
_subterrane_mitigate_lava = true,
_subterrane_floor_decor = sunless_sea_barren_floor,
})
minetest.register_biome({
name = "dfcaverns_sunless_sea_snareweed",
y_min = dfcaverns.config.sunless_sea_min,
y_max = dfcaverns.config.sunless_sea_level,
heat_point = 80,
humidity_point = 90,
_subterrane_fill_node = c_water,
_subterrane_cave_fill_node = c_water,
_subterrane_mitigate_lava = true,
_subterrane_floor_decor = sunless_sea_snareweed_floor,
})
minetest.register_biome({
name = "dfcaverns_sunless_sea_coral",
y_min = dfcaverns.config.sunless_sea_min,
y_max = dfcaverns.config.sunless_sea_level,
heat_point = 0,
humidity_point = 50,
_subterrane_fill_node = c_water,
_subterrane_cave_fill_node = c_water,
_subterrane_mitigate_lava = true,
_subterrane_floor_decor = sunless_sea_coral_floor,
_subterrane_ceiling_decor = sunless_sea_coral_ceiling,
})
local data = {}
minetest.register_on_generated(function(minp, maxp, seed)
--if out of range of cave definition limits, abort
if minp.y > dfcaverns.config.sunless_sea_level or maxp.y < dfcaverns.config.sunless_sea_min then
return
end
--easy reference to commonly used values
local t_start = os.clock()
local x_max = maxp.x
local y_max = maxp.y
local z_max = maxp.z
local x_min = minp.x
local y_min = minp.y
local z_min = minp.z
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
vm:get_data(data)
for z = z_min, z_max do -- for each xy plane progressing northwards
for y = y_min, y_max do -- for each x row progressing upwards
if y <= dfcaverns.config.sunless_sea_level then
local vi = area:index(x_min, y, z) --current node index
for x = x_min, x_max do -- for each node do
if data[vi] == c_air then
data[vi] = c_water
end
vi = vi + 1
end
end
end
end
--send data back to voxelmanip
vm:set_data(data)
--calc lighting
vm:set_lighting({day = 0, night = 0})
vm:calc_lighting()
--write it to world
vm:write_to_map()
end)

View File

@ -65,19 +65,27 @@ end
setting("float", "glow_worm_delay_multiplier", 10.0, "glow worm growth delay multiplier")
setting("bool", "light_kills_fungus", true, "Light kills fungus")
setting("bool", "snareweed_damage", true, "Snareweed causes damage to players")
--Caverns
setting("float", "vertical_cavern_scale", 256, "Vertical cavern dimension scale")
setting("float", "horizontal_cavern_scale", 256, "Horizontal cavern dimension scale")
setting("float", "cavern_threshold", 0.5, "Cavern threshold")
setting("int", "ymax", -300, "Upper limit of level 1")
setting("int", "level1_min", -900, "Upper limit of level 2")
setting("int", "level2_min", -1500, "Upper limit of level 3")
setting("int", "level3_min", -2100, "Upper limit of lava sea")
setting("int", "lava_sea_min", -2700, "Lower limit of the lava sea")
setting("int", "level3_min", -2100, "Upper limit of the sunless sea")
setting("int", "sunless_sea_min", -2500, "Lower limit of the sunless sea")
setting("float", "lava_sea_threshold", 0.2, "Cavern threshold for magma sea (higher number means sparser magma)")
setting("bool", "bottom_sea_contains_lava", true, "Lower sea contains lava")
setting("int", "lava_sea_max", -3000, "Upper limit of the lava sea")
setting("int", "lava_sea_min", -3500, "Lower limit of the lava sea")
setting("float", "lava_sea_threshold", 0.2, "Cavern threshold for sunless and magma seas (higher number means sparser magma)")
setting("bool", "enable_lava_sea", true, "Enable magma sea level")
setting("bool", "flooded_biomes", true, "Add a lot of water to the most humid cavern biomes")
if minetest.get_modpath("tnt") then
dfcaverns.config.enable_tnt = minetest.settings:get_bool("enable_tnt")
@ -86,3 +94,5 @@ if minetest.get_modpath("tnt") then
dfcaverns.config.enable_tnt = minetest.is_singleplayer()
end
end
dfcaverns.config.sunless_sea_level = dfcaverns.config.level3_min - (dfcaverns.config.level3_min - dfcaverns.config.sunless_sea_min) * 0.5

27
doc.lua
View File

@ -16,13 +16,36 @@ dfcaverns.doc.roast_desc = S("Four finely minced ingredients combine into a roas
dfcaverns.doc.roast_usage = nil
dfcaverns.doc.cave_moss_desc = S("Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.")
dfcaverns.doc.cave_moss_usage = S("Cave moss has no known uses. It dies when exposed to bright light sources.")
dfcaverns.doc.cave_moss_usage = S("Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.")
dfcaverns.doc.floor_fungus_desc = S("Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments.")
dfcaverns.doc.floor_fungus_usage = S("Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns.")
dfcaverns.doc.glow_worms_desc = S("Glistening strings of silk hang from the ceilings of some of the larger caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast.")
dfcaverns.doc.glow_worms_usage = S("Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated.")
dfcaverns.doc.snareweed_desc = S("A nasty kelp-like plant that grows in patches on the floor of the Sunless Sea. Its reflective patches draw in the unwary and then its prickly barbs catch and hold small creatures.")
dfcaverns.doc.snareweed_usage = S("Snareweed has no practical use, its fibers disintegrate when they dry.")
dfcaverns.doc.cave_coral_desc = S("A rare form of coral found only deep underground in the Sunless Sea, cave coral grows hanging from the ceilings of flooded caverns.")
dfcaverns.doc.cave_coral_usage = S("Aside from their aesthetic beauty, cave corals can be harvested for simple building materials.")
dfcaverns.doc.flowstone_desc = S("Flowstone is a carbonate-rich rock formation deposited by flowing water. It consists of minerals that the water dissolved earlier as it widens cracks and fissures into caves.")
dfcaverns.doc.flowstone_usage = S("Aside from the aesthetic beauty of its formations flowstone has no special properties or uses.")
dfcaverns.doc.dripstone_desc = S("The iconic stalactites and stalagmites found in caverns are composed of flowstone (or 'dripstone' in the case of these formations). Moist dripstone is still undergoing growth, whereas dry dripstone is found in 'dead' caverns once the source of water that created them ceases.")
dfcaverns.doc.dripstone_usage = S("Although stalagmites are blunter than the stalactites above them, they can cause extra damage to the unwary caver who falls on them.")
dfcaverns.doc.icicle_desc = S("Ice formed by water dripping slowly into a cold environment, icicles tend to be exceptionally pure and clear.")
dfcaverns.doc.icicle_usage = S("Falling onto an icicle is particularly damaging.")
dfcaverns.doc.glow_mese_desc = S("Deep in the infernal conditions of the magma sea, over the course of millions of years, mese crystals grow into flawless blocks that glow bright with strange energies.")
dfcaverns.doc.glow_mese_usage = S("These blocks can be broken down into a large number of mese crystals, but cannot be artificially reassembled.")
dfcaverns.doc.glow_ruby_ore_desc = S("Large, dry caverns deep underground are well suited to aeons-long processes that concentrate crystalline substances in their walls. This rock is riddled with veins of the stuff.")
dfcaverns.doc.glow_ruby_ore_usage = S("Aside from its aesthetic value this rock has no particular use.")
dfcaverns.doc.big_crystal_desc = S("Monolithic crystals of this size form only over extremely long periods deep underground, in large long-lived cavities that allow them room to grow. Water and the life it hosts tend to disrupt the formation process of these crystals so they're only found in dry environments.")
dfcaverns.doc.big_crystal_usage = S("Aside from its aesthetic value this crystal has no particular use.")
-- Plants
dfcaverns.doc.dead_fungus_desc = S("Whatever this fungus was in life, it is now dead.")
@ -70,7 +93,7 @@ dfcaverns.doc.sweet_pod_syrup_usage = S("Too strong and thick to drink straight,
-- Trees
dfcaverns.doc.black_cap_desc = S("The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.")
dfcaverns.doc.black_cap_usage = S("Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications.")
dfcaverns.doc.black_cap_usage = S("Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.")
dfcaverns.doc.blood_thorn_desc = S("Blood thorns are the most vicious of underground flora, as befits their harsh environments. Found only in hot, dry caverns with sandy soil far from the surface world's organic bounty, blood thorns seek to supplement their nutrient supply with wickedly barbed hollow spines that actively drain fluids from whatever stray plant or creature they might impale.")
dfcaverns.doc.blood_thorn_usage = S("When harvested, the central stalk of a blood thorn can be cut into planks and used as wood. It has a purple-red hue that may or may not appeal, depending on one's artistic tastes.")

113
features/cave_coral.lua Normal file
View File

@ -0,0 +1,113 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
minetest.register_node("dfcaverns:cave_coral_3", {
description = S("Cave Coral"),
_doc_items_longdesc = dfcaverns.doc.cave_coral_desc,
_doc_items_usagehelp = dfcaverns.doc.cave_coral_usage,
tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"},
is_ground_content = true,
drop = "default:coral_skeleton",
light_source = 3,
groups = {cracky = 3, dfcaverns_cave_coral = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("dfcaverns:cave_coral_2", {
description = S("Cave Coral"),
_doc_items_longdesc = dfcaverns.doc.cave_coral_desc,
_doc_items_usagehelp = dfcaverns.doc.cave_coral_usage,
tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"},
is_ground_content = true,
drop = "default:coral_skeleton",
light_source = 2,
groups = {cracky = 3, dfcaverns_cave_coral = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("dfcaverns:cave_coral_1", {
description = S("Cave Coral"),
_doc_items_longdesc = dfcaverns.doc.cave_coral_desc,
_doc_items_usagehelp = dfcaverns.doc.cave_coral_usage,
tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"},
is_ground_content = true,
drop = "default:coral_skeleton",
light_source = 1,
groups = {cracky = 3, dfcaverns_cave_coral = 1},
sounds = default.node_sound_stone_defaults(),
})
local coral_names = {"dfcaverns:cave_coral_1", "dfcaverns:cave_coral_2", "dfcaverns:cave_coral_3"}
minetest.register_abm{
label = "dfcaverns:shifting_coral",
nodenames = {"group:dfcaverns_cave_coral"},
interval = 2,
chance = 10,
action = function(pos)
minetest.swap_node(pos, {name=coral_names[math.random(1,3)]})
end,
}
local c_coral_1 = minetest.get_content_id("dfcaverns:cave_coral_1")
local c_coral_2 = minetest.get_content_id("dfcaverns:cave_coral_2")
local c_coral_3 = minetest.get_content_id("dfcaverns:cave_coral_3")
local c_coral_skeleton = minetest.get_content_id("default:coral_skeleton")
local c_dirt = minetest.get_content_id("default:dirt")
local c_stone = minetest.get_content_id("default:stone")
local corals = {c_coral_1, c_coral_2, c_coral_3}
local get_coral = function()
return corals[math.random(1,3)]
end
dfcaverns.spawn_cave_coral = function(area, data, vi, iterations)
local run = math.random(2,4)
local index = vi
local zstride = area.zstride
local ystride = area.ystride
while run > 0 do
if math.random() > 0.95 or data[index] == c_stone or not area:containsi(index) then return end
data[index] = get_coral()
if iterations > 2 then
data[index + 1] = get_coral()
data[index - 1] = get_coral()
data[index + zstride] = get_coral()
data[index - zstride] = get_coral()
end
if iterations > 3 then
data[index + 2] = get_coral()
data[index - 2] = get_coral()
data[index + zstride * 2] = get_coral()
data[index - zstride * 2] = get_coral()
data[index + 1 + zstride] = get_coral()
data[index - 1 + zstride] = get_coral()
data[index + 1 - zstride] = get_coral()
data[index - 1 - zstride] = get_coral()
end
index = index - ystride
run = run - 1
end
local newiterations = iterations - 1
if newiterations == 0 then return end
if math.random() > 0.5 then
dfcaverns.spawn_cave_coral(area, data, index + 1 + ystride, newiterations)
dfcaverns.spawn_cave_coral(area, data, index - 1 + ystride, newiterations)
else
dfcaverns.spawn_cave_coral(area, data, index + zstride + ystride, newiterations)
dfcaverns.spawn_cave_coral(area, data, index - zstride + ystride, newiterations)
end
end
dfcaverns.spawn_coral_pile = function(area, data, vi, radius)
local pos = area:position(vi)
for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do
local adjacent = li + area.ystride
local node_type = data[li]
if math.random() < 0.2 and (node_type == c_stone or node_type == c_dirt) and data[adjacent] == c_water then
data[adjacent] = c_coral_skeleton
end
end
end

View File

@ -0,0 +1,77 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
minetest.register_alias("subterrane:dry_stal_1", "dfcaverns:dry_stal_1")
minetest.register_alias("subterrane:dry_stal_1", "dfcaverns:dry_stal_1")
minetest.register_alias("subterrane:dry_stal_1", "dfcaverns:dry_stal_1")
minetest.register_alias("subterrane:dry_stal_1", "dfcaverns:dry_stal_1")
minetest.register_alias("subterrane:wet_stal_1", "dfcaverns:wet_stal_1")
minetest.register_alias("subterrane:wet_stal_1", "dfcaverns:wet_stal_1")
minetest.register_alias("subterrane:wet_stal_1", "dfcaverns:wet_stal_1")
minetest.register_alias("subterrane:wet_stal_1", "dfcaverns:wet_stal_1")
minetest.register_alias("subterrane:wet_flowstone", "dfcaverns:wet_flowstone")
minetest.register_alias("subterrane:dry_flowstone", "dfcaverns:dry_flowstone")
-----------------------------------------------
dfcaverns.dry_stalagmite_ids = subterrane.register_stalagmite_nodes("dfcaverns:dry_stal", {
description = S("Dry Dripstone"),
_doc_items_longdesc = dfcaverns.doc.dripstone_desc,
_doc_items_usagehelp = dfcaverns.doc.dripstone_usage,
tiles = {
"default_stone.png^[brighten",
},
groups = {cracky = 3, stone = 2},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("dfcaverns:dry_flowstone", {
description = S("Dry Flowstone"),
_doc_items_longdesc = dfcaverns.doc.flowstone_desc,
_doc_items_usagehelp = dfcaverns.doc.flowstone_usage,
tiles = {"default_stone.png^[brighten"},
groups = {cracky = 3, stone = 1},
is_ground_content = true,
drop = 'default:cobble',
sounds = default.node_sound_stone_defaults(),
})
-----------------------------------------------
dfcaverns.wet_stalagmite_ids = subterrane.register_stalagmite_nodes("dfcaverns:wet_stal", {
description = S("Wet Dripstone"),
_doc_items_longdesc = dfcaverns.doc.dripstone_desc,
_doc_items_usagehelp = dfcaverns.doc.dripstone_usage,
tiles = {
"default_stone.png^[brighten^dfcaverns_dripstone_streaks.png",
},
groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1},
sounds = default.node_sound_stone_defaults(),
}, "dfcaverns:dry_stal")
minetest.register_node("dfcaverns:wet_flowstone", {
description = S("Wet Flowstone"),
_doc_items_longdesc = dfcaverns.doc.flowstone_desc,
_doc_items_usagehelp = dfcaverns.doc.flowstone_usage,
tiles = {"default_stone.png^[brighten^dfcaverns_dripstone_streaks.png"},
groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1},
is_ground_content = true,
drop = 'default:cobble',
sounds = default.node_sound_stone_defaults(),
})
-----------------------------------------------
dfcaverns.icicle_ids = subterrane.register_stalagmite_nodes("dfcaverns:icicle", {
description = S("Icicle"),
_doc_items_longdesc = dfcaverns.doc.icicle_desc,
_doc_items_usagehelp = dfcaverns.doc.icicle_usage,
tiles = {
"default_ice.png",
},
groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3},
sounds = default.node_sound_glass_defaults(),
})

335
features/glow_crystals.lua Normal file
View File

@ -0,0 +1,335 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
--glowing mese crystal blocks
minetest.register_node("dfcaverns:glow_mese", {
description = S("Flawless Mese Block"),
_doc_items_longdesc = dfcaverns.doc.glow_mese_desc,
_doc_items_usagehelp = dfcaverns.doc.glow_mese_usage,
tiles = {"dfcaverns_glow_mese.png"},
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_glass_defaults(),
light_source = 13,
paramtype = "light",
use_texture_alpha = true,
drawtype = "glasslike",
sunlight_propagates = true,
})
minetest.register_craft({
output = 'default:mese_crystal 12',
recipe = {
{'dfcaverns:glow_mese'},
}
})
minetest.register_node("dfcaverns:glow_ruby_ore", {
description = S("Crystal Vein"),
_doc_items_longdesc = dfcaverns.doc.glow_ruby_ore_desc,
_doc_items_usagehelp = dfcaverns.doc.glow_ruby_ore_usage,
tiles = {"dfcaverns_glow_ruby_ore.png"},
is_ground_content = true,
groups = {cracky=2},
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("dfcaverns:big_crystal", {
description = S("Giant Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_big.obj",
tiles = {
"dfcaverns_glow_ruby4x.png",
"dfcaverns_glow_ruby.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5},
},
collision_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5},
},
})
minetest.register_node("dfcaverns:med_crystal", {
description = S("Big Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_med.obj",
tiles = {
"dfcaverns_glow_ruby.png",
"dfcaverns_glow_ruby_quarter.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25},
},
collision_box = {
type = "fixed",
fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25},
},
})
minetest.register_node("dfcaverns:big_crystal_30", {
description = S("Giant Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_30_big.obj",
tiles = {
"dfcaverns_glow_ruby4x.png",
"dfcaverns_glow_ruby.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
drop = "dfcaverns:big_crystal",
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.625, 0.5, 0.5, 0.375},
{-0.5, 0.5, -1.25, 0.5, 1.5, -0.25},
{-0.5, 1.5, -1.875, 0.5, 2.5, -0.875},
--The following is a more accurate set of collision boxes that theoretically
--allows the crystal to be climbed like stairs, but in practice the physics
--don't seem to work quite right so I'm leaving it "simple" for now.
-- {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375},
-- {-0.5, 0.0, -0.9375, 0.5, 0.5, 0.0625},
-- {-0.5, 0.5, -1.25, 0.5, 1.0, -0.25},
-- {-0.5, 1.0, -1.5625, 0.5, 1.5, -0.5625},
-- {-0.5, 1.5, -1.875, 0.5, 2.0, -0.875},
-- {-0.25, 2.0, -1.625, 0.25, 2.5, -1.125},
},
},
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.625, 0.5, 0.5, 0.375},
{-0.5, 0.5, -1.25, 0.5, 1.5, -0.25},
{-0.5, 1.5, -1.875, 0.5, 2.5, -0.875},
-- {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375},
-- {-0.5, 0.0, -0.9375, 0.5, 0.5, 0.0625},
-- {-0.5, 0.5, -1.25, 0.5, 1.0, -0.25},
-- {-0.5, 1.0, -1.5625, 0.5, 1.5, -0.5625},
-- {-0.5, 1.5, -1.875, 0.5, 2.0, -0.875},
-- {-0.25, 2.0, -1.625, 0.25, 2.5, -1.125},
},
},
})
minetest.register_node("dfcaverns:med_crystal_30", {
description = S("Big Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_30_med.obj",
tiles = {
"dfcaverns_glow_ruby.png",
"dfcaverns_glow_ruby_quarter.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
drop = "dfcaverns:med_crystal",
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.3125, 0.25, 0.0, 0.1875},
{-0.25, 0.0, -0.625, 0.25, 0.5, -0.125},
{-0.25, 0.5, -0.9375, 0.25, 1.0, -0.4375},
}
},
collision_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.3125, 0.25, 0.0, 0.1875},
{-0.25, 0.0, -0.625, 0.25, 0.5, -0.125},
{-0.25, 0.5, -0.9375, 0.25, 1.0, -0.4375},
},
},
})
minetest.register_node("dfcaverns:big_crystal_30_45", {
description = S("Giant Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_30_45_big.obj",
tiles = {
"dfcaverns_glow_ruby4x.png",
"dfcaverns_glow_ruby.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
drop = "dfcaverns:big_crystal",
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-0.375, -0.5, -0.625, 0.625, 0.5, 0.375},
{0.0625, 0.5, -1.0625, 1.0625, 1.5, -0.0625},
{0.5, 1.5, -1.5, 1.5, 2.5, -0.5},
},
},
collision_box = {
type = "fixed",
fixed = {
{-0.375, -0.5, -0.625, 0.625, 0.5, 0.375},
{0.0625, 0.5, -1.0625, 1.0625, 1.5, -0.0625},
{0.5, 1.5, -1.5, 1.5, 2.5, -0.5},
},
},
})
minetest.register_node("dfcaverns:med_crystal_30_45", {
description = S("Big Crystal"),
_doc_items_longdesc = dfcaverns.doc.big_crystal_desc,
_doc_items_usagehelp = dfcaverns.doc.big_crystal_usage,
drawtype = "mesh",
mesh = "hex_crystal_30_45_med.obj",
tiles = {
"dfcaverns_glow_ruby4x.png",
"dfcaverns_glow_ruby.png",
},
use_texture_alpha = true,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
light_source = 12,
drop = "dfcaverns:med_crystal",
groups = {cracky=2, dfcaverns_big_crystal = 1},
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-0.1875, -0.5, -0.3125, 0.3125, 0.0, 0.1875},
{0.03125, 0.0, -0.53125, 0.53125, 0.5, -0.03125},
{0.25, 0.5, -0.75, 0.75, 1.0, -0.25},
},
},
collision_box = {
type = "fixed",
fixed = {
{-0.1875, -0.5, -0.3125, 0.3125, 0.0, 0.1875},
{0.03125, 0.0, -0.53125, 0.53125, 0.5, -0.03125},
{0.25, 0.5, -0.75, 0.75, 1.0, -0.25},
},
},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:big_crystal_30',
recipe = {'dfcaverns:big_crystal'},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:big_crystal_30_45',
recipe = {'dfcaverns:big_crystal_30'},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:big_crystal',
recipe = {'dfcaverns:big_crystal_30_45'},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:med_crystal_30',
recipe = {'dfcaverns:med_crystal'},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:med_crystal_30_45',
recipe = {'dfcaverns:med_crystal_30'},
})
minetest.register_craft({
type = "shapeless",
output = 'dfcaverns:med_crystal',
recipe = {'dfcaverns:med_crystal_30_45'},
})
local c_stone = minetest.get_content_id("default:stone")
local c_air = minetest.get_content_id("air")
local c_big_crystal = minetest.get_content_id("dfcaverns:big_crystal")
local c_med_crystal = minetest.get_content_id("dfcaverns:med_crystal")
local c_big_crystal_30 = minetest.get_content_id("dfcaverns:big_crystal_30")
local c_med_crystal_30 = minetest.get_content_id("dfcaverns:med_crystal_30")
local c_big_crystal_30_45 = minetest.get_content_id("dfcaverns:big_crystal_30_45")
local c_med_crystal_30_45 = minetest.get_content_id("dfcaverns:med_crystal_30_45")
local c_glow_ore = minetest.get_content_id("dfcaverns:glow_ruby_ore")
local place_big_crystal = function(data, data_param2, i, ceiling)
local orientation = math.random()
if orientation < 0.33 then
if math.random() > 0.5 then
data[i] = c_big_crystal
else
data[i] = c_med_crystal
end
elseif orientation < 0.66 then
if math.random() > 0.5 then
data[i] = c_big_crystal_30
else
data[i] = c_med_crystal_30
end
else
if math.random() > 0.5 then
data[i] = c_big_crystal_30_45
else
data[i] = c_med_crystal_30_45
end
end
if ceiling then
data_param2[i] = math.random(20,23)
else
data_param2[i] = math.random(0,3)
end
end
dfcaverns.place_big_crystal_cluster = function(area, data, data_param2, i, radius, ceiling)
local y
if ceiling then y = -1 else y = 1 end
local pos = area:position(i)
for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do
local adjacent = li + y*area.ystride
if math.random() > 0.5 and data[li] == c_stone and data[adjacent] == c_air then
place_big_crystal(data, data_param2, adjacent, ceiling)
data[li] = c_glow_ore
end
end
end

View File

@ -6,7 +6,17 @@ minetest.register_node("dfcaverns:glow_worm", {
description = S("Glow Worms"),
_doc_items_longdesc = dfcaverns.doc.glow_worms_desc,
_doc_items_usagehelp = dfcaverns.doc.glow_worms_usage,
tiles = {"dfcaverns_glow_worm.png"},
tiles = {
{
name = "dfcaverns_glow_worm_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 4.0,
},
},
},
inventory_image = "dfcaverns_glow_worm.png",
wield_image = "dfcaverns_glow_worm.png",
is_ground_content = true,

View File

@ -16,6 +16,7 @@ minetest.register_node("dfcaverns:dirt_with_cave_moss", {
tileable_vertical = false}},
drop = "default:dirt",
is_ground_content = true,
light_source = 2,
groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 11},
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_grass_footstep", gain = 0.25},
@ -52,7 +53,21 @@ minetest.register_node("dfcaverns:cobble_with_floor_fungus", {
description = S("Cobblestone With Floor Fungus"),
_doc_items_longdesc = dfcaverns.doc.floor_fungus_desc,
_doc_items_usagehelp = dfcaverns.doc.floor_fungus_usage,
tiles = {"default_cobble.png^dfcaverns_floor_fungus.png", "default_cobble.png", "default_cobble.png^dfcaverns_floor_fungus_side.png"},
tiles = {"default_cobble.png^dfcaverns_floor_fungus.png"},
drops = "default:cobble",
is_ground_content = true,
groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 11},
_dfcaverns_dead_node = "default:cobble",
sounds = default.node_sound_stone_defaults({
footstep = {name = "dfcaverns_squish", gain = 0.25},
}),
})
minetest.register_node("dfcaverns:cobble_with_floor_fungus_fine", {
description = S("Cobblestone With Floor Fungus"),
_doc_items_longdesc = dfcaverns.doc.floor_fungus_desc,
_doc_items_usagehelp = dfcaverns.doc.floor_fungus_usage,
tiles = {"default_cobble.png^dfcaverns_floor_fungus_fine.png"},
drops = "default:cobble",
is_ground_content = true,
groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 11},
@ -67,6 +82,16 @@ minetest.register_abm{
nodenames = {"default:cobble"},
neighbors = {"dfcaverns:cobble_with_floor_fungus"},
interval = 60,
chance = 5,
catch_up = true,
action = function(pos)
minetest.swap_node(pos, {name="dfcaverns:cobble_with_floor_fungus_fine"})
end,
}
minetest.register_abm{
label = "dfcaverns:floor_fungus_thickening",
nodenames = {"default:cobble_with_floor_fungus_fine"},
interval = 59,
chance = 30,
catch_up = true,
action = function(pos)

74
features/snareweed.lua Normal file
View File

@ -0,0 +1,74 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
minetest.register_node("dfcaverns:snareweed", {
description = S("Snareweed"),
_doc_items_longdesc = dfcaverns.doc.snareweed_desc,
_doc_items_usagehelp = dfcaverns.doc.snareweed_usage,
tiles = {"default_dirt.png^dfcaverns_snareweed_roots.png", "default_dirt.png"},
drawtype="plantlike_rooted",
paramtype2 = "leveled",
special_tiles = {{name = "dfcaverns_snareweed.png", tileable_vertical = true}},
is_ground_content = true,
drop = 'default:dirt',
light_source = 6,
groups = {crumbly = 3, soil = 1},
sounds = default.node_sound_dirt_defaults(),
})
if dfcaverns.config.snareweed_damage then
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer >= 1 then
timer = timer - 1
for _, player in pairs(minetest.get_connected_players()) do
local player_pos = player:getpos() -- node player's feet are in this location.
local rounded_pos = vector.round(player_pos)
local nearby_nodes = minetest.find_nodes_in_area(vector.add(rounded_pos, {x=0, y= -8, z=0}), rounded_pos, {"dfcaverns:snareweed"})
for _, node_pos in ipairs(nearby_nodes) do
local node = minetest.get_node(node_pos)
local distance = player_pos.y - node_pos.y
if distance <= node.param2/16 then
minetest.log("action", player:get_player_name() .. " takes 2 damage from snareweed at " .. minetest.pos_to_string(node_pos))
player:set_hp(player:get_hp() - 2)
break
end
end
end
end
end)
end
local c_water = minetest.get_content_id("default:water_source")
local c_dirt = minetest.get_content_id("default:dirt")
local c_snareweed = minetest.get_content_id("dfcaverns:snareweed")
dfcaverns.place_snareweed = function(area, data, bi, param2_data)
local max_height = 0
local index = bi + area.ystride
while area:containsi(index) and data[index] == c_water and max_height <= 8*16 do
index = index + area.ystride
max_height = max_height + 16
end
if max_height > 0 then
data[bi] = c_snareweed
param2_data[bi] = math.min(math.random(3*16, 8*16), max_height)
else
data[bi] = c_dirt
end
end
dfcaverns.place_snareweed_patch = function(area, data, bi, param2_data, radius)
local pos = area:position(bi)
for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do
local adjacent = li + area.ystride
local node_type = data[li]
if math.random() < 0.1 and (node_type == c_stone or node_type == c_dirt) and data[adjacent] == c_water then
dfcaverns.place_snareweed(area, data, li, param2_data)
end
end
end

View File

@ -6,11 +6,16 @@ local modpath = minetest.get_modpath(minetest.get_current_modname())
--load companion lua files
dofile(modpath.."/config.lua")
dofile(modpath.."/doc.lua")
dofile(modpath.."/voxelarea_iterator.lua")
dofile(modpath.."/ground_cover.lua")
dofile(modpath.."/glow_worms.lua")
dofile(modpath.."/features/ground_cover.lua")
dofile(modpath.."/features/glow_worms.lua")
dofile(modpath.."/features/flowstone_nodes.lua")
dofile(modpath.."/features/glow_crystals.lua")
dofile(modpath.."/features/snareweed.lua")
dofile(modpath.."/features/cave_coral.lua")
-- Plants
-- Farmable Plants
dofile(modpath.."/plants.lua") -- general functions
dofile(modpath.."/plants/cave_wheat.lua")
dofile(modpath.."/plants/dimple_cup.lua")
@ -35,4 +40,5 @@ dofile(modpath.."/biomes.lua")
dofile(modpath.."/biomes/level1.lua")
dofile(modpath.."/biomes/level2.lua")
dofile(modpath.."/biomes/level3.lua")
dofile(modpath.."/biomes/sunless_sea.lua")
dofile(modpath.."/biomes/lava_sea.lua")

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dfcaverns module's Italian locale\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-04-19 19:58-0600\n"
"POT-Creation-Date: 2018-05-23 02:30-0600\n"
"PO-Revision-Date: 2017-08-17 23:01+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: ITALIANO\n"
@ -45,7 +45,8 @@ msgstr ""
#: doc.lua:19
msgid ""
"Cave moss has no known uses. It dies when exposed to bright light sources."
"Cave moss has no known uses aside from the faint glow it emits. It dies when "
"exposed to bright light sources such as the Sun."
msgstr ""
#: doc.lua:20
@ -78,106 +79,202 @@ msgid ""
"a modest amount of growth, allowing it to be divided and propagated."
msgstr ""
#: doc.lua:28
msgid "Whatever this fungus was in life, it is now dead."
#: doc.lua:26
msgid ""
"A nasty kelp-like plant that grows in patches on the floor of the Sunless "
"Sea. Its reflective patches draw in the unwary and then its prickly barbs "
"catch and hold small creatures."
msgstr ""
#: doc.lua:27
msgid "Snareweed has no practical use, its fibers disintegrate when they dry."
msgstr ""
#: doc.lua:29
msgid ""
"A rare form of coral found only deep underground in the Sunless Sea, cave "
"coral grows hanging from the ceilings of flooded caverns."
msgstr ""
#: doc.lua:30
msgid ""
"Aside from their aesthetic beauty, cave corals can be harvested for simple "
"building materials."
msgstr ""
#: doc.lua:32
msgid ""
"Flowstone is a carbonate-rich rock formation deposited by flowing water. It "
"consists of minerals that the water dissolved earlier as it widens cracks "
"and fissures into caves."
msgstr ""
#: doc.lua:33
msgid ""
"Aside from the aesthetic beauty of its formations flowstone has no special "
"properties or uses."
msgstr ""
#: doc.lua:34
msgid ""
"The iconic stalactites and stalagmites found in caverns are composed of "
"flowstone (or 'dripstone' in the case of these formations). Moist dripstone "
"is still undergoing growth, whereas dry dripstone is found in 'dead' caverns "
"once the source of water that created them ceases."
msgstr ""
#: doc.lua:35
msgid ""
"Although stalagmites are blunter than the stalactites above them, they can "
"cause extra damage to the unwary caver who falls on them."
msgstr ""
#: doc.lua:36
msgid ""
"Ice formed by water dripping slowly into a cold environment, icicles tend to "
"be exceptionally pure and clear."
msgstr ""
#: doc.lua:37
msgid "Falling onto an icicle is particularly damaging."
msgstr ""
#: doc.lua:40
msgid ""
"Deep in the infernal conditions of the magma sea, over the course of "
"millions of years, mese crystals grow into flawless blocks that glow bright "
"with strange energies."
msgstr ""
#: doc.lua:41
msgid ""
"These blocks can be broken down into a large number of mese crystals, but "
"cannot be artificially reassembled."
msgstr ""
#: doc.lua:43
msgid ""
"Large, dry caverns deep underground are well suited to aeons-long processes "
"that concentrate crystalline substances in their walls. This rock is riddled "
"with veins of the stuff."
msgstr ""
#: doc.lua:44
msgid "Aside from its aesthetic value this rock has no particular use."
msgstr ""
#: doc.lua:46
msgid ""
"Monolithic crystals of this size form only over extremely long periods deep "
"underground, in large long-lived cavities that allow them room to grow. "
"Water and the life it hosts tend to disrupt the formation process of these "
"crystals so they're only found in dry environments."
msgstr ""
#: doc.lua:47
msgid "Aside from its aesthetic value this crystal has no particular use."
msgstr ""
#: doc.lua:51
msgid "Whatever this fungus was in life, it is now dead."
msgstr ""
#: doc.lua:52
msgid ""
"Dead fungus quickly decays into an unrecognizable mess. It can be used as "
"weak fuel or terrible decor."
msgstr ""
#: doc.lua:31
#: doc.lua:54
msgid ""
"A species of lavender mushroom ubiquitous in caves that is most notable for "
"the soft bioluminescence it produces."
msgstr ""
#: doc.lua:32
#: doc.lua:55
msgid ""
"This mushroom is inedible but continues producing modest levels of light "
"long after it's picked."
msgstr ""
#: doc.lua:34
#: doc.lua:57
msgid ""
"Cave wheat is literally a breed of grain-producing grass that somehow lost "
"its ability to photosynthesize and adapted to a more fungal style of life."
msgstr ""
#: doc.lua:35
#: doc.lua:58
msgid ""
"Like its surface cousin, cave wheat produces grain that can be ground into a "
"form of flour."
msgstr ""
#: doc.lua:36
#: doc.lua:59
msgid "Cave wheat seed ground into a powder suitable for cooking."
msgstr ""
#: doc.lua:37
#: doc.lua:60
msgid ""
"When baked alone it forms an edible bread, but it combines well with other "
"more flavorful ingredients."
msgstr ""
#: doc.lua:38
#: doc.lua:61
msgid ""
"Bread baked from cave wheat flour is tough and durable. A useful ration for "
"long expeditions."
msgstr ""
#: doc.lua:39
#: doc.lua:62
msgid "It's not tasty, but it keeps you going."
msgstr ""
#: doc.lua:41
#: doc.lua:64
msgid ""
"The distinctive midnight-blue caps of these mushrooms are inverted, exposing "
"their gills to any breeze that might pass, and have dimpled edges that give "
"them their name."
msgstr ""
#: doc.lua:42
#: doc.lua:65
msgid ""
"Dimple cups can be dried, ground, and processed to extract a deep blue dye."
msgstr ""
#: doc.lua:44
#: doc.lua:67
msgid ""
"Pig tails are a fibrous fungal growth that's most notable for its twisting "
"stalks. In a mature stand of pig tails the helical stalks intertwine into a "
"dense mesh."
msgstr ""
#: doc.lua:45
#: doc.lua:68
msgid "Pig tail stalks can be processed to extract fibers useful as thread."
msgstr ""
#: doc.lua:46
#: doc.lua:69
msgid "Threads of pig tail fiber."
msgstr ""
#: doc.lua:47
#: doc.lua:70
msgid ""
"A crafting item that can be woven into textiles and other similar items."
msgstr ""
#: doc.lua:49
#: doc.lua:72
msgid ""
"Plump helmets are a thick, fleshy mushroom that's edible picked straight "
"from the ground. They form a staple diet for both lost cave explorers and "
"the fauna that preys on them."
msgstr ""
#: doc.lua:50
#: doc.lua:73
msgid ""
"While they can be eaten fresh, they can be monotonous fare and are perhaps "
"better appreciated as part of a more complex prepared dish."
msgstr ""
#: doc.lua:52
#: doc.lua:75
msgid ""
"A rare breed of fungus from deep underground that produces a bushy cluster "
"of rumpled gray 'blades'. The biological function of these blades is not "
@ -185,24 +282,24 @@ msgid ""
"the blade's base."
msgstr ""
#: doc.lua:53
#: doc.lua:76
msgid ""
"Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are "
"edible with processing."
msgstr ""
#: doc.lua:54
#: doc.lua:77
msgid ""
"The dried blades of a quarry bush add a welcome zing to recipes containing "
"otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten "
"on their own."
msgstr ""
#: doc.lua:55
#: doc.lua:78
msgid "Quarry bush leaves can be used as an ingredient in foodstuffs."
msgstr ""
#: doc.lua:57
#: doc.lua:80
msgid ""
"Sweet pods grow in rich soil, and once they reach maturity they draw that "
"supply of nutrients up to concentrate it in their fruiting bodies. They turn "
@ -210,52 +307,52 @@ msgid ""
"the sugars they contain."
msgstr ""
#: doc.lua:60
#: doc.lua:83
msgid "When milled, sweet pods produce a granular sugary substance."
msgstr ""
#: doc.lua:62
#: doc.lua:85
msgid "When dried in an oven, sweet pods produce a granular sugary substance."
msgstr ""
#: doc.lua:64
#: doc.lua:87
msgid "Crushing them in a bucket squeezes out a flavorful syrup."
msgstr ""
#: doc.lua:66
#: doc.lua:89
msgid "Sweet pod sugar has a pink tint to it."
msgstr ""
#: doc.lua:67
#: doc.lua:90
msgid ""
"Too sweet to be eaten directly, it makes an excellent ingredient in food "
"recipes."
msgstr ""
#: doc.lua:68
#: doc.lua:91
msgid "Sweet pod syrup is thick and flavorful."
msgstr ""
#: doc.lua:69
#: doc.lua:92
msgid ""
"Too strong and thick to drink straight, sweet pod syrup is useful in food "
"recipes."
msgstr ""
#: doc.lua:72
#: doc.lua:95
msgid ""
"The dense black wood of these mushrooms is heavy and hard to work with, and "
"has few remarkable properties."
msgstr ""
#: doc.lua:73
#: doc.lua:96
msgid ""
"Aside from the artistic applications of its particularly dark color, black "
"cap wood is a long-burning fuel source that's as good as coal for some "
"applications."
"applications. Black cap gills are oily and make for excellent torch fuel."
msgstr ""
#: doc.lua:75
#: doc.lua:98
msgid ""
"Blood thorns are the most vicious of underground flora, as befits their "
"harsh environments. Found only in hot, dry caverns with sandy soil far from "
@ -264,14 +361,14 @@ msgid ""
"fluids from whatever stray plant or creature they might impale."
msgstr ""
#: doc.lua:76
#: doc.lua:99
msgid ""
"When harvested, the central stalk of a blood thorn can be cut into planks "
"and used as wood. It has a purple-red hue that may or may not appeal, "
"depending on one's artistic tastes."
msgstr ""
#: doc.lua:77
#: doc.lua:100
msgid ""
"The spikes of a blood thorn can actually remain living long after they're "
"severed from their parent stalk, a testament to their tenacity. As long as "
@ -279,39 +376,39 @@ msgid ""
"puncture, though they don't grow."
msgstr ""
#: doc.lua:78
#: doc.lua:101
msgid ""
"Living blood thorn spikes remain harmful to creatures that touch them. If "
"killed by bright light, they cause only passive damage to creatures that "
"fall on them (as one would expect from an enormous spike)."
msgstr ""
#: doc.lua:80
#: doc.lua:103
msgid ""
"Thin, irregular layers of spore-producing 'shelves' surround the strong "
"central stalk of the mighty Fungiwood."
msgstr ""
#: doc.lua:81
#: doc.lua:104
msgid ""
"Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted "
"lumber when cut. Fungiwood shelf is too fragile to be much use as anything "
"other than fuel."
msgstr ""
#: doc.lua:83
#: doc.lua:106
msgid ""
"Massive but squat, mature goblin cap mushrooms are the size of small "
"cottages."
msgstr ""
#: doc.lua:84
#: doc.lua:107
msgid ""
"Goblin cap stem and cap material can be cut into wood of two different hues, "
"a subdued cream and a bright orange-red."
msgstr ""
#: doc.lua:86
#: doc.lua:109
msgid ""
"Nether caps have an unusual biochemistry that allows them to somehow subsist "
"on ambient heat, in violation of all known laws of thermodynamics. They grow "
@ -319,40 +416,40 @@ msgid ""
"volcanic."
msgstr ""
#: doc.lua:87
#: doc.lua:110
msgid ""
"Nether cap wood, in addition to being a beautiful blue hue, retains the odd "
"heat-draining ability of living nether caps and is able to quickly freeze "
"nearby water solid."
msgstr ""
#: doc.lua:89
#: doc.lua:112
msgid ""
"Spore trees have a sturdy 'trunk' that supports a large spongy mesh of "
"branching fibers, with embedded fruiting bodies that produce a copious "
"amount of spores that gently rain down around the spore tree's base."
msgstr ""
#: doc.lua:90
#: doc.lua:113
msgid ""
"Spore tree trunks can be cut into pale woody planks. The branching fibers "
"and fruiting bodies are only useful as fuel."
msgstr ""
#: doc.lua:92
#: doc.lua:115
msgid "The king of the fungi, tower cap mushrooms grow to immense proportions."
msgstr ""
#: doc.lua:93
#: doc.lua:116
msgid "Tower caps are an excellent source of wood."
msgstr ""
#: doc.lua:95
#: doc.lua:118
msgid ""
"Tunnel tubes are hollow, curved fungal growths that support a fruiting body."
msgstr ""
#: doc.lua:97
#: doc.lua:120
msgid ""
"The trunk of a tunnel tube can be cut and processed to produce plywood-like "
"material. The fruiting body accumulates high-energy compounds that, when "
@ -360,24 +457,12 @@ msgid ""
"tunnel tube spawn through the still cavern air."
msgstr ""
#: doc.lua:99
#: doc.lua:122
msgid ""
"The trunk of a tunnel tube can be cut and processed to produce plywood-like "
"material."
msgstr ""
#: glow_worms.lua:6
msgid "Glow Worms"
msgstr "Vermi luminosi"
#: ground_cover.lua:11
msgid "Dirt With Cave Moss"
msgstr "Terra con muschio di caverna"
#: ground_cover.lua:52
msgid "Cobblestone With Floor Fungus"
msgstr "Ciottoli con funghi del terreno"
#: plants.lua:10
msgid "Dead Fungus"
msgstr "Fungo morto"
@ -386,6 +471,69 @@ msgstr "Fungo morto"
msgid "Cavern Fungi"
msgstr "Funghi di caverna"
#: features\cave_coral.lua:6
#: features\cave_coral.lua:18
#: features\cave_coral.lua:30
#, fuzzy
msgid "Cave Coral"
msgstr "Grano di caverna"
#: features\flowstone_nodes.lua:19
msgid "Dry Dripstone"
msgstr ""
#: features\flowstone_nodes.lua:30
msgid "Dry Flowstone"
msgstr ""
#: features\flowstone_nodes.lua:43
msgid "Wet Dripstone"
msgstr ""
#: features\flowstone_nodes.lua:55
msgid "Wet Flowstone"
msgstr ""
#: features\flowstone_nodes.lua:68
msgid "Icicle"
msgstr ""
#: features\glow_crystals.lua:7
msgid "Flawless Mese Block"
msgstr ""
#: features\glow_crystals.lua:29
msgid "Crystal Vein"
msgstr ""
#: features\glow_crystals.lua:40
#: features\glow_crystals.lua:95
#: features\glow_crystals.lua:182
msgid "Giant Crystal"
msgstr ""
#: features\glow_crystals.lua:67
#: features\glow_crystals.lua:146
#: features\glow_crystals.lua:219
msgid "Big Crystal"
msgstr ""
#: features\glow_worms.lua:6
msgid "Glow Worms"
msgstr "Vermi luminosi"
#: features\ground_cover.lua:11
msgid "Dirt With Cave Moss"
msgstr "Terra con muschio di caverna"
#: features\ground_cover.lua:53
msgid "Cobblestone With Floor Fungus"
msgstr "Ciottoli con funghi del terreno"
#: features\snareweed.lua:6
msgid "Snareweed"
msgstr ""
#: plants\cave_wheat.lua:10
#: plants\cave_wheat.lua:69
msgid "Cave Wheat"
@ -525,11 +673,11 @@ msgstr "Cappello nero"
msgid "Black Cap Gills"
msgstr "Lamelle di cappello nero"
#: trees\black_cap.lua:77
#: trees\black_cap.lua:85
msgid "Black Cap Planks"
msgstr "Assi di cappello nero"
#: trees\black_cap.lua:116
#: trees\black_cap.lua:124
msgid "Black Cap Spawn"
msgstr "Prole di cappello nero"
@ -654,19 +802,22 @@ msgid "Tower Cap Spawn"
msgstr "Prole di cappello a torre"
#: trees\tunnel_tube.lua:16
#: trees\tunnel_tube.lua:39
#: trees\tunnel_tube.lua:69
#: trees\tunnel_tube.lua:98
msgid "Tunnel Tube"
msgstr "Tubo di galleria"
#: trees\tunnel_tube.lua:47
#: trees\tunnel_tube.lua:135
msgid "Tunnel Tube Plies"
msgstr "Strati di tubo di galleria"
#: trees\tunnel_tube.lua:79
#: trees\tunnel_tube.lua:135
#: trees\tunnel_tube.lua:157
#: trees\tunnel_tube.lua:170
#: trees\tunnel_tube.lua:226
#: trees\tunnel_tube.lua:246
msgid "Tunnel Tube Fruiting Body"
msgstr "Corpo fruttifero del tubo di galleria"
#: trees\tunnel_tube.lua:187
#: trees\tunnel_tube.lua:277
msgid "Tunnel Tube Spawn"
msgstr "Prole di tubo di galleria"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-04-19 19:58-0600\n"
"POT-Creation-Date: 2018-05-23 02:30-0600\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"
@ -44,7 +44,8 @@ msgstr ""
#: doc.lua:19
msgid ""
"Cave moss has no known uses. It dies when exposed to bright light sources."
"Cave moss has no known uses aside from the faint glow it emits. It dies when "
"exposed to bright light sources such as the Sun."
msgstr ""
#: doc.lua:20
@ -77,106 +78,202 @@ msgid ""
"a modest amount of growth, allowing it to be divided and propagated."
msgstr ""
#: doc.lua:28
msgid "Whatever this fungus was in life, it is now dead."
#: doc.lua:26
msgid ""
"A nasty kelp-like plant that grows in patches on the floor of the Sunless "
"Sea. Its reflective patches draw in the unwary and then its prickly barbs "
"catch and hold small creatures."
msgstr ""
#: doc.lua:27
msgid "Snareweed has no practical use, its fibers disintegrate when they dry."
msgstr ""
#: doc.lua:29
msgid ""
"A rare form of coral found only deep underground in the Sunless Sea, cave "
"coral grows hanging from the ceilings of flooded caverns."
msgstr ""
#: doc.lua:30
msgid ""
"Aside from their aesthetic beauty, cave corals can be harvested for simple "
"building materials."
msgstr ""
#: doc.lua:32
msgid ""
"Flowstone is a carbonate-rich rock formation deposited by flowing water. It "
"consists of minerals that the water dissolved earlier as it widens cracks "
"and fissures into caves."
msgstr ""
#: doc.lua:33
msgid ""
"Aside from the aesthetic beauty of its formations flowstone has no special "
"properties or uses."
msgstr ""
#: doc.lua:34
msgid ""
"The iconic stalactites and stalagmites found in caverns are composed of "
"flowstone (or 'dripstone' in the case of these formations). Moist dripstone "
"is still undergoing growth, whereas dry dripstone is found in 'dead' caverns "
"once the source of water that created them ceases."
msgstr ""
#: doc.lua:35
msgid ""
"Although stalagmites are blunter than the stalactites above them, they can "
"cause extra damage to the unwary caver who falls on them."
msgstr ""
#: doc.lua:36
msgid ""
"Ice formed by water dripping slowly into a cold environment, icicles tend to "
"be exceptionally pure and clear."
msgstr ""
#: doc.lua:37
msgid "Falling onto an icicle is particularly damaging."
msgstr ""
#: doc.lua:40
msgid ""
"Deep in the infernal conditions of the magma sea, over the course of "
"millions of years, mese crystals grow into flawless blocks that glow bright "
"with strange energies."
msgstr ""
#: doc.lua:41
msgid ""
"These blocks can be broken down into a large number of mese crystals, but "
"cannot be artificially reassembled."
msgstr ""
#: doc.lua:43
msgid ""
"Large, dry caverns deep underground are well suited to aeons-long processes "
"that concentrate crystalline substances in their walls. This rock is riddled "
"with veins of the stuff."
msgstr ""
#: doc.lua:44
msgid "Aside from its aesthetic value this rock has no particular use."
msgstr ""
#: doc.lua:46
msgid ""
"Monolithic crystals of this size form only over extremely long periods deep "
"underground, in large long-lived cavities that allow them room to grow. "
"Water and the life it hosts tend to disrupt the formation process of these "
"crystals so they're only found in dry environments."
msgstr ""
#: doc.lua:47
msgid "Aside from its aesthetic value this crystal has no particular use."
msgstr ""
#: doc.lua:51
msgid "Whatever this fungus was in life, it is now dead."
msgstr ""
#: doc.lua:52
msgid ""
"Dead fungus quickly decays into an unrecognizable mess. It can be used as "
"weak fuel or terrible decor."
msgstr ""
#: doc.lua:31
#: doc.lua:54
msgid ""
"A species of lavender mushroom ubiquitous in caves that is most notable for "
"the soft bioluminescence it produces."
msgstr ""
#: doc.lua:32
#: doc.lua:55
msgid ""
"This mushroom is inedible but continues producing modest levels of light "
"long after it's picked."
msgstr ""
#: doc.lua:34
#: doc.lua:57
msgid ""
"Cave wheat is literally a breed of grain-producing grass that somehow lost "
"its ability to photosynthesize and adapted to a more fungal style of life."
msgstr ""
#: doc.lua:35
#: doc.lua:58
msgid ""
"Like its surface cousin, cave wheat produces grain that can be ground into a "
"form of flour."
msgstr ""
#: doc.lua:36
#: doc.lua:59
msgid "Cave wheat seed ground into a powder suitable for cooking."
msgstr ""
#: doc.lua:37
#: doc.lua:60
msgid ""
"When baked alone it forms an edible bread, but it combines well with other "
"more flavorful ingredients."
msgstr ""
#: doc.lua:38
#: doc.lua:61
msgid ""
"Bread baked from cave wheat flour is tough and durable. A useful ration for "
"long expeditions."
msgstr ""
#: doc.lua:39
#: doc.lua:62
msgid "It's not tasty, but it keeps you going."
msgstr ""
#: doc.lua:41
#: doc.lua:64
msgid ""
"The distinctive midnight-blue caps of these mushrooms are inverted, exposing "
"their gills to any breeze that might pass, and have dimpled edges that give "
"them their name."
msgstr ""
#: doc.lua:42
#: doc.lua:65
msgid ""
"Dimple cups can be dried, ground, and processed to extract a deep blue dye."
msgstr ""
#: doc.lua:44
#: doc.lua:67
msgid ""
"Pig tails are a fibrous fungal growth that's most notable for its twisting "
"stalks. In a mature stand of pig tails the helical stalks intertwine into a "
"dense mesh."
msgstr ""
#: doc.lua:45
#: doc.lua:68
msgid "Pig tail stalks can be processed to extract fibers useful as thread."
msgstr ""
#: doc.lua:46
#: doc.lua:69
msgid "Threads of pig tail fiber."
msgstr ""
#: doc.lua:47
#: doc.lua:70
msgid ""
"A crafting item that can be woven into textiles and other similar items."
msgstr ""
#: doc.lua:49
#: doc.lua:72
msgid ""
"Plump helmets are a thick, fleshy mushroom that's edible picked straight "
"from the ground. They form a staple diet for both lost cave explorers and "
"the fauna that preys on them."
msgstr ""
#: doc.lua:50
#: doc.lua:73
msgid ""
"While they can be eaten fresh, they can be monotonous fare and are perhaps "
"better appreciated as part of a more complex prepared dish."
msgstr ""
#: doc.lua:52
#: doc.lua:75
msgid ""
"A rare breed of fungus from deep underground that produces a bushy cluster "
"of rumpled gray 'blades'. The biological function of these blades is not "
@ -184,24 +281,24 @@ msgid ""
"the blade's base."
msgstr ""
#: doc.lua:53
#: doc.lua:76
msgid ""
"Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are "
"edible with processing."
msgstr ""
#: doc.lua:54
#: doc.lua:77
msgid ""
"The dried blades of a quarry bush add a welcome zing to recipes containing "
"otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten "
"on their own."
msgstr ""
#: doc.lua:55
#: doc.lua:78
msgid "Quarry bush leaves can be used as an ingredient in foodstuffs."
msgstr ""
#: doc.lua:57
#: doc.lua:80
msgid ""
"Sweet pods grow in rich soil, and once they reach maturity they draw that "
"supply of nutrients up to concentrate it in their fruiting bodies. They turn "
@ -209,52 +306,52 @@ msgid ""
"the sugars they contain."
msgstr ""
#: doc.lua:60
#: doc.lua:83
msgid "When milled, sweet pods produce a granular sugary substance."
msgstr ""
#: doc.lua:62
#: doc.lua:85
msgid "When dried in an oven, sweet pods produce a granular sugary substance."
msgstr ""
#: doc.lua:64
#: doc.lua:87
msgid "Crushing them in a bucket squeezes out a flavorful syrup."
msgstr ""
#: doc.lua:66
#: doc.lua:89
msgid "Sweet pod sugar has a pink tint to it."
msgstr ""
#: doc.lua:67
#: doc.lua:90
msgid ""
"Too sweet to be eaten directly, it makes an excellent ingredient in food "
"recipes."
msgstr ""
#: doc.lua:68
#: doc.lua:91
msgid "Sweet pod syrup is thick and flavorful."
msgstr ""
#: doc.lua:69
#: doc.lua:92
msgid ""
"Too strong and thick to drink straight, sweet pod syrup is useful in food "
"recipes."
msgstr ""
#: doc.lua:72
#: doc.lua:95
msgid ""
"The dense black wood of these mushrooms is heavy and hard to work with, and "
"has few remarkable properties."
msgstr ""
#: doc.lua:73
#: doc.lua:96
msgid ""
"Aside from the artistic applications of its particularly dark color, black "
"cap wood is a long-burning fuel source that's as good as coal for some "
"applications."
"applications. Black cap gills are oily and make for excellent torch fuel."
msgstr ""
#: doc.lua:75
#: doc.lua:98
msgid ""
"Blood thorns are the most vicious of underground flora, as befits their "
"harsh environments. Found only in hot, dry caverns with sandy soil far from "
@ -263,14 +360,14 @@ msgid ""
"fluids from whatever stray plant or creature they might impale."
msgstr ""
#: doc.lua:76
#: doc.lua:99
msgid ""
"When harvested, the central stalk of a blood thorn can be cut into planks "
"and used as wood. It has a purple-red hue that may or may not appeal, "
"depending on one's artistic tastes."
msgstr ""
#: doc.lua:77
#: doc.lua:100
msgid ""
"The spikes of a blood thorn can actually remain living long after they're "
"severed from their parent stalk, a testament to their tenacity. As long as "
@ -278,39 +375,39 @@ msgid ""
"puncture, though they don't grow."
msgstr ""
#: doc.lua:78
#: doc.lua:101
msgid ""
"Living blood thorn spikes remain harmful to creatures that touch them. If "
"killed by bright light, they cause only passive damage to creatures that "
"fall on them (as one would expect from an enormous spike)."
msgstr ""
#: doc.lua:80
#: doc.lua:103
msgid ""
"Thin, irregular layers of spore-producing 'shelves' surround the strong "
"central stalk of the mighty Fungiwood."
msgstr ""
#: doc.lua:81
#: doc.lua:104
msgid ""
"Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted "
"lumber when cut. Fungiwood shelf is too fragile to be much use as anything "
"other than fuel."
msgstr ""
#: doc.lua:83
#: doc.lua:106
msgid ""
"Massive but squat, mature goblin cap mushrooms are the size of small "
"cottages."
msgstr ""
#: doc.lua:84
#: doc.lua:107
msgid ""
"Goblin cap stem and cap material can be cut into wood of two different hues, "
"a subdued cream and a bright orange-red."
msgstr ""
#: doc.lua:86
#: doc.lua:109
msgid ""
"Nether caps have an unusual biochemistry that allows them to somehow subsist "
"on ambient heat, in violation of all known laws of thermodynamics. They grow "
@ -318,40 +415,40 @@ msgid ""
"volcanic."
msgstr ""
#: doc.lua:87
#: doc.lua:110
msgid ""
"Nether cap wood, in addition to being a beautiful blue hue, retains the odd "
"heat-draining ability of living nether caps and is able to quickly freeze "
"nearby water solid."
msgstr ""
#: doc.lua:89
#: doc.lua:112
msgid ""
"Spore trees have a sturdy 'trunk' that supports a large spongy mesh of "
"branching fibers, with embedded fruiting bodies that produce a copious "
"amount of spores that gently rain down around the spore tree's base."
msgstr ""
#: doc.lua:90
#: doc.lua:113
msgid ""
"Spore tree trunks can be cut into pale woody planks. The branching fibers "
"and fruiting bodies are only useful as fuel."
msgstr ""
#: doc.lua:92
#: doc.lua:115
msgid "The king of the fungi, tower cap mushrooms grow to immense proportions."
msgstr ""
#: doc.lua:93
#: doc.lua:116
msgid "Tower caps are an excellent source of wood."
msgstr ""
#: doc.lua:95
#: doc.lua:118
msgid ""
"Tunnel tubes are hollow, curved fungal growths that support a fruiting body."
msgstr ""
#: doc.lua:97
#: doc.lua:120
msgid ""
"The trunk of a tunnel tube can be cut and processed to produce plywood-like "
"material. The fruiting body accumulates high-energy compounds that, when "
@ -359,24 +456,12 @@ msgid ""
"tunnel tube spawn through the still cavern air."
msgstr ""
#: doc.lua:99
#: doc.lua:122
msgid ""
"The trunk of a tunnel tube can be cut and processed to produce plywood-like "
"material."
msgstr ""
#: glow_worms.lua:6
msgid "Glow Worms"
msgstr ""
#: ground_cover.lua:11
msgid "Dirt With Cave Moss"
msgstr ""
#: ground_cover.lua:52
msgid "Cobblestone With Floor Fungus"
msgstr ""
#: plants.lua:10
msgid "Dead Fungus"
msgstr ""
@ -385,6 +470,68 @@ msgstr ""
msgid "Cavern Fungi"
msgstr ""
#: features\cave_coral.lua:6
#: features\cave_coral.lua:18
#: features\cave_coral.lua:30
msgid "Cave Coral"
msgstr ""
#: features\flowstone_nodes.lua:19
msgid "Dry Dripstone"
msgstr ""
#: features\flowstone_nodes.lua:30
msgid "Dry Flowstone"
msgstr ""
#: features\flowstone_nodes.lua:43
msgid "Wet Dripstone"
msgstr ""
#: features\flowstone_nodes.lua:55
msgid "Wet Flowstone"
msgstr ""
#: features\flowstone_nodes.lua:68
msgid "Icicle"
msgstr ""
#: features\glow_crystals.lua:7
msgid "Flawless Mese Block"
msgstr ""
#: features\glow_crystals.lua:29
msgid "Crystal Vein"
msgstr ""
#: features\glow_crystals.lua:40
#: features\glow_crystals.lua:95
#: features\glow_crystals.lua:182
msgid "Giant Crystal"
msgstr ""
#: features\glow_crystals.lua:67
#: features\glow_crystals.lua:146
#: features\glow_crystals.lua:219
msgid "Big Crystal"
msgstr ""
#: features\glow_worms.lua:6
msgid "Glow Worms"
msgstr ""
#: features\ground_cover.lua:11
msgid "Dirt With Cave Moss"
msgstr ""
#: features\ground_cover.lua:53
msgid "Cobblestone With Floor Fungus"
msgstr ""
#: features\snareweed.lua:6
msgid "Snareweed"
msgstr ""
#: plants\cave_wheat.lua:10
#: plants\cave_wheat.lua:69
msgid "Cave Wheat"
@ -524,11 +671,11 @@ msgstr ""
msgid "Black Cap Gills"
msgstr ""
#: trees\black_cap.lua:77
#: trees\black_cap.lua:85
msgid "Black Cap Planks"
msgstr ""
#: trees\black_cap.lua:116
#: trees\black_cap.lua:124
msgid "Black Cap Spawn"
msgstr ""
@ -653,19 +800,22 @@ msgid "Tower Cap Spawn"
msgstr ""
#: trees\tunnel_tube.lua:16
#: trees\tunnel_tube.lua:39
#: trees\tunnel_tube.lua:69
#: trees\tunnel_tube.lua:98
msgid "Tunnel Tube"
msgstr ""
#: trees\tunnel_tube.lua:47
#: trees\tunnel_tube.lua:135
msgid "Tunnel Tube Plies"
msgstr ""
#: trees\tunnel_tube.lua:79
#: trees\tunnel_tube.lua:135
#: trees\tunnel_tube.lua:157
#: trees\tunnel_tube.lua:170
#: trees\tunnel_tube.lua:226
#: trees\tunnel_tube.lua:246
msgid "Tunnel Tube Fruiting Body"
msgstr ""
#: trees\tunnel_tube.lua:187
#: trees\tunnel_tube.lua:277
msgid "Tunnel Tube Spawn"
msgstr ""

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal 30.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend'
# www.blender.org
mtllib hex_crystal_30_45.mtl
o Cylinder
v 0.135341 -0.831516 0.135341
v -1.192872 2.421927 -1.192872
v -0.353661 -0.499737 0.353446
v -1.410977 2.090148 -0.703870
v -0.442049 -0.716243 -0.088496
v -1.499365 1.873641 -1.145812
v -0.088496 -0.716243 -0.442049
v -1.145812 1.873641 -1.499365
v 0.353446 -0.499737 -0.353661
v -0.703870 2.090148 -1.410977
v 0.441834 -0.283230 0.088281
v -0.615482 2.306654 -0.969035
v 0.088281 -0.283230 0.441834
v -0.969035 2.306654 -0.615482
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn -0.9186 -0.2500 0.3062
vn -0.6124 -0.5000 -0.6124
vn 0.3062 -0.2500 -0.9186
vn 0.9186 0.2500 -0.3062
vn 0.6124 0.5000 0.6124
vn -0.3062 0.2500 0.9186
vn -0.3536 0.8660 -0.3536
vn 0.3990 0.4733 -0.7854
vn 0.7854 -0.4733 -0.3990
vn -0.3439 -0.8143 0.4677
vn -0.8735 0.4830 -0.0619
vn -0.1410 -0.9799 -0.1410
vn -0.6706 0.3173 -0.6706
vn 0.4677 -0.8143 -0.3439
vn -0.0619 0.4830 -0.8735
vn 0.8735 -0.4830 0.0619
vn 0.3439 0.8143 -0.4677
vn 0.6706 -0.3173 0.6706
vn 0.1410 0.9799 0.1410
vn 0.0619 -0.4830 0.8735
vn -0.4677 0.8143 0.3439
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal 30 45.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30 45.blend'
# www.blender.org
mtllib hex_crystal_30_45_med.mtl
o Cylinder
v 0.067670 -0.665758 0.067670
v -0.596436 0.960964 -0.596436
v -0.176830 -0.499868 0.176723
v -0.705489 0.795074 -0.351935
v -0.221025 -0.608121 -0.044248
v -0.749683 0.686821 -0.572906
v -0.044248 -0.608121 -0.221025
v -0.572906 0.686821 -0.749683
v 0.176723 -0.499868 -0.176830
v -0.351935 0.795074 -0.705489
v 0.220917 -0.391615 0.044140
v -0.307741 0.903327 -0.484518
v 0.044140 -0.391615 0.220917
v -0.484518 0.903327 -0.307741
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn -0.9186 -0.2500 0.3062
vn -0.6124 -0.5000 -0.6124
vn 0.3062 -0.2500 -0.9186
vn 0.9186 0.2500 -0.3062
vn 0.6124 0.5000 0.6124
vn -0.3062 0.2500 0.9186
vn -0.3536 0.8660 -0.3536
vn 0.3990 0.4733 -0.7854
vn 0.7854 -0.4733 -0.3990
vn -0.3439 -0.8143 0.4677
vn -0.8735 0.4830 -0.0619
vn -0.1410 -0.9799 -0.1410
vn -0.6706 0.3173 -0.6706
vn 0.4677 -0.8143 -0.3439
vn -0.0619 0.4830 -0.8735
vn 0.8735 -0.4830 0.0619
vn 0.3439 0.8143 -0.4677
vn 0.6706 -0.3173 0.6706
vn 0.1410 0.9799 0.1410
vn 0.0619 -0.4830 0.8735
vn -0.4677 0.8143 0.3439
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal 30.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend'
# www.blender.org
mtllib hex_crystal_30.mtl
o Cylinder
v -0.000000 -0.831516 0.191401
v 0.000000 2.421927 -1.686976
v -0.500000 -0.499737 -0.000152
v -0.500000 2.090148 -1.495423
v -0.250000 -0.716243 -0.375152
v -0.250000 1.873641 -1.870423
v 0.250000 -0.716243 -0.375152
v 0.250000 1.873641 -1.870423
v 0.500000 -0.499737 -0.000152
v 0.500000 2.090148 -1.495423
v 0.250000 -0.283230 0.374848
v 0.250000 2.306654 -1.120423
v -0.250000 -0.283230 0.374848
v -0.250000 2.306654 -1.120423
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn -0.8660 -0.2500 -0.4330
vn 0.0000 -0.5000 -0.8660
vn 0.8660 -0.2500 -0.4330
vn 0.8660 0.2500 0.4330
vn 0.0000 0.5000 0.8660
vn -0.8660 0.2500 0.4330
vn 0.0000 0.8660 -0.5000
vn 0.8375 0.4733 -0.2732
vn 0.8375 -0.4733 0.2732
vn -0.5739 -0.8143 0.0875
vn -0.5739 0.4830 -0.6614
vn 0.0000 -0.9799 -0.1994
vn -0.0000 0.3173 -0.9483
vn 0.5739 -0.8143 0.0875
vn 0.5739 0.4830 -0.6614
vn 0.5739 -0.4830 0.6614
vn 0.5739 0.8143 -0.0875
vn 0.0000 -0.3173 0.9483
vn 0.0000 0.9799 0.1994
vn -0.5739 -0.4830 0.6614
vn -0.5739 0.8143 -0.0875
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal 30.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend'
# www.blender.org
mtllib hex_crystal_30_med.mtl
o Cylinder
v -0.000000 -0.665758 0.095701
v 0.000000 0.960964 -0.843488
v -0.250000 -0.499868 -0.000076
v -0.250000 0.795074 -0.747711
v -0.125000 -0.608121 -0.187576
v -0.125000 0.686821 -0.935211
v 0.125000 -0.608121 -0.187576
v 0.125000 0.686821 -0.935212
v 0.250000 -0.499868 -0.000076
v 0.250000 0.795074 -0.747711
v 0.125000 -0.391615 0.187424
v 0.125000 0.903327 -0.560211
v -0.125000 -0.391615 0.187424
v -0.125000 0.903327 -0.560211
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn -0.8660 -0.2500 -0.4330
vn 0.0000 -0.5000 -0.8660
vn 0.8660 -0.2500 -0.4330
vn 0.8660 0.2500 0.4330
vn 0.0000 0.5000 0.8660
vn -0.8660 0.2500 0.4330
vn 0.0000 0.8660 -0.5000
vn 0.8375 0.4733 -0.2732
vn 0.8375 -0.4733 0.2732
vn -0.5739 -0.8143 0.0875
vn -0.5739 0.4830 -0.6614
vn 0.0000 -0.9799 -0.1994
vn -0.0000 0.3173 -0.9483
vn 0.5739 -0.8143 0.0875
vn 0.5739 0.4830 -0.6614
vn 0.5739 -0.4830 0.6614
vn 0.5739 0.8143 -0.0875
vn 0.0000 -0.3173 0.9483
vn 0.0000 0.9799 0.1994
vn -0.5739 -0.4830 0.6614
vn -0.5739 0.8143 -0.0875
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

114
models/hex_crystal_big.obj Normal file
View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal.blend'
# www.blender.org
mtllib hex_crystal.mtl
o Cylinder
v 0.000000 -0.882802 0.000000
v 0.000000 2.873951 0.000000
v 0.000000 -0.499696 -0.500000
v 0.000000 2.490845 -0.500000
v 0.433013 -0.499696 -0.250000
v 0.433013 2.490845 -0.250000
v 0.433013 -0.499696 0.250000
v 0.433013 2.490845 0.250000
v -0.000000 -0.499696 0.500000
v -0.000000 2.490845 0.500000
v -0.433013 -0.499696 0.250000
v -0.433013 2.490845 0.250000
v -0.433013 -0.499696 -0.250000
v -0.433013 2.490845 -0.250000
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn 0.5000 0.0000 -0.8660
vn 1.0000 0.0000 0.0000
vn 0.5000 0.0000 0.8660
vn -0.5000 0.0000 0.8660
vn -1.0000 0.0000 0.0000
vn -0.5000 0.0000 -0.8660
vn 0.0000 1.0000 0.0000
vn -0.0000 0.5465 0.8375
vn 0.0000 -0.5465 0.8375
vn 0.3313 -0.7489 -0.5739
vn 0.3313 0.7489 -0.5739
vn 0.6626 -0.7489 0.0000
vn 0.6626 0.7489 0.0000
vn 0.3313 -0.7489 0.5739
vn 0.3313 0.7489 0.5739
vn -0.3313 -0.7489 0.5739
vn -0.3313 0.7489 0.5739
vn -0.6626 -0.7489 0.0000
vn -0.6626 0.7489 0.0000
vn -0.3313 -0.7489 -0.5739
vn -0.3313 0.7489 -0.5739
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,22 @@
# Blender MTL File: 'hex crystal.blend'
# Material Count: 2
newmtl End_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Side_Mat
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.371605 0.494084
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

114
models/hex_crystal_med.obj Normal file
View File

@ -0,0 +1,114 @@
# Blender v2.77 (sub 0) OBJ File: 'hex crystal.blend'
# www.blender.org
mtllib hex_crystal_med.mtl
o Cylinder
v 0.000000 -0.691401 0.000000
v 0.000000 1.186976 0.000000
v 0.000000 -0.499848 -0.250000
v 0.000000 0.995423 -0.250000
v 0.216506 -0.499848 -0.125000
v 0.216506 0.995423 -0.125000
v 0.216506 -0.499848 0.125000
v 0.216506 0.995423 0.125000
v -0.000000 -0.499848 0.250000
v -0.000000 0.995423 0.250000
v -0.216506 -0.499848 0.125000
v -0.216506 0.995423 0.125000
v -0.216506 -0.499848 -0.125000
v -0.216506 0.995423 -0.125000
vt 0.4999 0.0000
vt 0.4999 1.0000
vt 0.3332 1.0000
vt 0.3332 0.0000
vt 0.1665 1.0000
vt 0.1665 0.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 -0.0000
vt 1.0000 1.0000
vt 0.8333 1.0000
vt 0.8333 -0.0000
vt 0.6666 1.0000
vt 0.6666 -0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.0000 0.0000
vt 0.5000 0.5000
vt 0.9313 0.7490
vt 0.5000 0.9980
vt 0.5000 0.5000
vt 0.5000 0.0020
vt 0.9313 0.2510
vt 0.0687 0.7490
vt 0.0687 0.2510
vt 0.0687 0.2510
vt 0.0687 0.7490
vt 0.5000 0.0020
vt 0.5000 0.9980
vt 0.9313 0.2510
vt 0.9313 0.7490
vn 0.5000 0.0000 -0.8660
vn 1.0000 0.0000 0.0000
vn 0.5000 0.0000 0.8660
vn -0.5000 0.0000 0.8660
vn -1.0000 0.0000 0.0000
vn -0.5000 0.0000 -0.8660
vn 0.0000 1.0000 0.0000
vn -0.0000 0.5465 0.8375
vn 0.0000 -0.5465 0.8375
vn 0.3313 -0.7489 -0.5739
vn 0.3313 0.7489 -0.5739
vn 0.6626 -0.7489 0.0000
vn 0.6626 0.7489 0.0000
vn 0.3313 -0.7489 0.5739
vn 0.3313 0.7489 0.5739
vn -0.3313 -0.7489 0.5739
vn -0.3313 0.7489 0.5739
vn -0.6626 -0.7489 0.0000
vn -0.6626 0.7489 0.0000
vn -0.3313 -0.7489 -0.5739
vn -0.3313 0.7489 -0.5739
g Cylinder_Cylinder_Side_Mat
usemtl Side_Mat
s off
f 3/1/1 4/2/1 6/3/1 5/4/1
f 5/4/2 6/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 10/7/3 9/8/3
f 9/9/4 10/10/4 12/11/4 11/12/4
f 11/12/5 12/11/5 14/13/5 13/14/5
f 13/14/6 14/13/6 4/2/6 3/1/6
f 10/15/7 8/16/7 12/17/7
f 12/17/8 8/16/8 2/18/8
f 2/18/1 8/16/1 14/19/1
f 14/19/7 8/16/7 6/20/7
f 14/19/9 6/20/9 2/18/9
f 11/21/9 1/22/9 7/23/9
f 7/23/1 1/22/1 13/24/1
f 13/24/8 1/22/8 5/25/8
f 9/8/7 7/23/7 11/21/7
f 11/21/7 7/23/7 13/24/7
f 13/24/7 7/23/7 5/25/7
f 13/24/7 5/25/7 3/26/7
g Cylinder_Cylinder_End_Mat
usemtl End_Mat
f 1/27/10 3/28/10 5/29/10
f 2/30/11 6/31/11 4/32/11
f 1/27/12 5/29/12 7/33/12
f 2/30/13 8/34/13 6/31/13
f 1/27/14 7/33/14 9/35/14
f 2/30/15 10/36/15 8/34/15
f 1/27/16 9/35/16 11/37/16
f 2/30/17 12/38/17 10/36/17
f 1/27/18 11/37/18 13/39/18
f 2/30/19 14/40/19 12/38/19
f 1/27/20 13/39/20 3/28/20
f 2/30/21 4/32/21 14/40/21

View File

@ -0,0 +1,62 @@
# Blender MTL File: 'tunnel tube base.blend'
# Material Count: 6
newmtl Back
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Bottom
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Front
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Left
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Right
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Top
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,94 @@
# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend'
# www.blender.org
mtllib tunnel_tube_slant.mtl
o tunnel_tube_slant_Cube.002
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.250000 -0.500000 0.250000
v 0.250000 -0.500000 0.250000
v 0.250000 -0.500000 -0.250000
v -0.250000 -0.500000 -0.250000
v -0.500000 -0.500000 -0.500000
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
v -0.250000 0.500000 -0.250000
v -0.250000 0.500000 -0.750000
v 0.250000 0.500000 -0.750000
v 0.250000 0.500000 -0.250000
vt 1.0000 1.0000
vt 0.0000 1.0000
vt 0.2500 0.7500
vt 0.7500 0.7500
vt 0.7500 0.2500
vt 1.0000 -0.0000
vt -0.0000 0.0000
vt 0.2500 0.2500
vt 1.0000 1.0000
vt 1.0000 0.0000
vt 0.7500 0.2500
vt 0.7500 0.7500
vt 0.2500 0.7500
vt 0.0000 1.0000
vt 0.2500 0.2500
vt -0.0000 0.0000
vt 1.0000 0.0000
vt 1.5000 1.0000
vt 0.5000 1.0000
vt 0.0000 0.0000
vt 1.2500 1.0000
vt 0.7500 1.0000
vt 0.2500 0.0000
vt 0.7500 0.0000
vt 0.5000 1.0000
vt 1.5000 1.0000
vt 1.0000 0.0000
vt 0.7500 1.0000
vt 1.2500 1.0000
vt 0.7500 0.0000
vt 0.2500 0.0000
vt 1.0000 1.0000
vt -0.0000 1.0000
vt 0.7500 1.0000
vt 0.2500 1.0000
vt 0.2500 0.0000
vt 0.0000 0.0000
vt 0.2500 1.0000
vt 0.7500 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 0.4472 0.8944
vn 0.0000 -0.4472 -0.8944
g tunnel_tube_slant_Cube.002_Top
usemtl Top
s off
f 9/1/1 10/2/1 14/3/1 15/4/1
f 9/1/1 15/4/1 16/5/1 11/6/1
f 14/3/1 10/2/1 12/7/1 13/8/1
f 11/6/1 16/5/1 13/8/1 12/7/1
g tunnel_tube_slant_Cube.002_Bottom
usemtl Bottom
f 1/9/2 2/10/2 5/11/2 6/12/2
f 1/9/2 6/12/2 7/13/2 8/14/2
f 8/14/2 7/13/2 4/15/2 3/16/2
f 5/11/2 2/10/2 3/16/2 4/15/2
g tunnel_tube_slant_Cube.002_Right
usemtl Right
f 1/17/3 9/18/3 11/19/3 2/20/3
f 14/21/3 13/22/3 4/23/3 7/24/3
g tunnel_tube_slant_Cube.002_Left
usemtl Left
f 3/16/4 12/25/4 10/26/4 8/27/4
f 16/28/4 15/29/4 6/30/4 5/31/4
g tunnel_tube_slant_Cube.002_Front
usemtl Front
f 2/10/5 11/32/5 12/33/5 3/16/5
f 15/34/5 14/35/5 7/36/5 6/30/5
g tunnel_tube_slant_Cube.002_Back
usemtl Back
f 9/1/6 1/17/6 8/37/6 10/2/6
f 13/38/6 16/28/6 5/39/6 4/23/6

View File

@ -0,0 +1,62 @@
# Blender MTL File: 'tunnel tube base.blend'
# Material Count: 6
newmtl Back
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Bottom
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Front
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Left
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Right
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Top
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,94 @@
# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend'
# www.blender.org
mtllib tunnel_tube_slant_2.mtl
o tunnel_tube_slant_Cube.002
v 0.500000 -0.500000 0.000000
v 0.500000 -0.500000 1.000000
v -0.500000 -0.500000 1.000000
v -0.250000 -0.500000 0.750000
v 0.250000 -0.500000 0.750000
v 0.250000 -0.500000 0.250000
v -0.250000 -0.500000 0.250000
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 0.500000
v -0.500000 0.500000 0.500000
v -0.250000 0.500000 0.250000
v -0.250000 0.500000 -0.250000
v 0.250000 0.500000 -0.250000
v 0.250000 0.500000 0.250000
vt 1.0000 1.0000
vt 0.0000 1.0000
vt 0.2500 0.7500
vt 0.7500 0.7500
vt 0.7500 0.2500
vt 1.0000 -0.0000
vt -0.0000 0.0000
vt 0.2500 0.2500
vt 1.0000 1.0000
vt 1.0000 0.0000
vt 0.7500 0.2500
vt 0.7500 0.7500
vt 0.2500 0.7500
vt 0.0000 1.0000
vt 0.2500 0.2500
vt -0.0000 0.0000
vt 0.5000 0.0000
vt -0.0000 1.0000
vt -0.5000 0.0000
vt 0.7500 1.0000
vt 0.2500 1.0000
vt -0.2500 0.0000
vt 0.2500 0.0000
vt -0.5000 0.0000
vt 0.0000 1.0000
vt 1.0000 1.0000
vt 0.5000 0.0000
vt 0.2500 1.0000
vt 0.7500 1.0000
vt 0.2500 0.0000
vt -0.2500 0.0000
vt 1.0000 1.0000
vt 0.2500 1.0000
vt 0.7500 0.0000
vt 1.0000 0.0000
vt 0.0000 0.0000
vt 0.7500 1.0000
vt 0.7500 0.0000
vt 0.2500 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 0.4472 0.8944
vn 0.0000 -0.4472 -0.8944
g tunnel_tube_slant_Cube.002_Top
usemtl Top
s off
f 9/1/1 10/2/1 14/3/1 15/4/1
f 9/1/1 15/4/1 16/5/1 11/6/1
f 14/3/1 10/2/1 12/7/1 13/8/1
f 11/6/1 16/5/1 13/8/1 12/7/1
g tunnel_tube_slant_Cube.002_Bottom
usemtl Bottom
f 1/9/2 2/10/2 5/11/2 6/12/2
f 1/9/2 6/12/2 7/13/2 8/14/2
f 8/14/2 7/13/2 4/15/2 3/16/2
f 5/11/2 2/10/2 3/16/2 4/15/2
g tunnel_tube_slant_Cube.002_Right
usemtl Right
f 1/17/3 9/1/3 11/18/3 2/19/3
f 14/20/3 13/21/3 4/22/3 7/23/3
g tunnel_tube_slant_Cube.002_Left
usemtl Left
f 3/24/4 12/25/4 10/26/4 8/27/4
f 16/28/4 15/29/4 6/30/4 5/31/4
g tunnel_tube_slant_Cube.002_Front
usemtl Front
f 2/10/5 11/32/5 12/25/5 3/16/5
f 15/29/5 14/33/5 7/23/5 6/34/5
g tunnel_tube_slant_Cube.002_Back
usemtl Back
f 9/1/6 1/35/6 8/36/6 10/2/6
f 13/21/6 16/37/6 5/38/6 4/39/6

View File

@ -0,0 +1,62 @@
# Blender MTL File: 'tunnel tube base.blend'
# Material Count: 6
newmtl Back
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Bottom
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Front
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Left
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Right
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
newmtl Top
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2

View File

@ -0,0 +1,94 @@
# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend'
# www.blender.org
mtllib tunnel_tube_slant_full.mtl
o tunnel_tube_slant_Cube.002
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.250000 -0.500000 0.250000
v 0.250000 -0.500000 0.250000
v 0.250000 -0.500000 -0.250000
v -0.250000 -0.500000 -0.250000
v -0.500000 -0.500000 -0.500000
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
v -0.250000 0.500000 -0.750000
v -0.250000 0.500000 -1.250000
v 0.250000 0.500000 -1.250000
v 0.250000 0.500000 -0.750000
vt 1.0000 1.0000
vt 0.0000 1.0000
vt 0.2500 0.7500
vt 0.7500 0.7500
vt 0.7500 0.2500
vt 1.0000 -0.0000
vt -0.0000 0.0000
vt 0.2500 0.2500
vt 1.0000 1.0000
vt 1.0000 0.0000
vt 0.7500 0.2500
vt 0.7500 0.7500
vt 0.2500 0.7500
vt 0.0000 1.0000
vt 0.2500 0.2500
vt -0.0000 0.0000
vt 1.0000 0.0000
vt 2.0000 1.0000
vt 1.0000 1.0000
vt 0.0000 0.0000
vt 1.7500 1.0000
vt 1.2500 1.0000
vt 0.2500 0.0000
vt 0.7500 0.0000
vt 1.0000 1.0000
vt 2.0000 1.0000
vt 1.0000 0.0000
vt 1.2500 1.0000
vt 1.7500 1.0000
vt 0.7500 0.0000
vt 0.2500 0.0000
vt -0.0000 1.0000
vt 0.7500 1.2500
vt 0.2500 1.2500
vt 0.2500 0.2500
vt 0.7500 0.2500
vt 0.0000 0.0000
vt 0.2500 1.2500
vt 0.7500 1.2500
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 0.7071 0.7071
vn 0.0000 -0.7071 -0.7071
g tunnel_tube_slant_Cube.002_Top
usemtl Top
s off
f 9/1/1 10/2/1 14/3/1 15/4/1
f 9/1/1 15/4/1 16/5/1 11/6/1
f 14/3/1 10/2/1 12/7/1 13/8/1
f 11/6/1 16/5/1 13/8/1 12/7/1
g tunnel_tube_slant_Cube.002_Bottom
usemtl Bottom
f 1/9/2 2/10/2 5/11/2 6/12/2
f 1/9/2 6/12/2 7/13/2 8/14/2
f 8/14/2 7/13/2 4/15/2 3/16/2
f 5/11/2 2/10/2 3/16/2 4/15/2
g tunnel_tube_slant_Cube.002_Right
usemtl Right
f 1/17/3 9/18/3 11/19/3 2/20/3
f 14/21/3 13/22/3 4/23/3 7/24/3
g tunnel_tube_slant_Cube.002_Left
usemtl Left
f 3/16/4 12/25/4 10/26/4 8/27/4
f 16/28/4 15/29/4 6/30/4 5/31/4
g tunnel_tube_slant_Cube.002_Front
usemtl Front
f 2/10/5 11/19/5 12/32/5 3/16/5
f 15/33/5 14/34/5 7/35/5 6/36/5
g tunnel_tube_slant_Cube.002_Back
usemtl Back
f 9/1/6 1/17/6 8/37/6 10/2/6
f 13/38/6 16/39/6 5/11/6 4/15/6

View File

@ -22,6 +22,7 @@ dfcaverns_sweet_pod_delay_multiplier (sweet_pod growth delay multiplier) float 2
#To disable glow worm growth, set this to 0.
dfcaverns_glow_worm_delay_multiplier (glow worm growth delay multiplier) float 10
dfcaverns_light_kills_fungus (Light kills fungus) bool true
dfcaverns_snareweed_damage (Snareweed causes damage to player) bool true
[Cavern dimensions]
#Note that this doesn't guarantee caverns of this setting's size. This setting
@ -39,11 +40,16 @@ dfcaverns_cavern_threshold (Cavern threshold) float 0.5 0.0 1.0
dfcaverns_ymax (Upper limit of level 1) int -300
dfcaverns_level1_min (Upper limit of level 2) int -900
dfcaverns_level2_min (Upper limit of level 3) int -1500
dfcaverns_level3_min (Upper limit of lava sea) int -2100
dfcaverns_lava_sea_min (Lower limit of lava sea) int -2700
dfcaverns_level3_min (Upper limit of the sunless sea) int -2100
dfcaverns_sunless_sea_min (Lower limit of the sunless sea) int -2500
dfcaverns_lava_sea_max (Upper limit of the lava sea) int -3000
dfcaverns_lava_sea_min (Lower limit of the lava sea) int -3500
[Lower Sea]
[Lower Seas]
#Determines threshold for lower sea cave generation. Higher number means sparser cavern
dfcaverns_lava_sea_threshold (Cavern threshold for magma sea) float 0.2 0.0 1.0
#When true, the lower sea contains magma. When false, it's water instead.
dfcaverns_bottom_sea_contains_lava (Lower sea is lava) bool true
#When true, the lava sea level is generated
dfcaverns_enable_lava_sea (Generate magma sea) bool true
#When true cavern biomes at the most extreme humidity range will be flooded
#with water, providing significant challenges in those areas.
dfcaverns_flooded_biomes (Add a lot of water to the most humid cavern biomes) bool true

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

View File

@ -14,6 +14,7 @@ dftrees_tower_cap_gills - from caverealms mushroom gills
dftrees_cave_moss and floor_fungus - derived from caverealms algae
dfcaverns_fungi - copied from caverealms
dfcaverns_glow_worm - copied from caverealms
dfcaverns_glow_worm_animated - glow worm texture overlaid with rippling animation derived from default mod's water texture
dftrees_cave_wheat - derived from farming wheat
dfcaverns_flour - derived from farming
@ -21,3 +22,8 @@ dfcaverns_bread - derived from farming
dfcaverns_pig_tail_thread - copied from farming
dfcaverns_sugar - derived from farming
dfcaverns_spore_tree_spores, dfcaverns_cave_wheat_seed, dfcaverns_pig_tail_seed - all derived from farming wheat seed
dfcaverns_glow_mese - from caverealms glow_mese
dfcaverns_glow_ruby, dfcaverns_glow_ruby4x, dfcaverns_glow_ruby_quarter - from caverealms glow_ruby
dfcaverns_glow_ruby_ore - from caverealms glow_ruby_ore

View File

@ -39,7 +39,7 @@ minetest.register_node("dfcaverns:black_cap_gills", {
max_items = 1,
items = {
{
items = {'dfcaverns:black_cap_sapling'},
items = {'dfcaverns:black_cap_sapling', 'dfcaverns:black_cap_gills'},
rarity = 5,
},
{
@ -73,6 +73,14 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = 'default:torch 8',
recipe = {
{'dfcaverns:black_cap_gills'},
{'group:stick'},
}
})
minetest.register_node("dfcaverns:black_cap_wood", {
description = S("Black Cap Planks"),
_doc_items_longdesc = dfcaverns.doc.black_cap_desc,

View File

@ -31,7 +31,7 @@ minetest.register_node("dfcaverns:nether_cap_gills", {
_doc_items_usagehelp = dfcaverns.doc.nether_cap_usage,
tiles = {"dfcaverns_nether_cap_gills.png"},
is_ground_content = true,
light_source = 4,
light_source = 6,
groups = {snappy = 3, leafdecay = 3, leaves = 1, puts_out_fire = 1, cools_lava = 1},
sounds = default.node_sound_leaves_defaults(),
drawtype = "plantlike",

View File

@ -35,6 +35,94 @@ minetest.register_node("dfcaverns:tunnel_tube", {
},
})
minetest.register_node("dfcaverns:tunnel_tube_slant_bottom", {
description = S("Tunnel Tube"),
_doc_items_longdesc = dfcaverns.doc.tunnel_tube_desc,
_doc_items_usagehelp = dfcaverns.doc.tunnel_tube_usage,
tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"},
paramtype2 = "facedir",
drawtype = "mesh",
mesh = "tunnel_tube_slant.obj",
paramtype = "light",
drop = "dfcaverns:tunnel_tube",
groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2},
sounds = default.node_sound_wood_defaults(),
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("dfcaverns:tunnel_tube_slant_top", {
description = S("Tunnel Tube"),
_doc_items_longdesc = dfcaverns.doc.tunnel_tube_desc,
_doc_items_usagehelp = dfcaverns.doc.tunnel_tube_usage,
tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"},
paramtype2 = "facedir",
drawtype = "mesh",
mesh = "tunnel_tube_slant_2.obj",
paramtype = "light",
drop = "dfcaverns:tunnel_tube",
groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2},
sounds = default.node_sound_wood_defaults(),
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("dfcaverns:tunnel_tube_slant_full", {
description = S("Tunnel Tube"),
_doc_items_longdesc = dfcaverns.doc.tunnel_tube_desc,
_doc_items_usagehelp = dfcaverns.doc.tunnel_tube_usage,
tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"},
paramtype2 = "facedir",
drawtype = "mesh",
mesh = "tunnel_tube_slant_full.obj",
paramtype = "light",
drop = "dfcaverns:tunnel_tube",
groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2},
sounds = default.node_sound_wood_defaults(),
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},
},
},
})
--Wood
minetest.register_craft({
output = 'dfcaverns:tunnel_tube_wood 4',
@ -218,23 +306,27 @@ minetest.register_node("dfcaverns:tunnel_tube_sapling", {
})
local tunnel_tube_directions = {
{x=1,y=0,z=0},
{x=-1,y=0,z=0},
{x=0,y=0,z=1},
{x=0,y=0,z=-1},
-- {x=1,y=0,z=1}, -- diagonals work, but they don't look as nice as orthogonals
-- {x=-1,y=0,z=1},
-- {x=1,y=0,z=-1},
-- {x=-1,y=0,z=-1},
[0] = {x=0,y=0,z=-1},
[1] = {x=-1,y=0,z=0},
[2] = {x=0,y=0,z=1},
[3] = {x=1,y=0,z=0},
}
local tunnel_tube_curvature = {0,0,0,0,1,1,1,2,2,3,4}
local tunnel_tube_displacement =
{
[4] = 1,
[5] = 1,
[6] = 2,
[7] = 2,
[8] = 3,
[9] = 3,
}
dfcaverns.spawn_tunnel_tube = function(pos)
local direction = tunnel_tube_directions[math.random(1,4)]
local height = math.random(6,10)
local direction = math.random(0,3) -- serves as both the facedir and the lookup in the direction table
local height = math.random(4,9)
local x, y, z = pos.x, pos.y, pos.z
local top_pos = vector.add(pos, vector.multiply(direction, tunnel_tube_curvature[height]))
local top_pos = vector.add(pos, vector.multiply(tunnel_tube_directions[direction], tunnel_tube_displacement[height]))
top_pos.y = y + height - 1
local vm = minetest.get_voxel_manip()
@ -254,28 +346,41 @@ end
local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
local c_tunnel_tube = minetest.get_content_id("dfcaverns:tunnel_tube")
local c_tunnel_tube_bottom = minetest.get_content_id("dfcaverns:tunnel_tube_slant_bottom")
local c_tunnel_tube_top = minetest.get_content_id("dfcaverns:tunnel_tube_slant_top")
local c_tunnel_tube_full = minetest.get_content_id("dfcaverns:tunnel_tube_slant_full")
local c_tunnel_tube_fruiting_body = minetest.get_content_id("dfcaverns:tunnel_tube_fruiting_body")
-- was simplest to just hardcode these patterns for each height from 4 to 9
-- pattern is displacement, node
local tunnel_tube_patterns =
{
[4] = {{0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_fruiting_body}},
[5] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_fruiting_body}},
[6] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_fruiting_body}},
[7] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_fruiting_body}},
[8] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_full}, {3, c_tunnel_tube_fruiting_body}},
[9] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_full}, {3, c_tunnel_tube_fruiting_body}},
}
dfcaverns.spawn_tunnel_tube_vm = function(vi, area, data, param2_data, height, direction)
if not height then height = math.random(6, 10) end
if not direction then direction = tunnel_tube_directions[math.random(1,4)] end
if not height then height = math.random(4, 9) end
if direction == nil then direction = math.random(0,3) end
local pos = area:position(vi)
local y = pos.y
local previous_vi = vi
for i = 1, height do
local pattern = tunnel_tube_patterns[height]
for i, nodepattern in ipairs(pattern) do
pos.y = y + i - 1
vi = area:indexp(vector.add(pos, vector.multiply(direction, tunnel_tube_curvature[i])))
vi = area:indexp(vector.add(pos, vector.multiply(tunnel_tube_directions[direction], nodepattern[1])))
if data[vi] == c_air or data[vi] == c_ignore then
previous_vi = vi
if i ~= height then
data[vi] = c_tunnel_tube
param2_data[vi] = 0
else
data[vi] = c_tunnel_tube_fruiting_body
end
data[vi] = nodepattern[2]
param2_data[vi] = direction
else
data[previous_vi] = c_tunnel_tube_fruiting_body
param2_data[vi] = direction
break
end
end

75
voxelarea_iterator.lua Normal file
View File

@ -0,0 +1,75 @@
-- These functions are a minor modification of the voxel area iterator defined in the built in voxelarea.lua lua code.
-- As such, this file is separately licened under the LGPL as follows:
-- License of Minetest source code
-------------------------------
--Minetest
--Copyright (C) 2010-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
--This program is free software; you can redistribute it and/or modify
--it under the terms of the GNU Lesser General Public License as published by
--the Free Software Foundation; either version 2.1 of the License, or
--(at your option) any later version.
--This program is distributed in the hope that it will be useful,
--but WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--GNU Lesser General Public License for more details.
--You should have received a copy of the GNU Lesser General Public License along
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
function VoxelArea:iter_xyz(minx, miny, minz, maxx, maxy, maxz)
local i = self:index(minx, miny, minz) - 1
local x = minx - 1 -- subtracting one because x gets incremented before it gets returned the first time.
local xrange = maxx - minx + 1
local nextaction = i + 1 + xrange
local y = 0
local yrange = maxy - miny + 1
local yreqstride = self.ystride - xrange
local z = 0
local zrange = maxz - minz + 1
local multistride = self.zstride - ((yrange - 1) * self.ystride + xrange)
return function()
-- continue i until it needs to jump
i = i + 1
x = x + 1
if i ~= nextaction then
return i, x, y+miny, z+minz
end
-- continue y until maxy is exceeded
y = y + 1
x = minx -- new line
if y ~= yrange then
-- set i to index(minx, miny + y, minz + z) - 1
i = i + yreqstride
nextaction = i + xrange
return i, x, y+miny, z+minz
end
-- continue z until maxz is exceeded
z = z + 1
if z == zrange then
-- cuboid finished, return nil
return
end
-- set i to index(minx, miny, minz + z) - 1
i = i + multistride
y = 0
nextaction = i + xrange
return i, x, y+miny, z+minz
end
end
function VoxelArea:iterp_xyz(minp, maxp)
return self:iter_xyz(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z)
end