87 Commits

Author SHA1 Message Date
de57f627e2 update mapgen_helper 2020-02-12 23:43:34 -07:00
ffd088200d update screenshots with new slade colors 2020-02-12 15:28:33 -07:00
893dd85bce give slade a more muted, gloomy hue to differentiate it from nether stone 2020-02-12 15:13:02 -07:00
769f704f85 remove the smoke from torchspines again - it doesn't dissipate that deep underground 2020-02-11 19:58:34 -07:00
336c0849aa improve the efficiency of giant mycelium growth using flat node array, fewer dereferences 2020-02-10 13:38:27 -07:00
d9b3903e66 make mapgen mycelium timer delay configurable 2020-02-09 17:15:41 -07:00
bf507c3177 switch from ABM to node timer for mapgen mycelium growth 2020-02-09 14:40:08 -07:00
7877f2cb4b replace glowstone texture with a new animated one 2020-02-09 01:26:14 -07:00
788a00e307 add smokey back to torchspine now that it can be dialed down a bit 2020-02-08 23:33:42 -07:00
e2c6507e5f new mapgen_helper metrics 2020-02-08 23:10:37 -07:00
18051ce3a6 add pitter patter of spore tree spores, alternate paper recipe 2020-02-06 18:56:47 -07:00
239d4569e2 caverns become far too smokey, alas 2020-02-06 14:38:44 -07:00
599f17ec60 generate dry stalactites in near-surface caverns. 2020-02-05 20:59:55 -07:00
98e3e0a222 fix drop definitions 2020-02-04 17:30:09 -07:00
89639e289a make torchspines smokey and manually lightable 2020-02-04 17:14:15 -07:00
240d35cfa6 fix slade undiggability 2020-02-03 02:22:16 -07:00
c5fe22f7ec add lbm to upgrade old bones 2020-02-02 22:57:10 -07:00
6deb010475 fix bones formspec 2020-02-02 22:13:32 -07:00
ad319c50a3 add fireflies to primordial, spread out the post-mapgen node timer for plant matter a bit more. 2020-02-02 04:34:11 -07:00
64ab6ebd05 fix leftover undefined variable 2020-02-01 17:22:00 -07:00
84efae02c4 update spindlestem growth code, remove deprecated functions 2020-02-01 17:06:16 -07:00
96e6ecefe7 make mapping kit requirement more flexible 2020-01-31 14:13:35 -07:00
e59144a33b add various eating sounds 2020-01-30 20:50:07 -07:00
4a40eaf2b2 update deprecated functions 2020-01-30 17:33:14 -07:00
9e53ee9836 fix a few minor bugs 2020-01-30 03:29:32 -07:00
ff1d5d0af2 fixing up fungus light sensitivity, tree growth code 2020-01-30 00:57:29 -07:00
27afe3e383 make it slightly harder to dig down through amethyst sheathing of pits 2020-01-29 16:34:18 -07:00
d82be17b6b update colours 2020-01-29 14:07:50 -07:00
19236da965 better goblin cap schematics 2020-01-29 03:07:43 -07:00
b4293d30c6 add rare thicker Goblin Caps, suitable for use as huts. 2020-01-28 22:58:32 -07:00
d9236c33a3 change surface tunnel detection to allow above-ground stalactites and stalagmites 2020-01-27 23:40:39 -07:00
861b8935a9 update subterrane 2020-01-27 20:42:23 -07:00
70996a5e4b make mycelia climbable 2020-01-27 20:32:09 -07:00
95578b06e1 record identity of slade-breachers 2020-01-27 20:11:59 -07:00
41edf4d7b1 separate setting for ruin markers 2020-01-27 16:49:44 -07:00
aec1cac984 add names to the glowing pits and some of the ruins 2020-01-27 16:19:23 -07:00
af402c08ce spreading_dirt_type depends on light, create my own ABM instead 2020-01-27 11:08:38 -07:00
e4a69b3e1f reduce density of megaflora a bit - was too hard to walk through 2020-01-27 11:01:55 -07:00
7cb293b6be update mapgen_helper and subterrane 2020-01-27 09:40:08 -07:00
3ba2542979 updated magma sea screenshot 2020-01-26 22:54:43 -07:00
41b512dc47 update guide with some Primordial teasers 2020-01-26 22:36:44 -07:00
6b41029b84 polishing up the Primordial layer 2020-01-26 19:56:19 -07:00
9ddb8c5b6f try a more efficient way of changing the interiors of columns 2020-01-26 11:30:40 -07:00
a47c25a89c add named waypoints to the underworld 2020-01-25 13:55:40 -07:00
f11e878b08 update map colours 2019-12-27 23:47:51 -07:00
19f518b21e boost default plant growth delay, add growing selection boxes 2019-12-27 22:45:09 -07:00
2eb5273746 remove deprecated files 2019-12-14 16:02:09 -07:00
3bd29df3bc add trail mod support 2019-12-14 14:29:56 -07:00
859f84686a fix ice/oil on level 3, tweak some loot probabilities 2019-12-08 01:19:35 -07:00
ad5d64d901 puzzle particle, bones were only spawning on top of structures 2019-12-05 17:24:26 -07:00
7ee75edeab fancy up the seal's upper surface with inscriptions to make the formspec feel consistent 2019-12-03 21:39:13 -07:00
43d67e764d switch to compositing to save a few bytes 2019-12-03 21:35:47 -07:00
9bcd5532fe tweak background of inscription 2 so it's less obviously a copy of the background for inscription 1 2019-12-03 21:30:25 -07:00
04fd11c312 add a clue to the seal formspec 2019-12-03 21:21:01 -07:00
a33058ede0 fancy up the puzzle seal temples with some custom blocks, add sub-slade grid passages 2019-12-03 20:31:26 -07:00
54bbf456c4 switch to a different key bell 2019-12-02 00:14:57 -07:00
ccc200661d add flowers to the underworld warrior bones 2019-12-01 18:49:43 -07:00
e0b3b023b0 add a small bit of anti-griefing - the seal breach bell only tolls globally 13 times per activation 2019-12-01 18:30:29 -07:00
922181bba2 puzzle seals now fully functional. Need to add clues for decoding the keys next. 2019-12-01 17:46:08 -07:00
91e2da49c8 Set up puzzle seals to be able to dig a staircase shaft through the slade layer. TODO: the puzzle to guard the trigger. 2019-11-30 21:59:01 -07:00
ff44fb87c2 add seal block 2019-11-29 21:37:01 -07:00
d352178244 primordial column material, add sealed shafts to underworld 2019-11-29 16:04:50 -07:00
ce5c6f807d fix for overgen crash in level 2 2019-11-11 15:23:41 -07:00
cc30f96d52 remove unintentional airspace from underside of slade 2019-11-11 13:29:26 -07:00
816f0bf7eb more fixes for overgen support 2019-11-11 13:12:46 -07:00
b29f549d76 fix a crash with veinstone, and simplify nvals_cave lookup now that overgen covers the same area 2019-11-11 09:42:56 -07:00
85ab92f32d use custom is_ground_content method 2019-11-11 01:53:02 -07:00
13c75410aa optimize pngs, add is_ground_content to everything 2019-11-10 21:47:10 -07:00
cacddcd347 Merge branch 'master' into primordial 2019-08-18 21:30:04 -06:00
12919e9a16 Small stuff (#8)
* cave pearls and spindleshrooms (name subject to change) now are things. Not in mapgen yet.

* add the wandering "gas wisp" to light up some of the gas-filled caverns

* make wisps rarely spawned by gas explosions

* revamp spindlestems into a sort of mineral detector, add glowing extract bottles

* optimize pngs

* add gas wisps to mapgen

* add spindlestems to cavern level 1, most level 1 warrens are now lit up

* update internal names, adjust mineral detection range

* add cave pearls to some level 2 warrens and tunnels

* switch experimental simplecrafting_lib support to crafting mod

* Pearls don't grow on falling nodes

* put spindlestems with goblin caps, make them always grow red when near those

* bunch of documentation

* add castle coral to replace cave coral, which has been repurposed into column decoration

* documentation for cave coral, update some locale text

* add a recipe for cooking oil into paraffin

* add old bones to the underworld

* MIT license for bones_loot

* also cook black cap gills into paraffin, they're oily

* add salt crystals to the bloodthorn caverns, illuminating the floor

* documentation for salt crystals

* auto-generate minetestmapper colors.

need to update the spindlestem colours manually

* add spindlestem to fungiwood caverns too, and increase warren coverage

* in anticipation of eventually adding stuff below the Slade, making glowing pit erosion self-limiting.

* add a bit of displacement to the underside of the slade layer

* Unique images and names for cooking recipes.

* revamp bones loot

* add softer footsteps for some fungus types

* update mapgen_helper

* update cave coral screenshot

* mention glowing salts in bloodthorn caverns
2019-08-18 22:20:07 -05:00
bf5227f055 Make a spectrum of jungle growth 2019-08-16 21:04:33 -06:00
9db3e47342 rough out the jungle biome 2019-08-15 19:46:57 -06:00
c64f0a6f63 make giant mushrooms edible, make jungle trees growable 2019-08-12 23:00:41 -06:00
1a86f38f71 add a use for giant mycelium 2019-08-12 20:03:55 -06:00
63efbf6179 allow mycelium growth to pause when it hits unloaded areas 2019-08-12 17:48:21 -06:00
b2b5231c43 make mycelium grow when players aren't present 2019-08-12 14:09:31 -06:00
eb3377fba0 fix settings for giant mycelium 2019-08-12 09:26:58 -06:00
99588c160f add giant mycelium to mapgen 2019-08-11 23:36:18 -06:00
f2c1f54215 add giant mycelium fungoidal structure 2019-08-11 19:33:50 -06:00
62b33c126f update primordial mushroom schematic placement to ensure it fits 2019-08-10 14:32:31 -06:00
78963d4b89 update mapgen_helper 2019-08-10 14:31:07 -06:00
e6ce07a013 decorate fungal floor a bit 2019-08-10 01:16:23 -06:00
19a6da4f78 fungal ceiling decorations 2019-08-09 21:51:39 -06:00
7ebcdd0178 add giant jungle mushroom, rough out actual cavern layer code framework 2019-08-09 20:32:27 -06:00
3486f534e2 import ClockGen's giant mushroom schematics, make them and giant ferns growable 2019-08-09 00:44:21 -06:00
86535e82fc update mapgen_helper 2019-08-08 23:16:13 -06:00
02e699890f bring in the art assets from ClockGen's "better_caves_modpack" under CC BY 4.0,, code written from scratch. 2019-08-07 23:31:01 -06:00
355 changed files with 9776 additions and 796 deletions

22
bones_loot/LICENSE.txt Normal file
View File

@ -0,0 +1,22 @@
License for Code
----------------
Copyright (C) 2019 FaceDeer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

149
bones_loot/init.lua Normal file
View File

@ -0,0 +1,149 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local dungeon_loot_path = minetest.get_modpath("dungeon_loot")
bones_loot = {}
local local_loot = {}
local local_loot_register = function(t)
if t.name ~= nil then
t = {t} -- single entry
end
for _, loot in ipairs(t) do
table.insert(local_loot, loot)
end
end
-- we could do this for the dungeon_loot registered loot table as well,
-- but best not to meddle in other mods' internals if it can be helped.
local clean_up_local_loot = function()
if local_loot == nil then return end
for i = #local_loot, 1, -1 do
if not minetest.registered_items[local_loot[i].name] then
table.remove(local_loot, i)
end
end
end
-- Uses same table format as dungeon_loot
-- eg, {name = "bucket:bucket_water", chance = 0.45, types = {"sandstone", "desert"}},
-- if dungeon_loot is installed it uses dungeon_loot's registration function directly.
if dungeon_loot_path then
bones_loot.register_loot = dungeon_loot.register
else
bones_loot.register_loot = local_loot_register
minetest.after(0, clean_up_local_loot)
end
local get_loot_list = function(pos, loot_type, exclusive_loot_type)
local loot_table
if dungeon_loot_path then
loot_table = dungeon_loot.registered_loot
else
loot_table = local_loot
end
local item_list = {}
local pos_y = pos.y
for _, loot in ipairs(loot_table) do
if loot.y == nil or (pos_y >= loot.y[1] and pos_y <= loot.y[2]) then
if (not exclusive_loot_type and loot.types == nil) or
(loot.types and table.indexof(loot.types, loot_type) ~= -1) then
table.insert(item_list, loot)
end
end
end
return item_list
end
local shuffle = function(tbl)
for i = #tbl, 2, -1 do
local rand = math.random(i)
tbl[i], tbl[rand] = tbl[rand], tbl[i]
end
return tbl
end
-- "exclusive" set to true means that loot table entries without a loot_type won't be considered.
bones_loot.get_loot = function(pos, loot_type, max_stacks, exclusive_loot_type)
local item_list = get_loot_list(pos, loot_type, exclusive_loot_type)
shuffle(item_list)
-- apply chances / randomized amounts and collect resulting items
local items = {}
for _, loot in ipairs(item_list) do
if math.random() <= loot.chance then
local itemdef = minetest.registered_items[loot.name]
if itemdef then
local amount = 1
if loot.count ~= nil then
amount = math.random(loot.count[1], loot.count[2])
end
if itemdef.tool_capabilities then
for n = 1, amount do
local wear = math.random(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear
table.insert(items, ItemStack({name = loot.name, wear = wear}))
max_stacks = max_stacks - 1
if max_stacks <= 0 then break end
end
else
local stack_max = itemdef.stack_max
while amount > 0 do
table.insert(items, ItemStack({name = loot.name, count = math.min(stack_max, amount)}))
amount = amount - stack_max
max_stacks = max_stacks - 1
if max_stacks <= 0 then break end
end
end
end
end
if max_stacks <= 0 then break end
end
return items
end
local bones_formspec =
"size[8,9]" ..
"list[current_name;main;0,0.3;8,4;]" ..
"list[current_player;main;0,4.85;8,1;]" ..
"list[current_player;main;0,6.08;8,3;8]" ..
"listring[current_name;main]" ..
"listring[current_player;main]"
if minetest.get_modpath("default") then
bones_formspec = bones_formspec .. default.get_hotbar_bg(0,4.85)
end
bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusive_loot_type)
minetest.set_node(pos, {name="bones:bones", param2 = math.random(1,4)-1})
local meta = minetest.get_meta(pos)
if infotext == nil then
infotext = S("Someone's old bones")
end
meta:set_string("infotext", infotext)
meta:set_string("formspec", bones_formspec)
if max_stacks and max_stacks > 0 then
local loot = bones_loot.get_loot(pos, loot_type, max_stacks, exclusive_loot_type)
local inv = meta:get_inventory()
inv:set_size("main", 8 * 4)
for _, item in ipairs(loot) do
inv:add_item("main", item)
end
end
end
minetest.register_lbm({
label = "Repair underworld bones formspec",
name = "bones_loot:repair_underworld_bones_formspec",
nodenames = {"bones:bones"},
action = function(pos, node)
local meta = minetest.get_meta(pos)
if not meta:get("formspec") then
meta:set_string("formspec", bones_formspec)
end
end,
})

45
bones_loot/intllib.lua Normal file
View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

View File

@ -0,0 +1,22 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-07 00:58-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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: bones_loot\init.lua:65
msgid "Someone's old bones"
msgstr ""

View File

@ -0,0 +1,6 @@
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
cd ..
set LIST=
for /r %%X in (*.lua) do set LIST=!LIST! %%X
..\..\intllib\tools\xgettext.bat %LIST%

4
bones_loot/mod.conf Normal file
View File

@ -0,0 +1,4 @@
name = bones_loot
description = An API that allows bones to be placed procedurally with randomly generated loot
depends = bones
optional_depends = dungeon_loot, intllib, default

View File

@ -7,11 +7,11 @@ local print_settingtypes = false
local function setting(stype, name, default, description) local function setting(stype, name, default, description)
local value local value
if stype == "bool" then if stype == "bool" then
value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name) value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
elseif stype == "string" then elseif stype == "string" then
value = minetest.setting_get(CONFIG_FILE_PREFIX..name) value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
elseif stype == "int" or stype == "float" then elseif stype == "int" or stype == "float" then
value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name)) value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name))
end end
if value == nil then if value == nil then
value = default value = default
@ -48,3 +48,7 @@ setting("bool", "enable_underworld", true, "Enable underworld")
df_caverns.config.enable_underworld = df_caverns.config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil df_caverns.config.enable_underworld = df_caverns.config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil
setting("int", "underworld_level", -3200, "Underworld level") setting("int", "underworld_level", -3200, "Underworld level")
setting("int", "underworld_glowing_pit_mapblocks", 8, "Average pit spacing measured in mapblocks") setting("int", "underworld_glowing_pit_mapblocks", 8, "Average pit spacing measured in mapblocks")
setting("bool", "enable_primordial", true, "Enable primordial cavern")
setting("int", "primordial_max", -3393, "Upper limit to primordial caverns")
setting("int", "primordial_min", -4032, "Lower limit to primordial caverns")

View File

@ -1,9 +0,0 @@
default
subterrane
df_farming?
df_trees
df_mapitems
ice_sprites?
oil?
df_underworld_items?
magma_conduits?

View File

@ -1 +0,0 @@
Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels.

117
df_caverns/dungeon_loot.lua Normal file
View File

@ -0,0 +1,117 @@
if minetest.get_modpath("dungeon_loot") then
if df_caverns.config.enable_underworld then
dungeon_loot.register({
{name = "df_underworld_items:glow_amethyst", chance = 0.3, count = {1, 12}, y = {-32768, df_caverns.config.lava_sea_level}},
})
end
if df_caverns.config.enable_oil_sea and minetest.get_modpath("bucket") then
dungeon_loot.register({
{name = "oil:oil_bucket", chance = 0.5, count = {1, 3}, y = {-32768, df_caverns.config.ymax}},
})
end
if df_caverns.config.enable_lava_sea then
dungeon_loot.register({
{name = "df_mapitems:mese_crystal", chance = 0.25, count = {1, 5}, y = {-32768, df_caverns.config.sunless_sea_min}},
{name = "df_mapitems:glow_mese", chance = 0.1, count = {1, 3}, y = {-32768, df_caverns.config.sunless_sea_min}},
})
end
dungeon_loot.register({
{name = "df_farming:cave_wheat_seed", chance = 0.5, count = {1, 10}, y = {-32768, df_caverns.config.ymax}},
{name = "df_farming:cave_bread", chance = 0.8, count = {1, 10}, y = {-32768, df_caverns.config.ymax}},
{name = "df_farming:pig_tail_thread", chance = 0.7, count = {1, 10}, y = {-32768, df_caverns.config.ymax}},
{name = "df_farming:plump_helmet_spawn", chance = 0.4, count = {1, 8}, y = {-32768, df_caverns.config.ymax}},
{name = "df_farming:plump_helmet_4_picked", chance = 0.8, count = {1, 15}, y = {-32768, df_caverns.config.ymax}},
{name = "df_trees:glowing_bottle_red", chance = 0.6, count = {1, 20}, y = {-32768, df_caverns.config.ymax}},
{name = "df_trees:glowing_bottle_green", chance = 0.5, count = {1, 20}, y = {-32768, df_caverns.config.ymax}},
{name = "df_trees:glowing_bottle_cyan", chance = 0.4, count = {1, 15}, y = {-32768, df_caverns.config.ymax}},
{name = "df_trees:glowing_bottle_golden", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.ymax}},
{name = "df_farming:pig_tail_seed", chance = 0.5, count = {1, 10}, y = {-32768, df_caverns.config.level1_min}},
{name = "df_mapitems:med_crystal", chance = 0.2, count = {1, 2}, y = {-32768, df_caverns.config.level1_min}},
{name = "df_farming:dimple_cup_seed", chance = 0.3, count = {1, 10}, y = {-32768, df_caverns.config.level2_min}},
{name = "df_farming:quarry_bush_seed", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.level2_min}},
{name = "df_farming:sweet_pod_seed", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.level2_min}},
{name = "df_mapitems:big_crystal", chance = 0.1, count = {1, 1}, y = {-32768, df_caverns.config.level2_min}},
{name = "df_trees:torchspine_ember", chance = 0.3, count = {1, 3}, y = {-32768, df_caverns.config.level2_min}},
{name = "ice_sprites:ice_sprite_bottle", chance = 0.1, count = {1, 1}, y = {-32768, df_caverns.config.level2_min}},
})
end
if minetest.get_modpath("bones_loot") and df_caverns.config.enable_underworld then
bones_loot.register_loot({
{name = "binoculars:binoculars", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "boats:boat", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "bucket:bucket_empty", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
{name = "fire:flint_and_steel", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:tulip_black", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:dandelion_white", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:dandelion_yellow", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:rose", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:tulip", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:chrysanthemum_green", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "flowers:geranium", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "map:mapping_kit", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
{name = "screwdriver:screwdriver", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
-- don't give the player tnt:tnt, they can craft that from this if tnt is enabled for them
{name = "tnt:gunpowder", chance = 0.4, count = {1,10}, types = {"underworld_warrior"}},
{name = "tnt:tnt_stick", chance = 0.3, count = {1,6}, types = {"underworld_warrior"}},
{name = "vessels:steel_bottle", chance = 0.4, count = {1,3}, types = {"underworld_warrior"}},
{name = "vessels:glass_bottle", chance = 0.2, count = {1,2}, types = {"underworld_warrior"}},
{name = "vessels:glass_fragments", chance = 0.1, count = {1,4}, types = {"underworld_warrior"}},
{name = "default:book", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:paper", chance = 0.1, count = {1,6}, types = {"underworld_warrior"}},
{name = "default:skeleton_key", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:torch", chance = 0.75, count = {1,10}, types = {"underworld_warrior"}},
{name = "default:pick_bronze", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:pick_steel", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:pick_mese", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:pick_diamond", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:shovel_bronze", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:shovel_steel", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:shovel_mese", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:shovel_diamond", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:axe_bronze", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:axe_steel", chance = 0.5, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:axe_mese", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:axe_diamond", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:sword_bronze", chance = 0.5, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:sword_steel", chance = 0.75, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:sword_mese", chance = 0.35, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:sword_diamond", chance = 0.35, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:coal_lump", chance = 0.5, count = {1,5}, types = {"underworld_warrior"}},
{name = "default:mese_crystal", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:diamond", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:steel_ingot", chance = 0.2, count = {1,3}, types = {"underworld_warrior"}},
{name = "default:copper_ingot", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}},
{name = "default:bronze_ingot", chance = 0.2, count = {1,5}, types = {"underworld_warrior"}},
{name = "default:gold_ingot", chance = 0.3, count = {1,3}, types = {"underworld_warrior"}},
{name = "default:mese_crystal_fragment", chance = 0.4, count = {1,5}, types = {"underworld_warrior"}},
{name = "default:obsidian_shard", chance = 0.4, count = {1,3}, types = {"underworld_warrior"}},
{name = "default:flint", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}},
{name = "default:sign_wall_wood", chance = 0.1, count = {1,4}, types = {"underworld_warrior"}},
{name = "default:sign_wall_steel", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}},
{name = "default:ladder_wood", chance = 0.5, count = {1,10}, types = {"underworld_warrior"}},
{name = "default:ladder_steel", chance = 0.2, count = {1,5}, types = {"underworld_warrior"}},
{name = "default:meselamp", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}},
{name = "default:mese_post_light", chance = 0.25, count = {1,5}, types = {"underworld_warrior"}},
{name = "ice_sprites:ice_sprite_bottle", chance = 0.025, count = {1, 1}, types = {"underworld_warrior"}},
{name = "df_underworld_items:glow_amethyst", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}},
})
if df_caverns.config.enable_lava_sea then
bones_loot.register_loot({name = "df_mapitems:mese_crystal", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}})
end
end

View File

@ -15,3 +15,5 @@ dofile(modpath.."/sunless_sea.lua")
dofile(modpath.."/oil_sea.lua") dofile(modpath.."/oil_sea.lua")
dofile(modpath.."/lava_sea.lua") dofile(modpath.."/lava_sea.lua")
dofile(modpath.."/underworld.lua") dofile(modpath.."/underworld.lua")
dofile(modpath.."/primordial.lua")
dofile(modpath.."/dungeon_loot.lua")

View File

@ -137,11 +137,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
--write it to world --write it to world
vm:write_to_map() vm:write_to_map()
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
if chunk_generation_time < 1000 then mapgen_helper.record_time("df_caverns lava sea", time_taken)
minetest.log("info", "[df_caverns] lava sea mapblock generation took "..chunk_generation_time.." ms") --tell people how long
else
minetest.log("warning", "[df_caverns] lava sea took "..chunk_generation_time.." ms to generate map block "
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
end
end) end)

View File

@ -6,6 +6,8 @@ local c_dirt_moss = minetest.get_content_id("df_mapitems:dirt_with_cave_moss")
local c_wet_flowstone = minetest.get_content_id("df_mapitems:wet_flowstone") local c_wet_flowstone = minetest.get_content_id("df_mapitems:wet_flowstone")
local c_dry_flowstone = minetest.get_content_id("df_mapitems:dry_flowstone") local c_dry_flowstone = minetest.get_content_id("df_mapitems:dry_flowstone")
local c_spindlestem_white = minetest.get_content_id("df_trees:spindlestem_cap_white")
local tower_cap_shrublist local tower_cap_shrublist
local fungiwood_shrublist local fungiwood_shrublist
@ -51,8 +53,12 @@ local tower_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, d
if math.random() < 0.1 then if math.random() < 0.1 then
df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist) df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist)
elseif math.random() < 0.01 and abs_cracks > 0.25 then elseif abs_cracks > 0.25 then
if math.random() < 0.01 then
df_trees.spawn_tower_cap_vm(vi+ystride, area, data) df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
elseif math.random() < 0.04 then
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_spindlestem_white)
end
end end
end end
end end
@ -71,6 +77,8 @@ local fungiwood_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, d
df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungiwood_shrublist) df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungiwood_shrublist)
elseif math.random() < 0.03 and abs_cracks > 0.35 then elseif math.random() < 0.03 and abs_cracks > 0.35 then
df_trees.spawn_fungiwood_vm(vi+ystride, area, data) df_trees.spawn_fungiwood_vm(vi+ystride, area, data)
elseif math.random() < 0.04 then
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
end end
end end
end end
@ -88,8 +96,9 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
-- Partly fill flooded caverns and warrens -- Partly fill flooded caverns and warrens
if minp.y <= subsea_level then if minp.y <= subsea_level then
for vi in area:iterp(minp, maxp) do for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
if data[vi] == c_air and area:get_y(vi) <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then -- convert all air below sea level into water
if y <= subsea_level and data[vi] == c_air and nvals_cave[vi] < -flooding_threshold then
data[vi] = c_water data[vi] = c_water
end end
end end
@ -103,7 +112,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local abs_cracks = math.abs(nvals_cracks[index2d]) local abs_cracks = math.abs(nvals_cracks[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
-- underwater floor -- underwater floor
@ -129,7 +138,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local abs_cracks = math.abs(nvals_cracks[index2d]) local abs_cracks = math.abs(nvals_cracks[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
-- underwater ceiling, do nothing -- underwater ceiling, do nothing
@ -156,7 +165,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -174,7 +183,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -202,7 +211,8 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_floor_nodes) do for _, vi in ipairs(node_arrays.warren_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
local ystride = area.ystride
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -211,6 +221,26 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
else else
df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
end end
if biome_name ~= "barren" then
local cracks = nvals_cracks[index2d]
if cracks > 0.25 then
local rand = math.random()
if rand > cracks then
if math.random() < 0.25 then
data[vi] = c_dirt_moss
else
data[vi] = c_dirt
end
if data[vi+ystride] == c_air and math.random() < 0.25 then
df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist)
end
end
if rand > cracks*2 then
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
end
end
end
end end
end end
@ -220,7 +250,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -239,7 +269,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.column_nodes) do for _, vi in ipairs(node_arrays.column_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0) local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
if dry and data[vi] == c_wet_flowstone then if dry and data[vi] == c_wet_flowstone then
data[vi] = c_dry_flowstone data[vi] = c_dry_flowstone
@ -271,4 +301,5 @@ subterrane.register_layer({
decorate = decorate_level_1, decorate = decorate_level_1,
warren_region_variability_threshold = 0.33, warren_region_variability_threshold = 0.33,
double_frequency = true, double_frequency = true,
is_ground_content = df_caverns.is_ground_content,
}) })

View File

@ -18,6 +18,8 @@ local wall_vein_perlin_params = {
flags = "eased", flags = "eased",
} }
local c_pearls = minetest.get_content_id("df_mapitems:cave_pearls")
local subsea_level = df_caverns.config.level2_min - (df_caverns.config.level2_min - df_caverns.config.level1_min) * 0.33 -- "sea level" for the flooded caverns. local subsea_level = df_caverns.config.level2_min - (df_caverns.config.level2_min - df_caverns.config.level1_min) * 0.33 -- "sea level" for the flooded caverns.
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) -- cavern value out to which we're flooding tunnels and warrens local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) -- cavern value out to which we're flooding tunnels and warrens
@ -60,6 +62,8 @@ if minetest.get_modpath("df_farming") then
} }
end end
local c_red = minetest.get_content_id("df_trees:spindlestem_cap_red")
local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
local ystride = area.ystride local ystride = area.ystride
if abs_cracks < 0.1 then if abs_cracks < 0.1 then
@ -72,8 +76,10 @@ local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
end end
if math.random() < 0.1 then if math.random() < 0.1 then
df_caverns.place_shrub(vi+ystride, area, data, data_param2, goblin_cap_shrublist) df_caverns.place_shrub(vi+ystride, area, data, data_param2, goblin_cap_shrublist)
elseif math.random() < 0.02 then
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_red)
elseif math.random() < 0.015 then elseif math.random() < 0.015 then
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data) df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2)
end end
end end
@ -92,7 +98,7 @@ local spore_tree_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
if math.random() < 0.1 then if math.random() < 0.1 then
df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist) df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist)
elseif math.random() < 0.05 then elseif math.random() < 0.05 then
df_trees.spawn_spore_tree_vm(vi+ystride, area, data) df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2)
end end
end end
end end
@ -129,12 +135,13 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
local cavern_def = node_arrays.cavern_def local cavern_def = node_arrays.cavern_def
local vein_noise local vein_noise
local vein_area
-- Partly fill flooded caverns and warrens -- Partly fill flooded caverns and warrens
for vi in area:iterp(minp, maxp) do for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
local cave_val = nvals_cave[cave_area:transform(area, vi)] local cave_val = nvals_cave[vi]
if cave_val < -flooding_threshold then if cave_val < -flooding_threshold then
if mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp) then
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local cave_threshold = cavern_def.cave_threshold local cave_threshold = cavern_def.cave_threshold
@ -143,14 +150,14 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
-- add giant rooty structures to the flooded barren caverns -- add giant rooty structures to the flooded barren caverns
if vein_noise == nil then if vein_noise == nil then
vein_noise = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params) vein_noise, vein_area = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
end end
-- we can reuse cave_area here, its extents are minp, maxp too. if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then
if data[vi] == c_air and math.abs(vein_noise[cave_area:transform(area, vi)]) < 0.02 then
data[vi] = c_veinstone data[vi] = c_veinstone
end end
end end
if data[vi] == c_air and area:get_y(vi) <= subsea_level then end
if data[vi] == c_air and y <= subsea_level then
data[vi] = c_water -- otherwise, fill air with water when below sea level data[vi] = c_water -- otherwise, fill air with water when below sea level
end end
end end
@ -164,7 +171,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local abs_cracks = math.abs(nvals_cracks[index2d]) local abs_cracks = math.abs(nvals_cracks[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
-- underwater floor -- underwater floor
@ -192,7 +199,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local abs_cracks = math.abs(nvals_cracks[index2d]) local abs_cracks = math.abs(nvals_cracks[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
-- underwater ceiling, do nothing -- underwater ceiling, do nothing
@ -224,7 +231,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -242,7 +249,8 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
local ystride = area.ystride
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -251,13 +259,23 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
else else
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
end end
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
for i= 1, 4 do
if math.random() > 0.5 then
local index = vi-i*ystride
if data[index] == c_air then
df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2)
end
end
end
end
else else
-- air pockets -- air pockets
local ystride = area.ystride local ystride = area.ystride
local cracks = nvals_cracks[index2d] local cracks = nvals_cracks[index2d]
if cracks > 0.5 and data[vi-ystride] == c_water then if cracks > 0.4 and data[vi-ystride] == c_water then
data[vi-ystride] = c_air data[vi-ystride] = c_air
if cracks > 0.7 and data[vi-ystride*2] == c_water then if cracks > 0.6 and data[vi-ystride*2] == c_water then
data[vi-ystride*2] = c_air data[vi-ystride*2] = c_air
end end
end end
@ -270,7 +288,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_floor_nodes) do for _, vi in ipairs(node_arrays.warren_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -288,7 +306,8 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
local ystride = area.ystride
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name ~= "barren" then if flooded_caverns or biome_name ~= "barren" then
@ -297,8 +316,28 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
else else
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
end end
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
for i= 1, 4 do
if math.random() > 0.5 then
local index = vi-i*ystride
if data[index] == c_air then
df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2)
end end
-- else air pockets? end
end
end
else
-- air pockets
local cracks = nvals_cracks[index2d]
if cracks > 0.4 and data[vi-ystride] == c_water then
data[vi-ystride] = c_air
if cracks > 0.6 and data[vi-ystride*2] == c_water then
data[vi-ystride*2] = c_air
end
end
end
end end
---------------------------------------------- ----------------------------------------------
@ -307,7 +346,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.column_nodes) do for _, vi in ipairs(node_arrays.column_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0) local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
if dry and data[vi] == c_wet_flowstone then if dry and data[vi] == c_wet_flowstone then
data[vi] = c_dry_flowstone data[vi] = c_dry_flowstone
@ -337,5 +376,6 @@ subterrane.register_layer({
decorate = decorate_level_2, decorate = decorate_level_2,
warren_region_variability_threshold = 0.33, warren_region_variability_threshold = 0.33,
double_frequency = true, double_frequency = true,
is_ground_content = df_caverns.is_ground_content,
}) })

View File

@ -20,12 +20,15 @@ local c_dry_flowstone = minetest.get_content_id("df_mapitems:dry_flowstone")
local c_glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore") local c_glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore")
local c_salty_cobble = minetest.get_content_id("df_mapitems:salty_cobble")
local c_salt_crystal = minetest.get_content_id("df_mapitems:salt_crystal")
local c_sprite local c_sprite
if minetest.get_modpath("ice_sprites") then if minetest.get_modpath("ice_sprites") then
c_sprite = minetest.get_content_id("ice_sprites:ice_sprite") c_sprite = minetest.get_content_id("ice_sprites:ice_sprite")
end end
local subsea_level = df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33 local subsea_level = math.floor(df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33)
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold)
local ice_thickness = 3 local ice_thickness = 3
@ -157,20 +160,28 @@ local nether_cap_cavern_ceiling = function(abs_cracks, vert_rand, vi, area, data
end end
local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
local ai = vi+area.ystride
if abs_cracks < 0.075 then if abs_cracks < 0.075 then
if vert_rand < 0.004 then if vert_rand < 0.004 then
subterrane.big_stalagmite(vi+area.ystride, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone) subterrane.big_stalagmite(ai, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
elseif data[vi] ~= c_air and math.random() < 0.5 then
data[vi] = c_salty_cobble
if data[ai] == c_air and math.random() < 0.25 then
data[ai] = c_salt_crystal
data_param2[ai] = math.random(1,4)-1
end
else else
local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4
local height = math.floor(abs_cracks * 66) local height = math.floor(abs_cracks * 66)
subterrane.stalagmite(vi+area.ystride, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids) subterrane.stalagmite(ai, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids)
end end
elseif math.random() > abs_cracks + 0.66 then elseif math.random() > abs_cracks + 0.66 then
df_trees.spawn_blood_thorn_vm(vi+area.ystride, area, data, data_param2) df_trees.spawn_blood_thorn_vm(ai, area, data, data_param2)
data[vi] = c_desert_sand data[vi] = c_desert_sand
else else
if math.random() < 0.1 then if math.random() < 0.1 then
df_caverns.place_shrub(vi+area.ystride, area, data, data_param2, blood_thorn_shrublist) df_caverns.place_shrub(ai, area, data, data_param2, blood_thorn_shrublist)
data[vi] = c_desert_sand data[vi] = c_desert_sand
elseif math.random() > 0.25 then elseif math.random() > 0.25 then
data[vi] = c_desert_sand data[vi] = c_desert_sand
@ -196,20 +207,19 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
-- Partly fill flooded caverns and warrens -- Partly fill flooded caverns and warrens
if minp.y <= subsea_level then if minp.y <= subsea_level then
for vi in area:iterp(minp, maxp) do for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
local y = area:get_y(vi) local cave = nvals_cave[vi]
if y <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then if y <= subsea_level and cave < -flooding_threshold then
if data[vi] == c_air and y <= subsea_level then if data[vi] == c_air and y <= subsea_level then
data[vi] = c_water data[vi] = c_water
end end
if (mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp)) then
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
if biome_name == "blackcap" then if biome_name == "blackcap" then
-- oil slick -- oil slick
local cave = math.abs(nvals_cave[cave_area:transform(area, vi)]) if y == subsea_level and data[vi] == c_water and math.abs(cave) + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
if y == subsea_level and data[vi] == c_water and cave + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
data[vi] = c_oil data[vi] = c_oil
end end
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
@ -219,6 +229,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
end end
end end
end end
end
--------------------------------------------------------- ---------------------------------------------------------
-- Cavern floors -- Cavern floors
@ -229,7 +240,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local cracks = nvals_cracks[index2d] local cracks = nvals_cracks[index2d]
local abs_cracks = math.abs(cracks) local abs_cracks = math.abs(cracks)
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
-- underwater floor -- underwater floor
@ -274,7 +285,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local abs_cracks = math.abs(nvals_cracks[index2d]) local abs_cracks = math.abs(nvals_cracks[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
-- underwater ceiling, do nothing -- underwater ceiling, do nothing
@ -310,7 +321,16 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
else else
-- bloodthorn ceiling -- bloodthorn ceiling
if abs_cracks < 0.075 then if abs_cracks < 0.075 then
if data[vi] ~= c_air and math.random() < 0.5 then
data[vi] = c_salty_cobble
local bi = vi - area.ystride
if data[bi] == c_air and math.random() < 0.25 then
data[bi] = c_salt_crystal
data_param2[bi] = 19 + math.random(1,4)
end
else
df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false)
end
elseif abs_cracks > 0.75 and math.random() < 0.05 then elseif abs_cracks > 0.75 and math.random() < 0.05 then
data[vi] = c_glow_ore data[vi] = c_glow_ore
df_mapitems.place_big_crystal(data, data_param2, vi-area.ystride, true) df_mapitems.place_big_crystal(data, data_param2, vi-area.ystride, true)
@ -326,7 +346,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name == "blackcap" then if flooded_caverns or biome_name == "blackcap" then
@ -344,7 +364,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
if flooded_caverns or biome_name == "blackcap" then if flooded_caverns or biome_name == "blackcap" then
@ -373,7 +393,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
-- underwater ceiling, do nothing -- underwater ceiling, do nothing
@ -411,7 +431,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.warren_floor_nodes) do for _, vi in ipairs(node_arrays.warren_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not. local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
-- underwater floor, do nothing -- underwater floor, do nothing
@ -453,7 +473,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
for _, vi in ipairs(node_arrays.column_nodes) do for _, vi in ipairs(node_arrays.column_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 local flooded_caverns = nvals_cave[vi] < 0
if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then
if not flooded_caverns then if not flooded_caverns then
@ -507,4 +527,5 @@ subterrane.register_layer({
decorate = decorate_level_3, decorate = decorate_level_3,
warren_region_variability_threshold = 0.33, warren_region_variability_threshold = 0.33,
double_frequency = true, double_frequency = true,
is_ground_content = df_caverns.is_ground_content,
}) })

View File

@ -0,0 +1,26 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-25 13:52-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: df_caverns\underworld.lua:12
msgid "A glowing pit"
msgstr ""
#: df_caverns\underworld.lua:27
msgid "A mysterious seal"
msgstr ""

View File

@ -0,0 +1,6 @@
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
cd ..
set LIST=
for /r %%X in (*.lua) do set LIST=!LIST! %%X
..\..\intllib\tools\xgettext.bat %LIST%

View File

@ -1 +1,4 @@
name = df_caverns name = df_caverns
description = Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels.
depends = default, subterrane, df_trees, df_mapitems
optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot, named_waypoints, namegen, fireflies

View File

@ -4,6 +4,7 @@ end
local c_oil = minetest.get_content_id("oil:oil_source") local c_oil = minetest.get_content_id("oil:oil_source")
local c_gas = minetest.get_content_id("mine_gas:gas") local c_gas = minetest.get_content_id("mine_gas:gas")
local c_gas_wisp = minetest.get_content_id("mine_gas:gas_wisp")
local c_lava = minetest.get_content_id("default:lava_source") local c_lava = minetest.get_content_id("default:lava_source")
local c_obsidian = minetest.get_content_id("default:obsidian") local c_obsidian = minetest.get_content_id("default:obsidian")
@ -78,7 +79,11 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
if y > floor_height and y < ceiling_height then if y > floor_height and y < ceiling_height then
if y > median then if y > median then
if math.random() < 0.00025 and ((y < median + 3) or (y > ceiling_height - 3)) then
data[vi] = c_gas_wisp
else
data[vi] = c_gas data[vi] = c_gas
end
else else
data[vi] = c_oil data[vi] = c_oil
end end
@ -97,13 +102,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
--write it to world --write it to world
vm:write_to_map() vm:write_to_map()
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
if chunk_generation_time < 1000 then mapgen_helper.record_time("df_caverns oil sea", time_taken)
minetest.log("info", "[df_caverns] oil sea mapblock generation took "..chunk_generation_time.." ms") --tell people how long
else
minetest.log("warning", "[df_caverns] oil sea took "..chunk_generation_time.." ms to generate map block "
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
end
end) end)
minetest.register_ore({ minetest.register_ore({

425
df_caverns/primordial.lua Normal file
View File

@ -0,0 +1,425 @@
if not df_caverns.config.enable_primordial or not minetest.get_modpath("df_primordial_items") then
return
end
local perlin_cave_primordial = {
offset = 0,
scale = 1,
spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale},
seed = 14055553,
octaves = 3,
persist = 0.67
}
local perlin_wave_primordial = {
offset = 0,
scale = 1,
spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale},
seed = 923444,
octaves = 6,
persist = 0.63
}
local c_air = minetest.get_content_id("air")
local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10
-----------------------------------------------------------------------------------------
-- Fungal biome
local c_orb = minetest.get_content_id("df_primordial_items:glow_orb_hanging")
local c_mycelial_dirt = minetest.get_content_id("df_primordial_items:dirt_with_mycelium")
local c_dirt = minetest.get_content_id("default:dirt")
local c_giant_mycelium = minetest.get_content_id("df_primordial_items:giant_hypha_apical_mapgen")
local fungal_plants = {
minetest.get_content_id("df_primordial_items:fungal_grass_1"),
minetest.get_content_id("df_primordial_items:fungal_grass_2"),
minetest.get_content_id("df_primordial_items:glow_orb"),
minetest.get_content_id("df_primordial_items:glow_orb_stalks"),
minetest.get_content_id("df_primordial_items:glow_pods"),
}
local fungal_plant_names = {}
local fungal_plants = {}
for node_name, node_def in pairs(minetest.registered_nodes) do
if minetest.get_item_group(node_name, "primordial_fungal_plant") > 0 then
table.insert(fungal_plant_names, node_name)
table.insert(fungal_plants, minetest.get_content_id(node_name))
end
end
local mushroom_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
local ystride = area.ystride
local humidityfactor = humidity/200 + 0.5
abs_cracks = abs_cracks * humidityfactor
if abs_cracks < 0.7 then
data[vi] = c_mycelial_dirt
elseif abs_cracks < 1 then
data[vi] = c_dirt
end
local rand = math.random() * math.min(abs_cracks, 1) * humidityfactor
if rand < 0.0005 then
local mycelium_index = vi+ystride
data[mycelium_index] = c_giant_mycelium
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
elseif rand < 0.003 then
local schematic = df_primordial_items.get_primordial_mushroom()
local rotation = (math.random(1,4)-1)*90
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), schematic, rotation)
elseif rand < 0.05 then
data[vi+ystride] = fungal_plants[math.random(1,5)]
end
end
local mushroom_cavern_ceiling = function(abs_cracks, humidity, vi, area, data, data_param2)
local ystride = area.ystride
local humidityfactor = humidity/200 + 0.5
abs_cracks = abs_cracks * humidityfactor
if abs_cracks < 0.5 then
data[vi] = c_mycelial_dirt
if abs_cracks < 0.3 then
local rand = math.random() * humidityfactor
if rand < 0.002 then
local mycelium_index = vi-ystride
data[mycelium_index] = c_giant_mycelium
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
elseif rand < 0.03 then
df_primordial_items.spawn_ceiling_spire_vm(vi, area, data)
elseif rand < 0.2 then
data[vi-ystride] = c_orb
data_param2[vi-ystride] = math.random(0,179)
end
end
end
end
local mushroom_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
local ystride = area.ystride
if abs_cracks < 0.3 then
data[vi] = c_mycelial_dirt
if abs_cracks < 0.2 then
local rand = math.random()
if rand < 0.001 then
local mycelium_index = vi-ystride
data[mycelium_index] = c_giant_mycelium
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
elseif rand < 0.2 then
data[vi-ystride] = c_orb
data_param2[vi-ystride] = math.random(0,179)
end
end
end
end
local mushroom_warren_floor = function(abs_cracks, vi, area, data, data_param2)
local ystride = area.ystride
if abs_cracks < 0.7 then
data[vi] = c_mycelial_dirt
elseif abs_cracks < 1 then
data[vi] = c_dirt
end
local rand = math.random() * math.min(abs_cracks, 1)
if rand < 0.001 then
local mycelium_index = vi+ystride
data[mycelium_index] = c_giant_mycelium
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
elseif rand < 0.03 then
data[vi+ystride] = fungal_plants[math.random(1,5)]
end
end
--------------------------------------------------------------------------------------------------
-- Jungle biome
local jungle_plant_names = {}
local jungle_plants = {}
for node_name, node_def in pairs(minetest.registered_nodes) do
if minetest.get_item_group(node_name, "primordial_jungle_plant") > 0 then
table.insert(jungle_plant_names, node_name)
table.insert(jungle_plants, minetest.get_content_id(node_name))
end
end
local c_jungle_dirt = minetest.get_content_id("df_primordial_items:dirt_with_jungle_grass")
local c_plant_matter = minetest.get_content_id("df_primordial_items:plant_matter")
local c_packed_roots = minetest.get_content_id("df_primordial_items:packed_roots")
local c_glowstone = minetest.get_content_id("df_underworld_items:glowstone")
local c_ivy = minetest.get_content_id("df_primordial_items:jungle_ivy")
local c_root_2 = minetest.get_content_id("df_primordial_items:jungle_roots_2")
local c_root_1 = minetest.get_content_id("df_primordial_items:jungle_roots_1")
local c_fireflies
if minetest.get_modpath("fireflies") then
c_fireflies = minetest.get_content_id("fireflies:firefly")
end
local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
local ystride = area.ystride
local humidityfactor = humidity/100
data[vi] = c_jungle_dirt
local rand = math.random()
if rand < 0.025 * humidityfactor then
local fern_schematic = df_primordial_items.get_fern_schematic()
local rotation = (math.random(1,4)-1)*90
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), fern_schematic, rotation)
elseif rand < 0.025 * (1-humidityfactor) then
df_primordial_items.spawn_jungle_mushroom_vm(vi+ystride, area, data)
elseif rand < 0.05 * (1-humidityfactor) then
df_primordial_items.spawn_jungle_tree_vm(math.random(8,14), vi+ystride, area, data)
elseif rand < 0.3 then
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
end
if c_fireflies and math.random() < 0.01 then
local firefly_vi = vi + ystride * math.random(1, 5)
if data[firefly_vi] == c_air then
data[firefly_vi] = c_fireflies
end
end
end
local jungle_cavern_ceiling = function(abs_cracks, vi, area, data, data_param2)
if abs_cracks < 0.25 then
data[vi] = c_glowstone
elseif abs_cracks > 0.75 and math.random() < 0.1 then
local ystride = area.ystride
data[vi] = c_dirt
local index = vi - ystride
local hanging_node
if math.random() < 0.5 then
hanging_node = c_ivy
else
hanging_node = c_root_2
end
for i = 1, math.random(16) do
if data[index] == c_air then
data[index] = hanging_node
index = index - ystride
else
break
end
end
end
end
local jungle_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
if abs_cracks < 0.1 then
data[vi] = c_glowstone
elseif abs_cracks > 0.75 and math.random() < 0.1 then
local ystride = area.ystride
data[vi] = c_dirt
local index = vi - ystride
local hanging_node
if math.random() < 0.5 then
hanging_node = c_root_1
else
hanging_node = c_root_2
end
for i = 1, math.random(8) do
if data[index] == c_air then
data[index] = hanging_node
index = index - ystride
else
break
end
end
end
end
local jungle_warren_floor = function(abs_cracks, vi, area, data, data_param2)
local ystride = area.ystride
if abs_cracks < 0.7 then
data[vi] = c_jungle_dirt
local rand = math.random() * abs_cracks
if rand < 0.1 then
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
end
elseif abs_cracks < 1 then
data[vi] = c_dirt
end
if c_fireflies and math.random() < 0.005 then
local firefly_vi = vi + ystride * math.random(1, 5)
if data[firefly_vi] == c_air then
data[firefly_vi] = c_fireflies
end
end
end
---------------------------------------------------------------------------------------------------------
local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, data)
math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs
local data_param2 = df_caverns.data_param2
vm:get_param2_data(data_param2)
local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks)
local cave_area = node_arrays.cave_area
local nvals_cave = node_arrays.nvals_cave
local humiditymap = minetest.get_mapgen_object("humiditymap")
---------------------------------------------------------
-- Cavern floors
for _, vi in ipairs(node_arrays.cavern_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d]
local abs_cracks = math.abs(cracks)
local humidity = humiditymap[index2d]
local jungle = nvals_cave[vi] < 0
if jungle then
jungle_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2)
else
mushroom_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2)
end
end
--------------------------------------
-- Cavern ceilings
for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d]
local abs_cracks = math.abs(cracks)
local jungle = nvals_cave[vi] < 0
local humidity = humiditymap[index2d]
if jungle then
jungle_cavern_ceiling(abs_cracks, vi, area, data, data_param2)
else
mushroom_cavern_ceiling(abs_cracks, humidity, vi, area, data, data_param2)
end
end
----------------------------------------------
-- Tunnel floors
-- for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
-- end
------------------------------------------------------
-- Tunnel ceiling
-- for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
-- end
------------------------------------------------------
-- Warren ceiling
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d]
local abs_cracks = math.abs(cracks)
local jungle = nvals_cave[vi] < 0
if jungle then
jungle_warren_ceiling(abs_cracks, vi, area, data, data_param2)
else
mushroom_warren_ceiling(abs_cracks, vi, area, data, data_param2)
end
end
----------------------------------------------
-- Warren floors
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d]
local abs_cracks = math.abs(cracks)
local jungle = nvals_cave[vi] < 0
if jungle then
jungle_warren_floor(abs_cracks, vi, area, data, data_param2)
else
mushroom_warren_floor(abs_cracks, vi, area, data, data_param2)
end
end
-- columns
-- no flowstone below the Sunless Sea, replace with something else
local random_dir = {1, -1, area.zstride, -area.zstride}
for _, vi in ipairs(node_arrays.column_nodes) do
local jungle = nvals_cave[vi] < 0
if jungle then
data[vi] = c_plant_matter
minetest.get_node_timer(area:position(vi)):start(math.random(30, 120))
else
data[vi] = c_mycelial_dirt
if math.random() < 0.05 then
local rand_vi = vi + random_dir[math.random(1,4)]
if data[rand_vi] == c_air then
data[rand_vi] = c_giant_mycelium
minetest.get_node_timer(area:position(rand_vi)):start(math.random(1,giant_mycelium_timer_spread))
end
end
end
end
vm:set_param2_data(data_param2)
end
--Primordial Caverns
subterrane.register_layer({
name = "primordial",
y_max = df_caverns.config.primordial_max,
y_min = df_caverns.config.primordial_min,
cave_threshold = df_caverns.config.sunless_sea_threshold, -- Make the caves a bit bigger than above
perlin_cave = perlin_cave_primordial,
perlin_wave = perlin_wave_primordial,
solidify_lava = true,
columns = {
maximum_radius = 20,
minimum_radius = 5,
node = "default:stone", -- no flowstone below the Sunless Sea, replace with something else
weight = 0.5,
maximum_count = 60,
minimum_count = 10,
},
decorate = decorate_primordial,
double_frequency = true,
is_ground_content = df_caverns.is_ground_content,
})
-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there.
minetest.register_abm({
label = "Primordial plant growth",
nodenames = {"df_primordial_items:dirt_with_jungle_grass"},
neighbors = {"air"},
interval = 60.0,
chance = 50,
action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.find_node_near(pos, 2, {"group:primordial_jungle_plant"}) == nil then
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
local node_above = minetest.get_node(pos_above)
if node_above.name == "air" then
minetest.set_node(pos_above, {name = jungle_plant_names[math.random(1,#jungle_plant_names)]})
end
end
end,
})
minetest.register_abm({
label = "Primordial fungus growth",
nodenames = {"df_primordial_items:dirt_with_mycelium"},
neighbors = {"air"},
interval = 60.0,
chance = 50,
action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.find_node_near(pos, 3, {"group:primordial_fungal_plant"}) == nil then
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
local node_above = minetest.get_node(pos_above)
if node_above.name == "air" then
minetest.set_node(pos_above, {name = fungal_plant_names[math.random(1,#fungal_plant_names)]})
end
end
end,
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -38,3 +38,36 @@ dfcaverns_enable_underworld (Generate underworld) bool true
dfcaverns_underworld_level (Underworld level) int -3200 dfcaverns_underworld_level (Underworld level) int -3200
#Set this to 0 to disable glowing pit generation entirely. #Set this to 0 to disable glowing pit generation entirely.
dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8 dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8
[Underworld feature HUD]
dfcaverns_underworld_hud_requires_item (Require an item to view waypoints) bool true
#Players can still discover the locations of volcanoes without this, but waypoints
#will only be visible in their hud if they have this item in their inventory. You can also
#specify "group:groupname" here. Leave it blank to default to map:mapping_kit.
dfcaverns_underworld_hud_item_required (Specify the item or group required) string map:mapping_kit
dfcaverns_show_pits_in_hud (Show pit locations in HUD) bool true
dfcaverns_pit_discovery_range (Pit discovery range) int 60
dfcaverns_pit_visibility_range (Pit visibility range) int 500
dfcaverns_show_seals_in_hud (Seal locations in HUD) bool true
dfcaverns_seal_discovery_range (Seal discovery range) int 10
dfcaverns_seal_visibility_range (Seal visibility range) int 200
dfcaverns_show_ruins_in_hud (Ruin locations visible in HUD) bool true
dfcaverns_ruin_discovery_range (Ruin discovery range) int 40
dfcaverns_ruin_visibility_range (Ruin visibility range) int 250
[Primordial]
dfcaverns_enable_primordial (Generate primordial caverns) bool true
dfcaverns_primordial_max (Upper limit of primordial caverns) int -3393
dfcaverns_primordial_min (Lower limit of primordial caverns) int -4032
# This setting is pretty technical, it spreads out the
# construction of giant mycelium networks on mapgen
# over this many seconds. If you're experiencing lag spikes
# during mapgen of Primordial cavern layer mushroom caverns
# then increasing this number may help.
dcaverns_giant_mycelium_timer_spread (Giant Mycelium mapgen timer spread) int 10

View File

@ -124,6 +124,9 @@ local content_in_list=function(content, list)
end end
df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet) df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet)
if maxp.y > -30 then
wet = false
end
local ystride = area.ystride local ystride = area.ystride
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d] local cracks = nvals_cracks[index2d]
@ -148,6 +151,10 @@ df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, dat
end end
df_caverns.tunnel_ceiling = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet) df_caverns.tunnel_ceiling = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet)
if maxp.y > -30 then
wet = false
end
local ystride = area.ystride local ystride = area.ystride
local index2d = mapgen_helper.index2di(minp, maxp, area, vi) local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
local cracks = nvals_cracks[index2d] local cracks = nvals_cracks[index2d]
@ -208,3 +215,36 @@ df_caverns.place_shrub = function(vi, area, data, param2_data, shrub_list)
local shrub = shrub_list[math.random(#shrub_list)] local shrub = shrub_list[math.random(#shrub_list)]
shrub(vi, area, data, param2_data) shrub(vi, area, data, param2_data)
end end
---------------------------------------------------------------------------------
-- This method allows subterrane to overgenerate caves without destroying any of the decorations
local dfcaverns_nodes = nil
local dfcaverns_mods = {
"df_farming:",
"df_mapitems:",
"df_primordial_items:",
"df_trees:",
"df_underworld_items:",
"ice_sprites:",
"mine_gas:",
}
df_caverns.is_ground_content = function(c_node)
if dfcaverns_nodes then
return not dfcaverns_nodes[c_node]
end
dfcaverns_nodes = {}
for k, v in pairs(minetest.registered_nodes) do
for _, prefix in ipairs(dfcaverns_mods) do
if k:sub(1, #prefix) == prefix then
dfcaverns_nodes[minetest.get_content_id(k)] = true
end
end
end
dfcaverns_nodes[minetest.get_content_id("default:ice")] = true -- needed for nethercap cavern water covering
dfcaverns_nodes[minetest.get_content_id("oil:oil_source")] = true -- needed for blackcap oil slicks
if minetest.get_modpath("fireflies") then
dfcaverns_nodes[minetest.get_content_id("fireflies:firefly")] = true -- used in the primordial caverns
end
dfcaverns_mods = nil
return not dfcaverns_nodes[c_node]
end

View File

@ -107,7 +107,9 @@ local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, da
if math.random() < 0.01 then if math.random() < 0.01 then
df_trees.spawn_tower_cap_vm(vi+ystride, area, data) df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
elseif math.random() < 0.01 then elseif math.random() < 0.01 then
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data) df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2)
elseif math.random() < 0.02 then
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
end end
end end
end end
@ -129,7 +131,7 @@ local fungispore_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
if math.random() < 0.025 then if math.random() < 0.025 then
df_trees.spawn_fungiwood_vm(vi+ystride, area, data) df_trees.spawn_fungiwood_vm(vi+ystride, area, data)
elseif math.random() < 0.025 then elseif math.random() < 0.025 then
df_trees.spawn_spore_tree_vm(vi+ystride, area, data) df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2)
end end
end end
end end
@ -221,12 +223,17 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d
data[vi] = c_obsidian data[vi] = c_obsidian
end end
end end
else
skip_next = false
end
end
if minp.y <= sea_level then
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
-- convert all air below sea level into water -- convert all air below sea level into water
if y <= sea_level and data[vi] == c_air then if y <= sea_level and data[vi] == c_air then
data[vi] = c_water data[vi] = c_water
end end
else
skip_next = false
end end
end end
@ -274,7 +281,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d
if math.random() < 0.001 then if math.random() < 0.001 then
local iterations = math.random(1, 6) local iterations = math.random(1, 6)
df_mapitems.spawn_coral_pile(area, data, vi, iterations) df_mapitems.spawn_coral_pile(area, data, vi, iterations)
df_mapitems.spawn_cave_coral(area, data, vi+area.ystride, iterations) df_mapitems.spawn_castle_coral(area, data, vi+area.ystride, iterations)
end end
end end
end end
@ -372,6 +379,8 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d
end end
else else
data[vi] = c_coral_table[math.random(1,3)] data[vi] = c_coral_table[math.random(1,3)]
data_param2[vi] = math.random(1,4)-1
minetest.get_node_timer(area:position(vi)):start(math.random(10, 60))
end end
end end
end end
@ -398,4 +407,5 @@ subterrane.register_layer({
}, },
decorate = decorate_sunless_sea, decorate = decorate_sunless_sea,
double_frequency = false, double_frequency = false,
is_ground_content = df_caverns.is_ground_content,
}) })

View File

@ -1,8 +1,11 @@
-- surface tunnels -- surface tunnels
local y_max = -10 local y_max = 200
local y_min = df_caverns.config.ymax local y_min = df_caverns.config.ymax
local c_stone = minetest.get_content_id("default:stone")
local c_air = minetest.get_content_id("air")
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp, seed)
--if out of range of cave definition limits, abort --if out of range of cave definition limits, abort
if minp.y > y_max or maxp.y < y_min then if minp.y > y_max or maxp.y < y_min then
@ -12,36 +15,55 @@ minetest.register_on_generated(function(minp, maxp, seed)
local t_start = os.clock() local t_start = os.clock()
local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2()
local eminp = {x=minp.x, y=area.MinEdge.y, z=minp.z}
local emaxp = {x=maxp.x, y=area.MaxEdge.y, z=maxp.z}
local minp_y = minp.y
local maxp_y = maxp.y
local humiditymap = minetest.get_mapgen_object("humiditymap") local humiditymap = minetest.get_mapgen_object("humiditymap")
local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks)
local previous_state = "outside_region" local previous_y = eminp.y-1
local previous_y = minp.y
for vi, x, y, z in area:iterp_yxz(minp, maxp) do local previous_potential_floor_vi
local previous_potential_floor_y
local previous_node
for vi, x, y, z in area:iterp_yxz(eminp, emaxp) do
if y < previous_y then if y < previous_y then
previous_state = "outside_region" -- we've started a new column, initialize everything
previous_potential_floor_vi = nil
previous_potential_floor_y = nil
previous_node = nil
end end
previous_y = y previous_y = y
if y < y_max then local current_node = data[vi]
if mapgen_helper.buildable_to(data[vi]) then if previous_node and y < y_max then
if previous_state == "in_rock" and not mapgen_helper.buildable_to(data[vi-area.ystride]) then if current_node == c_air and previous_node == c_stone then
-- this may be a floor, but only if we eventually hit a ceiling in this column
previous_potential_floor_vi = vi-area.ystride
previous_potential_floor_y = y-1
elseif current_node == c_stone and previous_node == c_air and previous_potential_floor_vi then
-- we hit a ceiling after passing through a floor
local index2d = mapgen_helper.index2d(minp, maxp, x, z) local index2d = mapgen_helper.index2d(minp, maxp, x, z)
local humidity = humiditymap[index2d] local humidity = humiditymap[index2d]
df_caverns.tunnel_floor(minp, maxp, area, vi-area.ystride, nvals_cracks, data, data_param2, humidity > 30) if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then
df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30)
end end
previous_state = "in_tunnel" if y <= maxp_y and y >= minp_y then
else
if previous_state == "in_tunnel" and not mapgen_helper.buildable_to(data[vi]) then
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
local humidity = humiditymap[index2d]
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30) df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30)
end end
previous_state = "in_rock" previous_potential_floor_vi = nil
elseif not mapgen_helper.buildable_to(current_node) then
-- we've entered a non-stone ceiling of some kind. Abort potential floor-ceiling pair detection.
previous_potential_floor_vi = nil
end end
end end
previous_node = current_node
end end
--send data back to voxelmanip --send data back to voxelmanip
@ -55,12 +77,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
--write it to world --write it to world
vm:write_to_map() vm:write_to_map()
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
if chunk_generation_time < 1000 then mapgen_helper.record_time("df_caverns surface tunnels", time_taken)
minetest.log("info", "[df_caverns surface tunnels] "..chunk_generation_time.." ms") --tell people how long
else
minetest.log("warning", "[df_caverns surface tunnels] took "..chunk_generation_time.." ms to generate map block "
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
end
end) end)

View File

@ -1,8 +1,82 @@
if not df_caverns.config.enable_underworld then if not df_caverns.config.enable_underworld or not minetest.get_modpath("df_underworld_items") then
return return
end end
local modpath = minetest.get_modpath(minetest.get_current_modname())
local S = minetest.get_translator("df_caverns")
local bones_loot_path = minetest.get_modpath("bones_loot")
local named_waypoints_path = minetest.get_modpath("named_waypoints")
local namegen_path = minetest.get_modpath("namegen")
local name_pit = function() end
local name_ruin = function() end
if named_waypoints_path then
local item_required = nil
if minetest.settings:get_bool("dfcaverns_underworld_hud_requires_item", true) then
local setting_item_required = minetest.settings:get("dfcaverns_underworld_hud_item_required")
if setting_item_required == nil or setting_item_required == "" then
setting_item_required = "map:mapping_kit"
end
item_required = setting_item_required
end
local pit_waypoint_def = {
default_name = S("A glowing pit"),
default_color = 0xFF88FF,
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_discovery_range")) or 60,
visibility_requires_item = item_required,
}
if minetest.settings:get_bool("dfcaverns_show_pits_in_hud", true) then
pit_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_visibility_range")) or 500
pit_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
end
named_waypoints.register_named_waypoints("glowing_pits", pit_waypoint_def)
local seal_waypoint_def = {
default_name = S("Mysterious seal"),
default_color = 0x9C2233,
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_discovery_range")) or 10,
visibility_requires_item = item_required,
}
if minetest.settings:get_bool("dfcaverns_show_seals_in_hud", true) then
seal_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_visibility_range")) or 200
seal_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
end
named_waypoints.register_named_waypoints("puzzle_seals", seal_waypoint_def)
if namegen_path then
namegen.parse_lines(io.lines(modpath.."/underworld_names.cfg"))
name_pit = function()
return namegen.generate("glowing_pits")
end
name_ruin = function()
return namegen.generate("underworld_ruins")
end
local underworld_ruin_def = {
default_name = S("Ancient ruin"),
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_discovery_range")) or 40,
visibility_requires_item = item_required,
}
if minetest.settings:get_bool("dfcaverns_show_ruins_in_hud", true) then
underworld_ruin_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_visibility_range")) or 250
underworld_ruin_def.on_discovery = named_waypoints.default_discovery_popup
end
named_waypoints.register_named_waypoints("underworld_ruins", underworld_ruin_def)
end
end
local c_slade = minetest.get_content_id("df_underworld_items:slade") local c_slade = minetest.get_content_id("df_underworld_items:slade")
local c_slade_block = minetest.get_content_id("df_underworld_items:slade_block")
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_water = minetest.get_content_id("default:water_source") local c_water = minetest.get_content_id("default:water_source")
@ -56,6 +130,11 @@ local wave_mult = 50
local y_max = median + 2*wave_mult + ceiling_displace + -2*ceiling_mult local y_max = median + 2*wave_mult + ceiling_displace + -2*ceiling_mult
local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult
--df_caverns.config.underworld_min = y_min
--local poisson = mapgen_helper.get_poisson_points({x=-32000, z=-32000}, {x=32000, z=32000}, 1000)
--minetest.debug(dump(poisson.objects))
--------------------------------------------------------- ---------------------------------------------------------
-- Buildings -- Buildings
@ -63,8 +142,11 @@ local oubliette_threshold = 0.8
local town_threshold = 1.1 local town_threshold = 1.1
local local_random = function(x, z) local local_random = function(x, z)
local next_seed = math.floor(math.random()*2^21)
math.randomseed(x + z*2^16) math.randomseed(x + z*2^16)
return math.random() local ret = math.random()
math.randomseed(next_seed)
return ret
end end
-- create a deterministic list of buildings -- create a deterministic list of buildings
@ -192,9 +274,9 @@ local pit_region_size = region_mapblocks * mapgen_chunksize * 16
local scatter_2d = function(min_xz, gridscale, border_width) local scatter_2d = function(min_xz, gridscale, border_width)
local bordered_scale = gridscale - 2 * border_width local bordered_scale = gridscale - 2 * border_width
local point = {} local point = {}
point.x = math.random() * bordered_scale + min_xz.x + border_width point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width)
point.y = 0 point.y = 0
point.z = math.random() * bordered_scale + min_xz.z + border_width point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width)
return point return point
end end
@ -203,13 +285,13 @@ local get_corner = function(pos)
return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32} return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32}
end end
local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^21
local get_pit = function(pos) local get_pit = function(pos)
if region_mapblocks < 1 then return nil end if region_mapblocks < 1 then return nil end
local corner_xz = get_corner(pos) local corner_xz = get_corner(pos)
local next_seed = math.floor(math.random() * 2^31) local next_seed = math.floor(math.random() * 2^21)
math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed) math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed)
local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance) local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance)
local variance_multiplier = math.random() local variance_multiplier = math.random()
@ -231,6 +313,18 @@ local perlin_pit = {
------------------------------------- -------------------------------------
minetest.register_chatcommand("find_pit", {
params = "",
privs = {server=true},
decription = "find a nearby glowing pit",
func = function(name, param)
local player = minetest.get_player_by_name(name)
local pit = get_pit(player:get_pos())
if pit then
minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z))
end
end,
})
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp, seed)
@ -264,8 +358,16 @@ minetest.register_on_generated(function(minp, maxp, seed)
local wave = nvals_wave[index2d] * wave_mult local wave = nvals_wave[index2d] * wave_mult
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave) local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
if named_waypoints_path and floor_height == y and pit and pit.location.x == x and pit.location.z == z then
named_waypoints.add_waypoint("glowing_pits", {x=x, y=y, z=z}, {name=name_pit()})
end
local underside_height = math.floor(y_min + math.abs(wave) / 5)+2 -- divide wave by five to smooth out the underside of the slade, we only want the interface to ripple a little down here
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
if y <= floor_height then if (y == underside_height or y == underside_height - 1) and (x % 8 == 0 or z % 8 == 0) then
data[vi] = c_air
elseif y < floor_height and y > underside_height then
data[vi] = c_slade data[vi] = c_slade
if pit and if pit and
pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and
@ -275,15 +377,13 @@ minetest.register_on_generated(function(minp, maxp, seed)
then then
-- there's a pit nearby -- there's a pit nearby
if pit_uninitialized then if pit_uninitialized then
nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) -- determine which areas are spongey with warrens nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit)
pit_uninitialized = false pit_uninitialized = false
end end
local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance
local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value
if distance < pit.radius -3 then if distance < pit.radius -2.5 then
if y < y_min + 4 then -- make a layer of amethyst at the bottom of the pit to keep the plasma from digging infinitely downward. if y < median + floor_displace + wave - pit.depth or y < underside_height + plasma_depth_min then
data[vi] = c_amethyst
elseif y < median + floor_displace + wave - pit.depth then
data[vi] = c_pit_plasma data[vi] = c_pit_plasma
else else
data[vi] = c_air data[vi] = c_air
@ -296,7 +396,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
end end
end end
elseif y < ceiling_height and data[vi] ~= c_amethyst then elseif y >= floor_height and y < ceiling_height and data[vi] ~= c_amethyst then
data[vi] = c_air data[vi] = c_air
elseif data[vi] == c_water then elseif data[vi] == c_water then
data[vi] = c_air -- no water down here data[vi] = c_air -- no water down here
@ -365,6 +465,11 @@ minetest.register_on_generated(function(minp, maxp, seed)
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation) mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation)
elseif building.building_type == "medium building" then elseif building.building_type == "medium building" then
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation) mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation)
if named_waypoints_path and namegen_path then
if not next(named_waypoints.get_waypoints_in_area("underworld_ruins", vector.subtract(building.pos, 250), vector.add(building.pos, 250))) then
named_waypoints.add_waypoint("underworld_ruins", {x=building.pos.x, y=floor_height+1, z=building.pos.z}, {name=name_ruin()})
end
end
elseif building.building_type == "small slab" then elseif building.building_type == "small slab" then
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation) mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation)
else else
@ -376,6 +481,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
end end
-- puzzle seal
local puzzle_seal = nil
if pit_uninitialized and math.random() < 0.05 then
local index2d = mapgen_helper.index2d(emin, emax, minp.x + 3, minp.z + 3)
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
local wave = nvals_wave[index2d] * wave_mult
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
local underside_height = math.floor(y_min + math.abs(wave) / 5)
if floor_height < maxp.y and floor_height > minp.y then
for plat_vi in area:iter(minp.x, floor_height-6, minp.z, minp.x+6, floor_height, minp.z+6) do
data[plat_vi] = c_slade_block
end
puzzle_seal = {x=minp.x+3, y=floor_height+1, z=minp.z+3}
minetest.log("info", "Puzzle seal generated at " .. minetest.pos_to_string(puzzle_seal))
end
end
--send data back to voxelmanip --send data back to voxelmanip
vm:set_data(data) vm:set_data(data)
vm:set_param2_data(data_param2) vm:set_param2_data(data_param2)
@ -386,11 +510,51 @@ minetest.register_on_generated(function(minp, maxp, seed)
--write it to world --write it to world
vm:write_to_map() vm:write_to_map()
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took if puzzle_seal ~= nil then
if chunk_generation_time < 1000 then if named_waypoints_path then
minetest.log("info", "[df_caverns] underworld mapblock generation took "..chunk_generation_time.." ms") --tell people how long named_waypoints.add_waypoint("puzzle_seals", puzzle_seal)
else
minetest.log("warning", "[df_caverns] underworld took "..chunk_generation_time.." ms to generate map block "
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
end end
minetest.place_schematic({x=puzzle_seal.x-3, y=puzzle_seal.y, z=puzzle_seal.z-3}, df_underworld_items.seal_temple_schem, 0, {}, true)
local node_name = minetest.get_node(puzzle_seal).name
local node_def = minetest.registered_nodes[node_name]
node_def.on_construct(puzzle_seal)
end
if bones_loot_path then
for i = 1, 30 do
local x = math.random(minp.x, maxp.x)
local z = math.random(minp.z, maxp.z)
local index2d = mapgen_helper.index2d(emin, emax, x, z)
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
local wave = nvals_wave[index2d] * wave_mult
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)-1
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
if floor_height < ceiling_height then
local zone = math.abs(nvals_zone[index2d])
if math.random() < zone then -- bones are more common in the built-up areas
local floor_node = minetest.get_node({x=x, y=floor_height, z=z})
local floor_node_def = minetest.registered_nodes[floor_node.name]
if floor_node_def and not floor_node_def.buildable_to then
local y = floor_height + 1
while y < ceiling_height do
local target_pos = {x=x, y=y, z=z}
local target_node = minetest.get_node(target_pos)
if target_node.name == "air" then
bones_loot.place_bones(target_pos, "underworld_warrior", math.random(3, 10), nil, true)
break
elseif target_node.name == "bones:bones" then
-- don't stack bones on bones, it looks silly
break
end
y = y + 1
end
end
end
end
end
end
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
mapgen_helper.record_time("df_caverns underworld", time_taken)
end) end)

View File

@ -0,0 +1,18 @@
name "glowing_pits" {
customGroupA = "Actinic, Amethyst, Angry, Atrocious, Bad, Blighted, Baneful, Baleful, Beastly, Calamitous, Corrupt, Crazed, Damnable, Demoniacal, Demonic, Depraved, Destructive, Devilish, Diabolical, Disastrous, Execrable, Fiendish, Foul, Frenzied, Glaring, Harmful, Hateful, Heinous, Hellish, Hideous, Infernal, Iniquitous, Injurious, Loathsome, Lost, Maleficent, Malevolent, Malicious, Malignant, Manic, Nefarious, Nightmare, Obscene, Offensive, Pernicious, Poison, Possessed, Rancorous, Repugnant, Repulsive, Revolting, Spiteful, Unhallowed, Unpleasant, Vicious, Vile, Villainous, Violent, Wicked, Wrathful"
customGroupB = "Abyss, Aperture, Breach, Cavity, Chasm, Crevasse, Depth, Deep, Fissure, Funnel, Gate, Gulf, Hell, Hole, Hollow, Inferno, Maw, Mouth, Opening, Pit, Portal, Puncture, Ravager, Rent, Rift, Rim, Schism, Shaft, Split, Throat, Void, Well"
customGroupC = "Adversity, Affliction, Annihilation, Bale, Bane, Blight, Calamity, Cataclysm, Catastrophe, Collapse, Conclusion, Condemnation, Death, Defeat, Destiny, Destruction, Disaster, Doom, Downfall, Failure, Grief, Harm, Hazard, Judgment, Karma, Misadventure, Mischance, Misfortune, Mishap, Ruin, Ruination, Tragedy, Undoing, Verdict, Woe"
rules = "%50The_$A_$B, The_$B_of_$C, %10The_$A_$B_of_$C"
}
name "underworld_ruins" {
customGroupA = "Abandoned, Absent, Adrift, Alien, Anonymous, Bare, Barren, Blank, Buried, Clandestine, Cloaked, Concealed, Covered, Cryptic, Dark, Dead, Depleted, Deserted, Desolate, Despoiled, Destitute, Devoid, Disappeared, Distant, Exhausted, Empty, Forfeit, Forfeited, Forsaken, Hidden, Incognito, Indiscernible, Invisible, Irretrievable, Irrevocable, Masked, Mislaid, Misplaced, Mystic, Mystical, Nameless, Obscured, Secluded, Secret, Sequestered, Shadowy, Shrouded, Stark, Strange, Uncelebrated, Uncharted, Undiscovered, Unexplained, Unexplored, Unfamiliar, Unfilled, Unidentified, Unknown, Unnamed, Unredeemed, Unsung, Untold, Vacant, Vacated, Vanished, Veiled, Wayward, Warrior's, King's, Knave's, Coward's, Cardinal's, Priest's, Soldier's, Noble, Steadfast, Children's, Howling, Silent, Grinding, Dusty"
customGroupB = "Temple, Chapel, House, Sanctuary, Shrine, Fortress, Tomb, Crypt, Graves, Citadel, Garrison, Rampart, Redoubt, Refuge, Asylum, Haven, Hideout, Retreat, Shelter, Stronghold, Covert, Den, Settlement, Preserve, Seat, Watch, Bulwark, Necropolis, Catacomb, Ruin, Hulk, Wreck"
rules = "The_$A_$B"
}

View File

@ -17,10 +17,17 @@ local register_cave_wheat = function(number)
inventory_image = "dfcaverns_cave_wheat_"..tostring(number)..".png", inventory_image = "dfcaverns_cave_wheat_"..tostring(number)..".png",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
buildable_to = true, buildable_to = true,
floodable = true, floodable = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16},
},
},
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
df_farming.grow_underground_plant(pos, name, elapsed) df_farming.grow_underground_plant(pos, name, elapsed)
@ -96,19 +103,23 @@ minetest.register_craft({
burntime = 2 burntime = 2
}) })
-------------
--- Flour and bread
minetest.register_craftitem("df_farming:cave_flour", { minetest.register_craftitem("df_farming:cave_flour", {
description = S("Cave Wheat Flour"), description = S("Cave Wheat Flour"),
_doc_items_longdesc = df_farming.doc.cave_flour_desc, _doc_items_longdesc = df_farming.doc.cave_flour_desc,
_doc_items_usagehelp = df_farming.doc.cave_flour_usage, _doc_items_usagehelp = df_farming.doc.cave_flour_usage,
inventory_image = "dfcaverns_flour.png", inventory_image = "dfcaverns_flour.png",
groups = {flammable = 1, dfcaverns_cookable = 1}, groups = {flammable = 1, dfcaverns_cookable = 1, food_flour = 1},
}) })
minetest.register_craftitem("df_farming:cave_bread", { minetest.register_craftitem("df_farming:cave_bread", {
description = S("Dwarven Bread"), description = S("Dwarven Bread"),
_doc_items_longdesc = df_farming.doc.cave_bread_desc, _doc_items_longdesc = df_farming.doc.cave_bread_desc,
_doc_items_usagehelp = df_farming.doc.cave_bread_usage, _doc_items_usagehelp = df_farming.doc.cave_bread_usage,
inventory_image = "dfcaverns_bread.png", inventory_image = "dfcaverns_prepared_food13x16.png",
sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}},
on_use = minetest.item_eat(5), on_use = minetest.item_eat(5),
groups = {flammable = 2, food = 5}, groups = {flammable = 2, food = 5},
}) })
@ -146,3 +157,72 @@ minetest.register_craft({
output = "df_farming:cave_bread", output = "df_farming:cave_bread",
recipe = "df_farming:cave_flour" recipe = "df_farming:cave_flour"
}) })
--------
-- Straw
minetest.register_node("df_farming:cave_straw", {
description = S("Cave Straw"),
tiles = {"dfcaverns_cave_straw.png"},
is_ground_content = false,
groups = {snappy=3, flammable=4, fall_damage_add_percent=-30, straw=1},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_craft({
output = "df_farming:cave_straw 3",
recipe = {
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
{"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"},
}
})
minetest.register_craft({
output = "df_farming:cave_wheat 3",
recipe = {
{"df_farming:cave_straw"},
}
})
---------
-- Trample support
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
minetest.register_node("df_farming:wheat_trampled", {
description = S("Flattened Cave Wheat"),
tiles = {"dfcaverns_cave_wheat_flattened.png"},
inventory_image = "dfcaverns_cave_wheat_flattened.png",
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
buildable_to = true,
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5}
},
},
groups = {snappy = 3, flammable = 2, attached_node = 1},
drop = "",
sounds = default.node_sound_leaves_defaults(),
})
trail.register_trample_node("df_farming:cave_wheat_5", {
trampled_node_name = "df_farming:wheat_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:cave_wheat_6", {
trampled_node_name = "df_farming:wheat_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:cave_wheat_7", {
trampled_node_name = "df_farming:wheat_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:cave_wheat_8", {
trampled_node_name = "df_farming:wheat_trampled",
randomize_trampled_param2 = true,
})
end

View File

@ -7,11 +7,11 @@ local print_settingtypes = false
local function setting(stype, name, default, description) local function setting(stype, name, default, description)
local value local value
if stype == "bool" then if stype == "bool" then
value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name) value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
elseif stype == "string" then elseif stype == "string" then
value = minetest.setting_get(CONFIG_FILE_PREFIX..name) value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
elseif stype == "int" or stype == "float" then elseif stype == "int" or stype == "float" then
value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name)) value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name))
end end
if value == nil then if value == nil then
value = default value = default
@ -34,7 +34,7 @@ local plants = {
--Plants --Plants
setting("int", "plant_growth_time", 500, "Base plant growth time") setting("int", "plant_growth_time", 3600, "Base plant growth time") -- 60 minutes
for _, plant in pairs(plants) do for _, plant in pairs(plants) do
setting("float", plant.name.."_delay_multiplier", plant.delay_multiplier, plant.name.." growth delay multiplier") setting("float", plant.name.."_delay_multiplier", plant.delay_multiplier, plant.name.." growth delay multiplier")

View File

@ -2,97 +2,136 @@
local MP = minetest.get_modpath(minetest.get_current_modname()) local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua") local S, NS = dofile(MP.."/intllib.lua")
local register_cooking_recipes = function(prefix, item, name, returns) local register_cooking_recipes = function(def)
minetest.register_craftitem("df_farming:"..item.."_biscuit", { local prefix = def.prefix
description = S("@1 Biscuit", name), local item = def.item
_doc_items_longdesc = df_farming.doc.biscuit_desc, local replacements = def.replacements
_doc_items_usagehelp = df_farming.doc.biscuit_usage, minetest.register_craftitem("df_farming:"..item.."_simple_meal", {
inventory_image = "dfcaverns_biscuit.png", description = def.simple.name,
_doc_items_longdesc = df_farming.doc.simple_meal_desc,
_doc_items_usagehelp = df_farming.doc.simple_meal_usage,
inventory_image = def.simple.image,
sound = def.simple.sound,
on_use = minetest.item_eat(4), on_use = minetest.item_eat(4),
groups = {food = 4}, groups = {food = 4},
}) })
minetest.register_craftitem("df_farming:"..item.."_stew", { minetest.register_craftitem("df_farming:"..item.."_medium_meal", {
description = S("@1 Stew", name), description = def.medium.name,
_doc_items_longdesc = df_farming.doc.stew_desc, _doc_items_longdesc = df_farming.doc.medium_meal_desc,
_doc_items_usagehelp = df_farming.doc.stew_usage, _doc_items_usagehelp = df_farming.doc.medium_meal_usage,
inventory_image = "dfcaverns_stew.png", inventory_image = def.medium.image,
sound = def.medium.sound,
on_use = minetest.item_eat(6), on_use = minetest.item_eat(6),
groups = {food = 6}, groups = {food = 6},
}) })
minetest.register_craftitem("df_farming:"..item.."_roast", { minetest.register_craftitem("df_farming:"..item.."_complex_meal", {
description = S("@1 Roast", name), description = def.complex.name,
_doc_items_longdesc = df_farming.doc.roast_desc, _doc_items_longdesc = df_farming.doc.complex_meal_desc,
_doc_items_usagehelp = df_farming.doc.roast_usage, _doc_items_usagehelp = df_farming.doc.complex_meal_usage,
inventory_image = "dfcaverns_roast.png", inventory_image = def.complex.image,
sound = def.complex.sound,
on_use = minetest.item_eat(8), on_use = minetest.item_eat(8),
groups = {food = 8}, groups = {food = 8},
}) })
minetest.register_alias("dfcaverns:"..item.."_biscuit", "df_farming:"..item.."_biscuit") minetest.register_alias("dfcaverns:"..item.."_biscuit", "df_farming:"..item.."_simple_meal")
minetest.register_alias("dfcaverns:"..item.."_stew", "df_farming:"..item.."_stew") minetest.register_alias("dfcaverns:"..item.."_stew", "df_farming:"..item.."_medium_meal")
minetest.register_alias("dfcaverns:"..item.."_roast", "df_farming:"..item.."_roast") minetest.register_alias("dfcaverns:"..item.."_roast", "df_farming:"..item.."_complex_meal")
minetest.register_alias("df_farming:"..item.."_biscuit", "df_farming:"..item.."_simple_meal")
minetest.register_alias("df_farming:"..item.."_stew", "df_farming:"..item.."_medium_meal")
minetest.register_alias("df_farming:"..item.."_roast", "df_farming:"..item.."_complex_meal")
if minetest.get_modpath("simplecrafting_lib") then
simplecrafting_lib.register("cooking", {
input = {
["group:dfcaverns_cookable"] = 1,
[prefix..":"..item] = 1,
},
output = {
["df_farming:"..item.."_biscuit"] = 1,
},
cooktime = 5.0,
})
simplecrafting_lib.register("cooking", {
input = {
["group:dfcaverns_cookable"] = 2,
[prefix..":"..item] = 1,
},
output = {
["df_farming:"..item.."_stew"] = 1,
},
cooktime = 10.0,
})
simplecrafting_lib.register("cooking", {
input = {
["group:dfcaverns_cookable"] = 3,
[prefix..":"..item] = 1,
},
output = {
["df_farming:"..item.."_roast"] = 1,
},
cooktime = 15.0,
})
else
minetest.register_craft({ minetest.register_craft({
type = "shapeless", type = "shapeless",
output = "df_farming:"..item.."_biscuit", output = "df_farming:"..item.."_simple_meal",
recipe = {"group:dfcaverns_cookable", prefix..":"..item}, recipe = {"group:dfcaverns_cookable", prefix..":"..item},
replacements = returns replacements = replacements
}) })
minetest.register_craft({ minetest.register_craft({
type = "shapeless", type = "shapeless",
output = "df_farming:"..item.."_stew", output = "df_farming:"..item.."_medium_meal",
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item}, recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
replacements = returns replacements = replacements
}) })
minetest.register_craft({ minetest.register_craft({
type = "shapeless", type = "shapeless",
output = "df_farming:"..item.."_roast", output = "df_farming:"..item.."_complex_meal",
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item}, recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
replacements = returns replacements = replacements
}) })
end
end end
register_cooking_recipes("df_farming", "cave_flour", S("Cave Wheat Flour"))
register_cooking_recipes("df_farming", "cave_wheat_seed", S("Cave Wheat Seed")) --{
register_cooking_recipes("df_farming", "sweet_pod_seed", S("Sweet Pod Spore")) -- prefix =,
register_cooking_recipes("df_farming", "sugar", S("Sweet Pod Sugar")) -- item =,
register_cooking_recipes("group", "plump_helmet", S("Plump Helmet")) -- replacements =,
register_cooking_recipes("df_farming", "plump_helmet_spawn", S("Plump Helmet Spawn")) -- simple = {name = , image = , sound = },
register_cooking_recipes("df_farming", "quarry_bush_leaves", S("Quarry Bush Leaf")) -- medium = {name = , image = , sound = },
register_cooking_recipes("df_farming", "quarry_bush_seed", S("Rock Nut")) -- complex = {name = , image = , sound = },
register_cooking_recipes("df_farming", "dimple_cup_seed", S("Dimple Cup Spore")) --}
register_cooking_recipes("df_farming", "pig_tail_seed", S("Pig Tail Spore"))
register_cooking_recipes("df_farming", "dwarven_syrup_bucket", S("Dwarven Syrup"), {{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}}) local chomp = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}
local crisp = {eat = {name = "df_farming_crisp_chew", gain = 1.0}}
local gummy = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}
local mushy = {eat = {name = "df_farming_mushy_chew", gain = 1.0}}
local soft = {eat = {name = "df_farming_soft_chew", gain = 1.0}}
register_cooking_recipes({prefix="df_farming", item="cave_flour",
simple = {name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp},
medium = {name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy},
complex = {name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy},
})
register_cooking_recipes({prefix="df_farming", item="cave_wheat_seed",
simple = {name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp},
medium = {name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft},
complex = {name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy},
})
register_cooking_recipes({prefix="df_farming", item="sweet_pod_seed",
simple = {name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy},
medium = {name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy},
complex = {name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft},
})
register_cooking_recipes({prefix="df_farming", item="sugar",
simple = {name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp},
medium = {name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp},
complex = {name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp},
})
register_cooking_recipes({prefix="group", item="plump_helmet",
simple = {name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy},
medium = {name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy},
complex = {name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy},
})
register_cooking_recipes({prefix="df_farming", item="plump_helmet_spawn",
simple = {name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy},
medium = {name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft},
complex = {name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy},
})
register_cooking_recipes({prefix="df_farming", item="quarry_bush_leaves",
simple = {name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft},
medium = {name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft},
complex = {name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp},
})
register_cooking_recipes({prefix="df_farming", item="quarry_bush_seed",
simple = {name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft},
medium = {name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp},
complex = {name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft},
})
register_cooking_recipes({prefix="df_farming", item="dimple_cup_seed",
simple = {name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp},
medium = {name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp},
complex = {name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft},
})
register_cooking_recipes({prefix="df_farming", item="pig_tail_seed",
simple = {name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft},
medium = {name=S("Pig Tail Spore Tofu"), image="dfcaverns_prepared_food30x16.png", sound = gummy},
complex = {name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy},
})
register_cooking_recipes({prefix="df_farming", item="dwarven_syrup_bucket", replacements={{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}},
simple = {name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy},
medium = {name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy},
complex = {name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy},
})
-- dfcaverns_prepared_food28 is currently unused
-- dfcaverns_prepared_food13 is used for dwarven bread

View File

@ -1,9 +0,0 @@
default
farming?
cottages?
bucket?
dynamic_liquid?
wool?
intllib?
doc?
simplecrafting_lib?

View File

@ -1 +0,0 @@
Adds farmable underground plants that die in sunlight. Also includes various cooking reactions.

View File

@ -16,9 +16,16 @@ local register_dimple_cup = function(number)
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
floodable = true, floodable = true,
is_ground_content = false,
buildable_to = true, buildable_to = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, color_blue = 1, light_sensitive_fungus = 11, flower = 1}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, color_blue = 1, light_sensitive_fungus = 11, flower = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -8/16 + 4*number/16, 8/16},
},
},
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
df_farming.grow_underground_plant(pos, name, elapsed) df_farming.grow_underground_plant(pos, name, elapsed)

View File

@ -8,12 +8,12 @@ end
local MP = minetest.get_modpath(minetest.get_current_modname()) local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua") local S, NS = dofile(MP.."/intllib.lua")
df_farming.doc.biscuit_desc = S("A meal made from the admixture of two ingredients, biscuits keep well but are not a rich source of nutrients.") df_farming.doc.simple_meal_desc = S("A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.")
df_farming.doc.biscuit_usage = nil df_farming.doc.simple_meal_usage = nil
df_farming.doc.stew_desc = S("Stews mix three ingredients together. They're more wholesome than biscuits, packing more nutrition into a single serving.") df_farming.doc.medium_meal_desc = S("A meal made from three ingredients mixed together. They're more wholesome, packing more nutrition into a single serving.")
df_farming.doc.stew_usage = nil df_farming.doc.medium_meal_usage = nil
df_farming.doc.roast_desc = S("Four finely minced ingredients combine into a roast, which serves as a full meal.") df_farming.doc.complex_meal_desc = S("Four finely minced ingredients combine into a fine, full meal.")
df_farming.doc.roast_usage = nil df_farming.doc.complex_meal_usage = nil
-- Plants -- Plants

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dfcaverns module's Italian locale\n" "Project-Id-Version: dfcaverns module's Italian locale\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-23 00:27-0700\n" "POT-Creation-Date: 2019-08-11 03:51-0600\n"
"PO-Revision-Date: 2017-08-17 23:01+0100\n" "PO-Revision-Date: 2017-08-17 23:01+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n" "Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: ITALIANO\n" "Language-Team: ITALIANO\n"
@ -19,104 +19,209 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: df_farming\cave_wheat.lua:10 #: df_farming\cave_wheat.lua:10
#: df_farming\cave_wheat.lua:70 #: df_farming\cave_wheat.lua:87
msgid "Cave Wheat" msgid "Cave Wheat"
msgstr "Grano di caverna" msgstr "Grano di caverna"
#: df_farming\cave_wheat.lua:62 #: df_farming\cave_wheat.lua:79
#: df_farming\cooking.lua:89
msgid "Cave Wheat Seed" msgid "Cave Wheat Seed"
msgstr "Seme di grano di caverna" msgstr "Seme di grano di caverna"
#: df_farming\cave_wheat.lua:83 #: df_farming\cave_wheat.lua:100
#: df_farming\cooking.lua:88
msgid "Cave Wheat Flour" msgid "Cave Wheat Flour"
msgstr "Farina di grano di caverna" msgstr "Farina di grano di caverna"
#: df_farming\cave_wheat.lua:91 #: df_farming\cave_wheat.lua:108
msgid "Dwarven Bread" msgid "Dwarven Bread"
msgstr "Pane nanico" msgstr "Pane nanico"
#: df_farming\cooking.lua:7 #: df_farming\cooking.lua:72
msgid "@1 Biscuit" #, fuzzy
msgstr "Biscotto di @1" msgid "Cave Wheat Flour Biscuit"
msgstr "Farina di grano di caverna"
#: df_farming\cooking.lua:15 #: df_farming\cooking.lua:73
msgid "@1 Stew" #, fuzzy
msgstr "Stufato di @1" msgid "Cave Wheat Flour Bun"
msgstr "Farina di grano di caverna"
#: df_farming\cooking.lua:23 #: df_farming\cooking.lua:74
msgid "@1 Roast" #, fuzzy
msgstr "Arrosto di @1" msgid "Cave Wheat Flour Pancake"
msgstr "Farina di grano di caverna"
#: df_farming\cooking.lua:90 #: df_farming\cooking.lua:77
msgid "Sweet Pod Spore" #, fuzzy
msgid "Cave Wheat Seed Loaf"
msgstr "Seme di grano di caverna"
#: df_farming\cooking.lua:78
#, fuzzy
msgid "Cave Wheat Seed Puffs"
msgstr "Seme di grano di caverna"
#: df_farming\cooking.lua:79
#, fuzzy
msgid "Cave Wheat Seed Risotto"
msgstr "Seme di grano di caverna"
#: df_farming\cooking.lua:82
#, fuzzy
msgid "Sweet Pod Spore Dumplings"
msgstr "Spore di baccello dolce"
#: df_farming\cooking.lua:83
#, fuzzy
msgid "Sweet Pod Spore Single Crust Pie"
msgstr "Spore di baccello dolce"
#: df_farming\cooking.lua:84
#, fuzzy
msgid "Sweet Pod Spore Brule"
msgstr "Spora di baccello dolce" msgstr "Spora di baccello dolce"
#: df_farming\cooking.lua:91 #: df_farming\cooking.lua:87
#: df_farming\sweet_pod.lua:84 #, fuzzy
msgid "Sweet Pod Sugar" msgid "Sweet Pod Sugar Cookie"
msgstr "Zucchero di baccello dolce"
#: df_farming\cooking.lua:88
#, fuzzy
msgid "Sweet Pod Sugar Gingerbread"
msgstr "Zucchero di baccello dolce"
#: df_farming\cooking.lua:89
#, fuzzy
msgid "Sweet Pod Sugar Roll"
msgstr "Zucchero di baccello dolce" msgstr "Zucchero di baccello dolce"
#: df_farming\cooking.lua:92 #: df_farming\cooking.lua:92
#: df_farming\plump_helmet.lua:92 #, fuzzy
#: df_farming\plump_helmet.lua:129 msgid "Plump Helmet Mince"
#: df_farming\plump_helmet.lua:164
#: df_farming\plump_helmet.lua:199
#: df_farming\plump_helmet.lua:251
msgid "Plump Helmet"
msgstr "Elmo rotondo" msgstr "Elmo rotondo"
#: df_farming\cooking.lua:93 #: df_farming\cooking.lua:93
#: df_farming\plump_helmet.lua:61 #, fuzzy
msgid "Plump Helmet Spawn" msgid "Plump Helmet Stalk Sausage"
msgstr "Prole di elmo rotondo" msgstr "Prole di elmo rotondo"
#: df_farming\cooking.lua:94 #: df_farming\cooking.lua:94
msgid "Quarry Bush Leaf" #, fuzzy
msgstr "Foglia di cespuglio di cava" msgid "Plump Helmet Roast"
msgstr "Elmo rotondo"
#: df_farming\cooking.lua:95
msgid "Rock Nut"
msgstr "Noce di roccia"
#: df_farming\cooking.lua:96
msgid "Dimple Cup Spore"
msgstr "Spora di coppa increspata"
#: df_farming\cooking.lua:97 #: df_farming\cooking.lua:97
#: df_farming\pig_tail.lua:62 #, fuzzy
msgid "Pig Tail Spore" msgid "Plump Helmet Spawn Soup"
msgstr "Spora di coda di maiale" msgstr "Prole di elmo rotondo"
#: df_farming\cooking.lua:98 #: df_farming\cooking.lua:98
msgid "Dwarven Syrup" #, fuzzy
msgid "Plump Helmet Spawn Jambalaya"
msgstr "Prole di elmo rotondo"
#: df_farming\cooking.lua:99
#, fuzzy
msgid "Plump Helmet Sprout Stew"
msgstr "Prole di elmo rotondo"
#: df_farming\cooking.lua:102
#, fuzzy
msgid "Quarry Bush Leaf Spicy Bun"
msgstr "Foglia di cespuglio di cava"
#: df_farming\cooking.lua:103
#, fuzzy
msgid "Quarry Bush Leaf Croissant"
msgstr "Foglia di cespuglio di cava"
#: df_farming\cooking.lua:104
#, fuzzy
msgid "Stuffed Quarry Bush Leaf"
msgstr "Foglia di cespuglio di cava"
#: df_farming\cooking.lua:107
#, fuzzy
msgid "Rock Nut Bread"
msgstr "Noce di roccia"
#: df_farming\cooking.lua:108
#, fuzzy
msgid "Rock Nut Cookie"
msgstr "Noce di roccia"
#: df_farming\cooking.lua:109
#, fuzzy
msgid "Rock Nut Cake"
msgstr "Noce di roccia"
#: df_farming\cooking.lua:112
#, fuzzy
msgid "Dimple Cup Spore Flatbread"
msgstr "Spora di coppa increspata"
#: df_farming\cooking.lua:113
#, fuzzy
msgid "Dimple Cup Spore Scone"
msgstr "Spora di coppa increspata"
#: df_farming\cooking.lua:114
#, fuzzy
msgid "Dimple Cup Spore Roll"
msgstr "Spora di coppa increspata"
#: df_farming\cooking.lua:117
#, fuzzy
msgid "Pig Tail Spore Sandwich"
msgstr "Spora di coda di maiale"
#: df_farming\cooking.lua:118
#, fuzzy
msgid "Pig Tail Spore Tofu"
msgstr "Spora di coda di maiale"
#: df_farming\cooking.lua:119
#, fuzzy
msgid "Pig Tail Spore Casserole"
msgstr "Spora di coda di maiale"
#: df_farming\cooking.lua:122
#, fuzzy
msgid "Dwarven Syrup Taffy"
msgstr "Sciroppo nanico" msgstr "Sciroppo nanico"
#: df_farming\cooking.lua:123
#, fuzzy
msgid "Dwarven Syrup Jellies"
msgstr "Sciroppo nanico"
#: df_farming\cooking.lua:124
#, fuzzy
msgid "Dwarven Syrup Delight"
msgstr "Secchio di sciroppo nanico"
#: df_farming\dimple_cup.lua:10 #: df_farming\dimple_cup.lua:10
msgid "Dimple Cup" msgid "Dimple Cup"
msgstr "Coppa increspata" msgstr "Coppa increspata"
#: df_farming\dimple_cup.lua:56 #: df_farming\dimple_cup.lua:68
msgid "Dimple Cup Spores" msgid "Dimple Cup Spores"
msgstr "Spore di coppa increspata" msgstr "Spore di coppa increspata"
#: df_farming\doc.lua:11 #: df_farming\doc.lua:11
msgid "" msgid ""
"A meal made from the admixture of two ingredients, biscuits keep well but " "A meal made from the admixture of two ingredients, it keeps well but are not "
"are not a rich source of nutrients." "a rich source of nutrients."
msgstr "" msgstr ""
#: df_farming\doc.lua:13 #: df_farming\doc.lua:13
msgid "" msgid ""
"Stews mix three ingredients together. They're more wholesome than biscuits, " "A meal made from three ingredients mixed together. They're more wholesome, "
"packing more nutrition into a single serving." "packing more nutrition into a single serving."
msgstr "" msgstr ""
#: df_farming\doc.lua:15 #: df_farming\doc.lua:15
msgid "" msgid "Four finely minced ingredients combine into a fine, full meal."
"Four finely minced ingredients combine into a roast, which serves as a full "
"meal."
msgstr "" msgstr ""
#: df_farming\doc.lua:21 #: df_farming\doc.lua:21
@ -287,7 +392,11 @@ msgstr ""
msgid "Pig Tail" msgid "Pig Tail"
msgstr "Coda di maiale" msgstr "Coda di maiale"
#: df_farming\pig_tail.lua:70 #: df_farming\pig_tail.lua:78
msgid "Pig Tail Spore"
msgstr "Spora di coda di maiale"
#: df_farming\pig_tail.lua:86
msgid "Pig tail thread" msgid "Pig tail thread"
msgstr "Filo di coda di maiale" msgstr "Filo di coda di maiale"
@ -295,19 +404,31 @@ msgstr "Filo di coda di maiale"
msgid "Dead Fungus" msgid "Dead Fungus"
msgstr "Fungo morto" msgstr "Fungo morto"
#: df_farming\plants.lua:36 #: df_farming\plants.lua:42
msgid "Cavern Fungi" msgid "Cavern Fungi"
msgstr "Funghi di caverna" msgstr "Funghi di caverna"
#: df_farming\plump_helmet.lua:61
msgid "Plump Helmet Spawn"
msgstr "Prole di elmo rotondo"
#: df_farming\plump_helmet.lua:92
#: df_farming\plump_helmet.lua:129
#: df_farming\plump_helmet.lua:164
#: df_farming\plump_helmet.lua:199
#: df_farming\plump_helmet.lua:251
msgid "Plump Helmet"
msgstr "Elmo rotondo"
#: df_farming\quarry_bush.lua:10 #: df_farming\quarry_bush.lua:10
msgid "Quarry Bush" msgid "Quarry Bush"
msgstr "Cespuglio di cava" msgstr "Cespuglio di cava"
#: df_farming\quarry_bush.lua:62 #: df_farming\quarry_bush.lua:75
msgid "Rock Nuts" msgid "Rock Nuts"
msgstr "Noci di roccia" msgstr "Noci di roccia"
#: df_farming\quarry_bush.lua:71 #: df_farming\quarry_bush.lua:84
msgid "Quarry Bush Leaves" msgid "Quarry Bush Leaves"
msgstr "Foglie di cespuglio di cava" msgstr "Foglie di cespuglio di cava"
@ -315,22 +436,35 @@ msgstr "Foglie di cespuglio di cava"
msgid "Sweet Pod" msgid "Sweet Pod"
msgstr "Baccello dolce" msgstr "Baccello dolce"
#: df_farming\sweet_pod.lua:60 #: df_farming\sweet_pod.lua:74
msgid "Sweet Pod Spores" msgid "Sweet Pod Spores"
msgstr "Spore di baccello dolce" msgstr "Spore di baccello dolce"
#: df_farming\sweet_pod.lua:68 #: df_farming\sweet_pod.lua:82
msgid "Sweet Pods" msgid "Sweet Pods"
msgstr "Baccelli dolci" msgstr "Baccelli dolci"
#: df_farming\sweet_pod.lua:107 #: df_farming\sweet_pod.lua:98
msgid "Sweet Pod Sugar"
msgstr "Zucchero di baccello dolce"
#: df_farming\sweet_pod.lua:138
msgid "Dwarven Syrup Source" msgid "Dwarven Syrup Source"
msgstr "Fonte di sciroppo nanico" msgstr "Fonte di sciroppo nanico"
#: df_farming\sweet_pod.lua:155 #: df_farming\sweet_pod.lua:186
msgid "Flowing Dwarven Syrup" msgid "Flowing Dwarven Syrup"
msgstr "Sciroppo nanico che scorre" msgstr "Sciroppo nanico che scorre"
#: df_farming\sweet_pod.lua:208 #: df_farming\sweet_pod.lua:239
msgid "Dwarven Syrup Bucket" msgid "Dwarven Syrup Bucket"
msgstr "Secchio di sciroppo nanico" msgstr "Secchio di sciroppo nanico"
#~ msgid "@1 Biscuit"
#~ msgstr "Biscotto di @1"
#~ msgid "@1 Stew"
#~ msgstr "Stufato di @1"
#~ msgid "@1 Roast"
#~ msgstr "Arrosto di @1"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-23 00:27-0700\n" "POT-Creation-Date: 2019-08-11 03:51-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,104 +18,176 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: df_farming\cave_wheat.lua:10 #: df_farming\cave_wheat.lua:10
#: df_farming\cave_wheat.lua:70 #: df_farming\cave_wheat.lua:87
msgid "Cave Wheat" msgid "Cave Wheat"
msgstr "" msgstr ""
#: df_farming\cave_wheat.lua:62 #: df_farming\cave_wheat.lua:79
#: df_farming\cooking.lua:89
msgid "Cave Wheat Seed" msgid "Cave Wheat Seed"
msgstr "" msgstr ""
#: df_farming\cave_wheat.lua:83 #: df_farming\cave_wheat.lua:100
#: df_farming\cooking.lua:88
msgid "Cave Wheat Flour" msgid "Cave Wheat Flour"
msgstr "" msgstr ""
#: df_farming\cave_wheat.lua:91 #: df_farming\cave_wheat.lua:108
msgid "Dwarven Bread" msgid "Dwarven Bread"
msgstr "" msgstr ""
#: df_farming\cooking.lua:7 #: df_farming\cooking.lua:72
msgid "@1 Biscuit" msgid "Cave Wheat Flour Biscuit"
msgstr "" msgstr ""
#: df_farming\cooking.lua:15 #: df_farming\cooking.lua:73
msgid "@1 Stew" msgid "Cave Wheat Flour Bun"
msgstr "" msgstr ""
#: df_farming\cooking.lua:23 #: df_farming\cooking.lua:74
msgid "@1 Roast" msgid "Cave Wheat Flour Pancake"
msgstr "" msgstr ""
#: df_farming\cooking.lua:90 #: df_farming\cooking.lua:77
msgid "Sweet Pod Spore" msgid "Cave Wheat Seed Loaf"
msgstr "" msgstr ""
#: df_farming\cooking.lua:91 #: df_farming\cooking.lua:78
#: df_farming\sweet_pod.lua:84 msgid "Cave Wheat Seed Puffs"
msgid "Sweet Pod Sugar" msgstr ""
#: df_farming\cooking.lua:79
msgid "Cave Wheat Seed Risotto"
msgstr ""
#: df_farming\cooking.lua:82
msgid "Sweet Pod Spore Dumplings"
msgstr ""
#: df_farming\cooking.lua:83
msgid "Sweet Pod Spore Single Crust Pie"
msgstr ""
#: df_farming\cooking.lua:84
msgid "Sweet Pod Spore Brule"
msgstr ""
#: df_farming\cooking.lua:87
msgid "Sweet Pod Sugar Cookie"
msgstr ""
#: df_farming\cooking.lua:88
msgid "Sweet Pod Sugar Gingerbread"
msgstr ""
#: df_farming\cooking.lua:89
msgid "Sweet Pod Sugar Roll"
msgstr "" msgstr ""
#: df_farming\cooking.lua:92 #: df_farming\cooking.lua:92
#: df_farming\plump_helmet.lua:92 msgid "Plump Helmet Mince"
#: df_farming\plump_helmet.lua:129
#: df_farming\plump_helmet.lua:164
#: df_farming\plump_helmet.lua:199
#: df_farming\plump_helmet.lua:251
msgid "Plump Helmet"
msgstr "" msgstr ""
#: df_farming\cooking.lua:93 #: df_farming\cooking.lua:93
#: df_farming\plump_helmet.lua:61 msgid "Plump Helmet Stalk Sausage"
msgid "Plump Helmet Spawn"
msgstr "" msgstr ""
#: df_farming\cooking.lua:94 #: df_farming\cooking.lua:94
msgid "Quarry Bush Leaf" msgid "Plump Helmet Roast"
msgstr ""
#: df_farming\cooking.lua:95
msgid "Rock Nut"
msgstr ""
#: df_farming\cooking.lua:96
msgid "Dimple Cup Spore"
msgstr "" msgstr ""
#: df_farming\cooking.lua:97 #: df_farming\cooking.lua:97
#: df_farming\pig_tail.lua:62 msgid "Plump Helmet Spawn Soup"
msgid "Pig Tail Spore"
msgstr "" msgstr ""
#: df_farming\cooking.lua:98 #: df_farming\cooking.lua:98
msgid "Dwarven Syrup" msgid "Plump Helmet Spawn Jambalaya"
msgstr ""
#: df_farming\cooking.lua:99
msgid "Plump Helmet Sprout Stew"
msgstr ""
#: df_farming\cooking.lua:102
msgid "Quarry Bush Leaf Spicy Bun"
msgstr ""
#: df_farming\cooking.lua:103
msgid "Quarry Bush Leaf Croissant"
msgstr ""
#: df_farming\cooking.lua:104
msgid "Stuffed Quarry Bush Leaf"
msgstr ""
#: df_farming\cooking.lua:107
msgid "Rock Nut Bread"
msgstr ""
#: df_farming\cooking.lua:108
msgid "Rock Nut Cookie"
msgstr ""
#: df_farming\cooking.lua:109
msgid "Rock Nut Cake"
msgstr ""
#: df_farming\cooking.lua:112
msgid "Dimple Cup Spore Flatbread"
msgstr ""
#: df_farming\cooking.lua:113
msgid "Dimple Cup Spore Scone"
msgstr ""
#: df_farming\cooking.lua:114
msgid "Dimple Cup Spore Roll"
msgstr ""
#: df_farming\cooking.lua:117
msgid "Pig Tail Spore Sandwich"
msgstr ""
#: df_farming\cooking.lua:118
msgid "Pig Tail Spore Tofu"
msgstr ""
#: df_farming\cooking.lua:119
msgid "Pig Tail Spore Casserole"
msgstr ""
#: df_farming\cooking.lua:122
msgid "Dwarven Syrup Taffy"
msgstr ""
#: df_farming\cooking.lua:123
msgid "Dwarven Syrup Jellies"
msgstr ""
#: df_farming\cooking.lua:124
msgid "Dwarven Syrup Delight"
msgstr "" msgstr ""
#: df_farming\dimple_cup.lua:10 #: df_farming\dimple_cup.lua:10
msgid "Dimple Cup" msgid "Dimple Cup"
msgstr "" msgstr ""
#: df_farming\dimple_cup.lua:56 #: df_farming\dimple_cup.lua:68
msgid "Dimple Cup Spores" msgid "Dimple Cup Spores"
msgstr "" msgstr ""
#: df_farming\doc.lua:11 #: df_farming\doc.lua:11
msgid "" msgid ""
"A meal made from the admixture of two ingredients, biscuits keep well but " "A meal made from the admixture of two ingredients, it keeps well but are not "
"are not a rich source of nutrients." "a rich source of nutrients."
msgstr "" msgstr ""
#: df_farming\doc.lua:13 #: df_farming\doc.lua:13
msgid "" msgid ""
"Stews mix three ingredients together. They're more wholesome than biscuits, " "A meal made from three ingredients mixed together. They're more wholesome, "
"packing more nutrition into a single serving." "packing more nutrition into a single serving."
msgstr "" msgstr ""
#: df_farming\doc.lua:15 #: df_farming\doc.lua:15
msgid "" msgid "Four finely minced ingredients combine into a fine, full meal."
"Four finely minced ingredients combine into a roast, which serves as a full "
"meal."
msgstr "" msgstr ""
#: df_farming\doc.lua:21 #: df_farming\doc.lua:21
@ -286,7 +358,11 @@ msgstr ""
msgid "Pig Tail" msgid "Pig Tail"
msgstr "" msgstr ""
#: df_farming\pig_tail.lua:70 #: df_farming\pig_tail.lua:78
msgid "Pig Tail Spore"
msgstr ""
#: df_farming\pig_tail.lua:86
msgid "Pig tail thread" msgid "Pig tail thread"
msgstr "" msgstr ""
@ -294,19 +370,31 @@ msgstr ""
msgid "Dead Fungus" msgid "Dead Fungus"
msgstr "" msgstr ""
#: df_farming\plants.lua:36 #: df_farming\plants.lua:42
msgid "Cavern Fungi" msgid "Cavern Fungi"
msgstr "" msgstr ""
#: df_farming\plump_helmet.lua:61
msgid "Plump Helmet Spawn"
msgstr ""
#: df_farming\plump_helmet.lua:92
#: df_farming\plump_helmet.lua:129
#: df_farming\plump_helmet.lua:164
#: df_farming\plump_helmet.lua:199
#: df_farming\plump_helmet.lua:251
msgid "Plump Helmet"
msgstr ""
#: df_farming\quarry_bush.lua:10 #: df_farming\quarry_bush.lua:10
msgid "Quarry Bush" msgid "Quarry Bush"
msgstr "" msgstr ""
#: df_farming\quarry_bush.lua:62 #: df_farming\quarry_bush.lua:75
msgid "Rock Nuts" msgid "Rock Nuts"
msgstr "" msgstr ""
#: df_farming\quarry_bush.lua:71 #: df_farming\quarry_bush.lua:84
msgid "Quarry Bush Leaves" msgid "Quarry Bush Leaves"
msgstr "" msgstr ""
@ -314,22 +402,26 @@ msgstr ""
msgid "Sweet Pod" msgid "Sweet Pod"
msgstr "" msgstr ""
#: df_farming\sweet_pod.lua:60 #: df_farming\sweet_pod.lua:74
msgid "Sweet Pod Spores" msgid "Sweet Pod Spores"
msgstr "" msgstr ""
#: df_farming\sweet_pod.lua:68 #: df_farming\sweet_pod.lua:82
msgid "Sweet Pods" msgid "Sweet Pods"
msgstr "" msgstr ""
#: df_farming\sweet_pod.lua:107 #: df_farming\sweet_pod.lua:98
msgid "Sweet Pod Sugar"
msgstr ""
#: df_farming\sweet_pod.lua:138
msgid "Dwarven Syrup Source" msgid "Dwarven Syrup Source"
msgstr "" msgstr ""
#: df_farming\sweet_pod.lua:155 #: df_farming\sweet_pod.lua:186
msgid "Flowing Dwarven Syrup" msgid "Flowing Dwarven Syrup"
msgstr "" msgstr ""
#: df_farming\sweet_pod.lua:208 #: df_farming\sweet_pod.lua:239
msgid "Dwarven Syrup Bucket" msgid "Dwarven Syrup Bucket"
msgstr "" msgstr ""

View File

@ -1 +1,4 @@
name = df_farming name = df_farming
description = Adds farmable underground plants that die in sunlight. Also includes various cooking reactions.
depends = default
optional_depends = farming, cottages, bucket, dynamic_liquid, wool, intllib, doc, crafting, trail

View File

@ -17,10 +17,17 @@ local register_pig_tail = function(number)
inventory_image = "dfcaverns_pig_tail_"..tostring(number)..".png", inventory_image = "dfcaverns_pig_tail_"..tostring(number)..".png",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
floodable = true, floodable = true,
buildable_to = true, buildable_to = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16},
},
},
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
df_farming.grow_underground_plant(pos, name, elapsed) df_farming.grow_underground_plant(pos, name, elapsed)
@ -115,3 +122,40 @@ minetest.register_craft({
burntime = 1, burntime = 1,
}) })
if minetest.get_modpath("trail") and trail and trail.register_trample_node then
minetest.register_node("df_farming:pig_tail_trampled", {
description = S("Flattened Pig Tail"),
tiles = {"dfcaverns_pig_tail_flattened.png"},
inventory_image = "dfcaverns_pig_tail_flattened.png",
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
buildable_to = true,
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5}
},
},
groups = {snappy = 3, flammable = 2, attached_node = 1},
drop = "",
sounds = default.node_sound_leaves_defaults(),
})
trail.register_trample_node("df_farming:pig_tail_5", {
trampled_node_name = "df_farming:pig_tail_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:pig_tail_6", {
trampled_node_name = "df_farming:pig_tail_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:pig_tail_7", {
trampled_node_name = "df_farming:pig_tail_trampled",
randomize_trampled_param2 = true,
})
trail.register_trample_node("df_farming:pig_tail_8", {
trampled_node_name = "df_farming:pig_tail_trampled",
randomize_trampled_param2 = true,
})
end

View File

@ -15,6 +15,7 @@ minetest.register_node("df_farming:dead_fungus", {
inventory_image = "dfcaverns_dead_fungus.png", inventory_image = "dfcaverns_dead_fungus.png",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
buildable_to = true, buildable_to = true,
floodable = true, floodable = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1},
@ -47,6 +48,7 @@ minetest.register_node("df_farming:cavern_fungi", {
inventory_image = "dfcaverns_fungi.png", inventory_image = "dfcaverns_fungi.png",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
buildable_to = true, buildable_to = true,
floodable = true, floodable = true,
light_source = 6, light_source = 6,
@ -134,7 +136,7 @@ local place_seed = function(itemstack, placer, pointed_thing, plantname)
-- add the node and remove 1 item from the itemstack -- add the node and remove 1 item from the itemstack
minetest.add_node(pt.above, {name = plantname, param2 = 1}) minetest.add_node(pt.above, {name = plantname, param2 = 1})
df_farming.plant_timer(pt.above, plantname) df_farming.plant_timer(pt.above, plantname)
if not minetest.setting_getbool("creative_mode") then if not minetest.settings:get_bool("creative_mode", false) then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
@ -155,6 +157,7 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti
_dfcaverns_next_stage_time = grow_time, _dfcaverns_next_stage_time = grow_time,
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
floodable = true, floodable = true,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = { selection_box = {
@ -180,6 +183,9 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti
end end
df_farming.grow_underground_plant = function(pos, plant_name, elapsed) df_farming.grow_underground_plant = function(pos, plant_name, elapsed)
if df_farming.kill_if_sunlit(pos) then
return
end
local node_def = minetest.registered_nodes[plant_name] local node_def = minetest.registered_nodes[plant_name]
local next_stage = node_def._dfcaverns_next_stage local next_stage = node_def._dfcaverns_next_stage
if next_stage then if next_stage then
@ -195,7 +201,33 @@ df_farming.grow_underground_plant = function(pos, plant_name, elapsed)
end end
end end
df_farming.kill_if_sunlit = function(pos, node)
return false
end
if df_farming.config.light_kills_fungus then if df_farming.config.light_kills_fungus then
local kill_if_sunlit = function(pos, node)
if not node then
node = minetest.get_node(pos)
end
local node_def = minetest.registered_nodes[node.name]
local light_sensitive_fungus_level = node_def.groups.light_sensitive_fungus
-- This should never be the case, but I've received a report of it happening anyway in the ABM so guarding against it.
if not light_sensitive_fungus_level then return false end
local dead_node = node_def._dfcaverns_dead_node or "df_farming:dead_fungus"
-- 11 is the value adjacent to a torch
local light_level = minetest.get_node_light(pos, 0.5) -- check at 0.5 to get how bright it would be here at noon,
-- prevents fungus from growing on the surface world by happenstance
if light_level and light_level > light_sensitive_fungus_level then
minetest.set_node(pos, {name=dead_node, param2 = node.param2})
return true
end
return false
end
df_farming.kill_if_sunlit = kill_if_sunlit
minetest.register_abm({ minetest.register_abm({
label = "df_farming:kill_light_sensitive_fungus", label = "df_farming:kill_light_sensitive_fungus",
nodenames = {"group:light_sensitive_fungus"}, nodenames = {"group:light_sensitive_fungus"},
@ -203,15 +235,7 @@ if df_farming.config.light_kills_fungus then
interval = 30, interval = 30,
chance = 5, chance = 5,
action = function(pos, node) action = function(pos, node)
local node_def = minetest.registered_nodes[node.name] kill_if_sunlit(pos, node)
local light_sensitive_fungus_level = node_def.groups.light_sensitive_fungus
if not light_sensitive_fungus_level then return end -- This should never be the case, but I've received a report of it happening anyway so guarding against it.
local dead_node = node_def._dfcaverns_dead_node or "df_farming:dead_fungus"
-- 11 is the value adjacent to a torch
local light_level = minetest.get_node_light(pos)
if light_level and light_level > light_sensitive_fungus_level then
minetest.set_node(pos, {name=dead_node, param2 = node.param2})
end
end end
}) })
end end

View File

@ -50,7 +50,7 @@ local plump_helmet_on_place = function(itemstack, placer, pointed_thing, plantn
-- add the node and remove 1 item from the itemstack -- add the node and remove 1 item from the itemstack
minetest.add_node(pt.above, {name = plantname, param2 = math.random(0,3)}) minetest.add_node(pt.above, {name = plantname, param2 = math.random(0,3)})
df_farming.plant_timer(pt.above, plantname) df_farming.plant_timer(pt.above, plantname)
if not minetest.setting_getbool("creative_mode") then if not minetest.settings:get_bool("creative_mode", false) then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
@ -71,6 +71,7 @@ minetest.register_node("df_farming:plump_helmet_spawn", {
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
walkable = false, walkable = false,
is_ground_content = false,
floodable = true, floodable = true,
node_box = { node_box = {
type = "fixed", type = "fixed",
@ -103,6 +104,9 @@ minetest.register_node("df_farming:plump_helmet_1", {
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false,
sounds = default.node_sound_leaves_defaults(),
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
walkable = false, walkable = false,
floodable = true, floodable = true,
node_box = { node_box = {
@ -140,7 +144,10 @@ minetest.register_node("df_farming:plump_helmet_2", {
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sounds = default.node_sound_leaves_defaults(),
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
walkable = false, walkable = false,
is_ground_content = false,
floodable = true, floodable = true,
node_box = { node_box = {
type = "fixed", type = "fixed",
@ -175,7 +182,10 @@ minetest.register_node("df_farming:plump_helmet_3", {
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sounds = default.node_sound_leaves_defaults(),
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
walkable = false, walkable = false,
is_ground_content = false,
floodable = true, floodable = true,
node_box = { node_box = {
type = "fixed", type = "fixed",
@ -208,7 +218,10 @@ minetest.register_node("df_farming:plump_helmet_4", {
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sounds = default.node_sound_leaves_defaults(),
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
walkable = false, walkable = false,
is_ground_content = false,
floodable = false, -- I figure full grown plump helmets are sturdy enough to survive inundation floodable = false, -- I figure full grown plump helmets are sturdy enough to survive inundation
node_box = { node_box = {
type = "fixed", type = "fixed",
@ -260,7 +273,10 @@ minetest.register_node("df_farming:plump_helmet_4_picked", {
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sounds = default.node_sound_leaves_defaults(),
sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}},
walkable = false, walkable = false,
is_ground_content = false,
floodable = false, floodable = false,
node_box = { node_box = {
type = "fixed", type = "fixed",

View File

@ -18,9 +18,16 @@ local register_quarry_bush = function(number)
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false,
floodable = true, floodable = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -8/16 + (16/5)*number/16, 8/16},
},
},
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
df_farming.grow_underground_plant(pos, name, elapsed) df_farming.grow_underground_plant(pos, name, elapsed)

View File

@ -1,4 +1,4 @@
dfcaverns_plant_growth_time (Base plant growth timer interval) int 100 dfcaverns_plant_growth_time (Base plant growth timer interval) int 3600
dfcaverns_cave_wheat_delay_multiplier (cave_wheat growth delay multiplier) float 1 dfcaverns_cave_wheat_delay_multiplier (cave_wheat growth delay multiplier) float 1
dfcaverns_dimple_cup_delay_multiplier (dimple_cup growth delay multiplier) float 3 dfcaverns_dimple_cup_delay_multiplier (dimple_cup growth delay multiplier) float 3
dfcaverns_pig_tail_delay_multiplier (pig_tail growth delay multiplier) float 1 dfcaverns_pig_tail_delay_multiplier (pig_tail growth delay multiplier) float 1

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
df_farming_gummy_chew 1,2 and 3 are from https://freesound.org/people/Breviceps/sounds/447916/ by Breviceps under the CC0 public domain license
df_farming_chomp_crunch are from https://freesound.org/people/bbrocer/sounds/382650/ by bbrocer under the CC0 public domain license
df_farming_crisp_chew 1 and 2 are from https://freesound.org/people/InspectorJ/sounds/412068/ by InspectorJ under the CC-BY-SA 3.0 license
df_farming_soft_chew 1, 2, 3 and 4 are from https://freesound.org/people/miekyj/sounds/326464/ by miekyj under the CC0 public domain license
df_farming_mushy_chew 1, 2 and 3 are from https://freesound.org/people/nickyg11p/sounds/390800/ by nickyg11p under the CC0 public domain license

View File

@ -15,10 +15,17 @@ local register_sweet_pod = function(number)
inventory_image = "dfcaverns_sweet_pod_"..tostring(number)..".png", inventory_image = "dfcaverns_sweet_pod_"..tostring(number)..".png",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
is_ground_content = false,
buildable_to = true, buildable_to = true,
floodable = true, floodable = true,
groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -8/16 + (16/6)*number/16, 8/16},
},
},
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
df_farming.grow_underground_plant(pos, name, elapsed) df_farming.grow_underground_plant(pos, name, elapsed)
@ -239,16 +246,14 @@ if minetest.get_modpath("bucket") then
S("Dwarven Syrup Bucket") S("Dwarven Syrup Bucket")
) )
if minetest.get_modpath("simplecrafting_lib") then if minetest.get_modpath("crafting") then
simplecrafting_lib.register("cooking", { simplecrafting_lib.register("furnace", {
input = { input = {
["bucket:bucket_empty"] = 1, ["bucket:bucket_empty"] = 1,
["df_farming:sugar"] = 3, ["df_farming:sugar"] = 3,
["simplecrafting_lib:heat"] = 5,
}, },
output = { output = "df_farming:dwarven_syrup_bucket",
["df_farming:dwarven_syrup_bucket"] = 1,
},
cooktime = 5.0,
}) })
else else
minetest.register_craft({ minetest.register_craft({

Binary file not shown.

Before

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 B

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 818 B

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Some files were not shown because too many files have changed in this diff Show More