Compare commits
87 Commits
small_stuf
...
primordial
Author | SHA1 | Date | |
---|---|---|---|
de57f627e2 | |||
ffd088200d | |||
893dd85bce | |||
769f704f85 | |||
336c0849aa | |||
d9b3903e66 | |||
bf507c3177 | |||
7877f2cb4b | |||
788a00e307 | |||
e2c6507e5f | |||
18051ce3a6 | |||
239d4569e2 | |||
599f17ec60 | |||
98e3e0a222 | |||
89639e289a | |||
240d35cfa6 | |||
c5fe22f7ec | |||
6deb010475 | |||
ad319c50a3 | |||
64ab6ebd05 | |||
84efae02c4 | |||
96e6ecefe7 | |||
e59144a33b | |||
4a40eaf2b2 | |||
9e53ee9836 | |||
ff1d5d0af2 | |||
27afe3e383 | |||
d82be17b6b | |||
19236da965 | |||
b4293d30c6 | |||
d9236c33a3 | |||
861b8935a9 | |||
70996a5e4b | |||
95578b06e1 | |||
41edf4d7b1 | |||
aec1cac984 | |||
af402c08ce | |||
e4a69b3e1f | |||
7cb293b6be | |||
3ba2542979 | |||
41b512dc47 | |||
6b41029b84 | |||
9ddb8c5b6f | |||
a47c25a89c | |||
f11e878b08 | |||
19f518b21e | |||
2eb5273746 | |||
3bd29df3bc | |||
859f84686a | |||
ad5d64d901 | |||
7ee75edeab | |||
43d67e764d | |||
9bcd5532fe | |||
04fd11c312 | |||
a33058ede0 | |||
54bbf456c4 | |||
ccc200661d | |||
e0b3b023b0 | |||
922181bba2 | |||
91e2da49c8 | |||
ff44fb87c2 | |||
d352178244 | |||
ce5c6f807d | |||
cc30f96d52 | |||
816f0bf7eb | |||
b29f549d76 | |||
85ab92f32d | |||
13c75410aa | |||
cacddcd347 | |||
12919e9a16 | |||
bf5227f055 | |||
9db3e47342 | |||
c64f0a6f63 | |||
1a86f38f71 | |||
63efbf6179 | |||
b2b5231c43 | |||
eb3377fba0 | |||
99588c160f | |||
f2c1f54215 | |||
62b33c126f | |||
78963d4b89 | |||
e6ce07a013 | |||
19a6da4f78 | |||
7ebcdd0178 | |||
3486f534e2 | |||
86535e82fc | |||
02e699890f |
22
bones_loot/LICENSE.txt
Normal 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
@ -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
@ -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
|
22
bones_loot/locale/template.pot
Normal 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 ""
|
6
bones_loot/locale/update.bat
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
|
||||||
|
cd ..
|
||||||
|
set LIST=
|
||||||
|
for /r %%X in (*.lua) do set LIST=!LIST! %%X
|
||||||
|
..\..\intllib\tools\xgettext.bat %LIST%
|
4
bones_loot/mod.conf
Normal 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
|
@ -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")
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
default
|
|
||||||
subterrane
|
|
||||||
df_farming?
|
|
||||||
df_trees
|
|
||||||
df_mapitems
|
|
||||||
ice_sprites?
|
|
||||||
oil?
|
|
||||||
df_underworld_items?
|
|
||||||
magma_conduits?
|
|
@ -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
@ -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
|
@ -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")
|
||||||
|
@ -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)
|
@ -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
|
||||||
df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
|
if math.random() < 0.01 then
|
||||||
|
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,
|
||||||
})
|
})
|
@ -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,28 +135,29 @@ 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 biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
|
local cave_threshold = cavern_def.cave_threshold
|
||||||
|
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
--check if we're just inside the boundary of the (negazone) cavern threshold
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
||||||
local cave_threshold = cavern_def.cave_threshold
|
-- add giant rooty structures to the flooded barren caverns
|
||||||
|
if vein_noise == nil then
|
||||||
--check if we're just inside the boundary of the (negazone) cavern threshold
|
vein_noise, vein_area = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
|
||||||
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
end
|
||||||
-- add giant rooty structures to the flooded barren caverns
|
if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then
|
||||||
if vein_noise == nil then
|
data[vi] = c_veinstone
|
||||||
vein_noise = 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[cave_area:transform(area, vi)]) < 0.02 then
|
|
||||||
data[vi] = c_veinstone
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if data[vi] == c_air and area:get_y(vi) <= subsea_level then
|
if data[vi] == c_air and y <= subsea_level then
|
||||||
data[vi] = c_water -- otherwise, fill air with water when below sea level
|
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
|
||||||
|
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
|
||||||
-- else air pockets?
|
|
||||||
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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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,25 +207,25 @@ 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
|
||||||
|
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
if (mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp)) then
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
|
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
|
||||||
|
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
||||||
|
-- floating ice
|
||||||
|
data[vi] = c_ice
|
||||||
end
|
end
|
||||||
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
|
||||||
-- floating ice
|
|
||||||
data[vi] = c_ice
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -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
|
||||||
df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false)
|
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)
|
||||||
|
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,
|
||||||
})
|
})
|
||||||
|
26
df_caverns/locale/template.pot
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2020-01-25 13:52-0700\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: df_caverns\underworld.lua:12
|
||||||
|
msgid "A glowing pit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: df_caverns\underworld.lua:27
|
||||||
|
msgid "A mysterious seal"
|
||||||
|
msgstr ""
|
6
df_caverns/locale/update.bat
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
|
||||||
|
cd ..
|
||||||
|
set LIST=
|
||||||
|
for /r %%X in (*.lua) do set LIST=!LIST! %%X
|
||||||
|
..\..\intllib\tools\xgettext.bat %LIST%
|
@ -1 +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
|
@ -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
|
||||||
data[vi] = c_gas
|
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
|
||||||
|
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
@ -0,0 +1,425 @@
|
|||||||
|
if not df_caverns.config.enable_primordial or not minetest.get_modpath("df_primordial_items") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local perlin_cave_primordial = {
|
||||||
|
offset = 0,
|
||||||
|
scale = 1,
|
||||||
|
spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale},
|
||||||
|
seed = 14055553,
|
||||||
|
octaves = 3,
|
||||||
|
persist = 0.67
|
||||||
|
}
|
||||||
|
|
||||||
|
local perlin_wave_primordial = {
|
||||||
|
offset = 0,
|
||||||
|
scale = 1,
|
||||||
|
spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale},
|
||||||
|
seed = 923444,
|
||||||
|
octaves = 6,
|
||||||
|
persist = 0.63
|
||||||
|
}
|
||||||
|
|
||||||
|
local c_air = minetest.get_content_id("air")
|
||||||
|
|
||||||
|
local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------------------
|
||||||
|
-- Fungal biome
|
||||||
|
|
||||||
|
local c_orb = minetest.get_content_id("df_primordial_items:glow_orb_hanging")
|
||||||
|
local c_mycelial_dirt = minetest.get_content_id("df_primordial_items:dirt_with_mycelium")
|
||||||
|
local c_dirt = minetest.get_content_id("default:dirt")
|
||||||
|
local c_giant_mycelium = minetest.get_content_id("df_primordial_items:giant_hypha_apical_mapgen")
|
||||||
|
|
||||||
|
local fungal_plants = {
|
||||||
|
minetest.get_content_id("df_primordial_items:fungal_grass_1"),
|
||||||
|
minetest.get_content_id("df_primordial_items:fungal_grass_2"),
|
||||||
|
minetest.get_content_id("df_primordial_items:glow_orb"),
|
||||||
|
minetest.get_content_id("df_primordial_items:glow_orb_stalks"),
|
||||||
|
minetest.get_content_id("df_primordial_items:glow_pods"),
|
||||||
|
}
|
||||||
|
|
||||||
|
local fungal_plant_names = {}
|
||||||
|
local fungal_plants = {}
|
||||||
|
for node_name, node_def in pairs(minetest.registered_nodes) do
|
||||||
|
if minetest.get_item_group(node_name, "primordial_fungal_plant") > 0 then
|
||||||
|
table.insert(fungal_plant_names, node_name)
|
||||||
|
table.insert(fungal_plants, minetest.get_content_id(node_name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mushroom_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
local humidityfactor = humidity/200 + 0.5
|
||||||
|
abs_cracks = abs_cracks * humidityfactor
|
||||||
|
|
||||||
|
if abs_cracks < 0.7 then
|
||||||
|
data[vi] = c_mycelial_dirt
|
||||||
|
elseif abs_cracks < 1 then
|
||||||
|
data[vi] = c_dirt
|
||||||
|
end
|
||||||
|
|
||||||
|
local rand = math.random() * math.min(abs_cracks, 1) * humidityfactor
|
||||||
|
if rand < 0.0005 then
|
||||||
|
local mycelium_index = vi+ystride
|
||||||
|
data[mycelium_index] = c_giant_mycelium
|
||||||
|
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||||
|
elseif rand < 0.003 then
|
||||||
|
local schematic = df_primordial_items.get_primordial_mushroom()
|
||||||
|
local rotation = (math.random(1,4)-1)*90
|
||||||
|
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), schematic, rotation)
|
||||||
|
elseif rand < 0.05 then
|
||||||
|
data[vi+ystride] = fungal_plants[math.random(1,5)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mushroom_cavern_ceiling = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
local humidityfactor = humidity/200 + 0.5
|
||||||
|
abs_cracks = abs_cracks * humidityfactor
|
||||||
|
|
||||||
|
if abs_cracks < 0.5 then
|
||||||
|
data[vi] = c_mycelial_dirt
|
||||||
|
if abs_cracks < 0.3 then
|
||||||
|
local rand = math.random() * humidityfactor
|
||||||
|
if rand < 0.002 then
|
||||||
|
local mycelium_index = vi-ystride
|
||||||
|
data[mycelium_index] = c_giant_mycelium
|
||||||
|
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||||
|
elseif rand < 0.03 then
|
||||||
|
df_primordial_items.spawn_ceiling_spire_vm(vi, area, data)
|
||||||
|
elseif rand < 0.2 then
|
||||||
|
data[vi-ystride] = c_orb
|
||||||
|
data_param2[vi-ystride] = math.random(0,179)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mushroom_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
|
||||||
|
if abs_cracks < 0.3 then
|
||||||
|
data[vi] = c_mycelial_dirt
|
||||||
|
if abs_cracks < 0.2 then
|
||||||
|
local rand = math.random()
|
||||||
|
if rand < 0.001 then
|
||||||
|
local mycelium_index = vi-ystride
|
||||||
|
data[mycelium_index] = c_giant_mycelium
|
||||||
|
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||||
|
elseif rand < 0.2 then
|
||||||
|
data[vi-ystride] = c_orb
|
||||||
|
data_param2[vi-ystride] = math.random(0,179)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local mushroom_warren_floor = function(abs_cracks, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
if abs_cracks < 0.7 then
|
||||||
|
data[vi] = c_mycelial_dirt
|
||||||
|
elseif abs_cracks < 1 then
|
||||||
|
data[vi] = c_dirt
|
||||||
|
end
|
||||||
|
local rand = math.random() * math.min(abs_cracks, 1)
|
||||||
|
if rand < 0.001 then
|
||||||
|
local mycelium_index = vi+ystride
|
||||||
|
data[mycelium_index] = c_giant_mycelium
|
||||||
|
minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread))
|
||||||
|
elseif rand < 0.03 then
|
||||||
|
data[vi+ystride] = fungal_plants[math.random(1,5)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------------------------
|
||||||
|
-- Jungle biome
|
||||||
|
|
||||||
|
local jungle_plant_names = {}
|
||||||
|
local jungle_plants = {}
|
||||||
|
for node_name, node_def in pairs(minetest.registered_nodes) do
|
||||||
|
if minetest.get_item_group(node_name, "primordial_jungle_plant") > 0 then
|
||||||
|
table.insert(jungle_plant_names, node_name)
|
||||||
|
table.insert(jungle_plants, minetest.get_content_id(node_name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local c_jungle_dirt = minetest.get_content_id("df_primordial_items:dirt_with_jungle_grass")
|
||||||
|
local c_plant_matter = minetest.get_content_id("df_primordial_items:plant_matter")
|
||||||
|
local c_packed_roots = minetest.get_content_id("df_primordial_items:packed_roots")
|
||||||
|
local c_glowstone = minetest.get_content_id("df_underworld_items:glowstone")
|
||||||
|
local c_ivy = minetest.get_content_id("df_primordial_items:jungle_ivy")
|
||||||
|
local c_root_2 = minetest.get_content_id("df_primordial_items:jungle_roots_2")
|
||||||
|
local c_root_1 = minetest.get_content_id("df_primordial_items:jungle_roots_1")
|
||||||
|
|
||||||
|
local c_fireflies
|
||||||
|
if minetest.get_modpath("fireflies") then
|
||||||
|
c_fireflies = minetest.get_content_id("fireflies:firefly")
|
||||||
|
end
|
||||||
|
|
||||||
|
local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
local humidityfactor = humidity/100
|
||||||
|
|
||||||
|
data[vi] = c_jungle_dirt
|
||||||
|
|
||||||
|
local rand = math.random()
|
||||||
|
if rand < 0.025 * humidityfactor then
|
||||||
|
local fern_schematic = df_primordial_items.get_fern_schematic()
|
||||||
|
local rotation = (math.random(1,4)-1)*90
|
||||||
|
mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), fern_schematic, rotation)
|
||||||
|
elseif rand < 0.025 * (1-humidityfactor) then
|
||||||
|
df_primordial_items.spawn_jungle_mushroom_vm(vi+ystride, area, data)
|
||||||
|
elseif rand < 0.05 * (1-humidityfactor) then
|
||||||
|
df_primordial_items.spawn_jungle_tree_vm(math.random(8,14), vi+ystride, area, data)
|
||||||
|
elseif rand < 0.3 then
|
||||||
|
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
|
||||||
|
end
|
||||||
|
|
||||||
|
if c_fireflies and math.random() < 0.01 then
|
||||||
|
local firefly_vi = vi + ystride * math.random(1, 5)
|
||||||
|
if data[firefly_vi] == c_air then
|
||||||
|
data[firefly_vi] = c_fireflies
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local jungle_cavern_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||||
|
if abs_cracks < 0.25 then
|
||||||
|
data[vi] = c_glowstone
|
||||||
|
elseif abs_cracks > 0.75 and math.random() < 0.1 then
|
||||||
|
local ystride = area.ystride
|
||||||
|
data[vi] = c_dirt
|
||||||
|
local index = vi - ystride
|
||||||
|
local hanging_node
|
||||||
|
if math.random() < 0.5 then
|
||||||
|
hanging_node = c_ivy
|
||||||
|
else
|
||||||
|
hanging_node = c_root_2
|
||||||
|
end
|
||||||
|
for i = 1, math.random(16) do
|
||||||
|
if data[index] == c_air then
|
||||||
|
data[index] = hanging_node
|
||||||
|
index = index - ystride
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local jungle_warren_ceiling = function(abs_cracks, vi, area, data, data_param2)
|
||||||
|
if abs_cracks < 0.1 then
|
||||||
|
data[vi] = c_glowstone
|
||||||
|
elseif abs_cracks > 0.75 and math.random() < 0.1 then
|
||||||
|
local ystride = area.ystride
|
||||||
|
data[vi] = c_dirt
|
||||||
|
local index = vi - ystride
|
||||||
|
local hanging_node
|
||||||
|
if math.random() < 0.5 then
|
||||||
|
hanging_node = c_root_1
|
||||||
|
else
|
||||||
|
hanging_node = c_root_2
|
||||||
|
end
|
||||||
|
for i = 1, math.random(8) do
|
||||||
|
if data[index] == c_air then
|
||||||
|
data[index] = hanging_node
|
||||||
|
index = index - ystride
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local jungle_warren_floor = function(abs_cracks, vi, area, data, data_param2)
|
||||||
|
local ystride = area.ystride
|
||||||
|
if abs_cracks < 0.7 then
|
||||||
|
data[vi] = c_jungle_dirt
|
||||||
|
local rand = math.random() * abs_cracks
|
||||||
|
if rand < 0.1 then
|
||||||
|
data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)]
|
||||||
|
end
|
||||||
|
elseif abs_cracks < 1 then
|
||||||
|
data[vi] = c_dirt
|
||||||
|
end
|
||||||
|
|
||||||
|
if c_fireflies and math.random() < 0.005 then
|
||||||
|
local firefly_vi = vi + ystride * math.random(1, 5)
|
||||||
|
if data[firefly_vi] == c_air then
|
||||||
|
data[firefly_vi] = c_fireflies
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
---------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, data)
|
||||||
|
math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs
|
||||||
|
|
||||||
|
local data_param2 = df_caverns.data_param2
|
||||||
|
vm:get_param2_data(data_param2)
|
||||||
|
local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks)
|
||||||
|
local cave_area = node_arrays.cave_area
|
||||||
|
local nvals_cave = node_arrays.nvals_cave
|
||||||
|
|
||||||
|
local humiditymap = minetest.get_mapgen_object("humiditymap")
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------------
|
||||||
|
-- Cavern floors
|
||||||
|
|
||||||
|
for _, vi in ipairs(node_arrays.cavern_floor_nodes) do
|
||||||
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
local abs_cracks = math.abs(cracks)
|
||||||
|
local humidity = humiditymap[index2d]
|
||||||
|
local jungle = nvals_cave[vi] < 0
|
||||||
|
|
||||||
|
if jungle then
|
||||||
|
jungle_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
else
|
||||||
|
mushroom_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------
|
||||||
|
-- Cavern ceilings
|
||||||
|
|
||||||
|
for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do
|
||||||
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
local abs_cracks = math.abs(cracks)
|
||||||
|
local jungle = nvals_cave[vi] < 0
|
||||||
|
local humidity = humiditymap[index2d]
|
||||||
|
if jungle then
|
||||||
|
jungle_cavern_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||||
|
else
|
||||||
|
mushroom_cavern_ceiling(abs_cracks, humidity, vi, area, data, data_param2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------
|
||||||
|
-- Tunnel floors
|
||||||
|
|
||||||
|
-- for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||||
|
-- end
|
||||||
|
|
||||||
|
------------------------------------------------------
|
||||||
|
-- Tunnel ceiling
|
||||||
|
|
||||||
|
-- for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||||
|
-- end
|
||||||
|
|
||||||
|
------------------------------------------------------
|
||||||
|
-- Warren ceiling
|
||||||
|
|
||||||
|
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||||
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
local abs_cracks = math.abs(cracks)
|
||||||
|
local jungle = nvals_cave[vi] < 0
|
||||||
|
|
||||||
|
if jungle then
|
||||||
|
jungle_warren_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||||
|
else
|
||||||
|
mushroom_warren_ceiling(abs_cracks, vi, area, data, data_param2)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------
|
||||||
|
-- Warren floors
|
||||||
|
|
||||||
|
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||||
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
local abs_cracks = math.abs(cracks)
|
||||||
|
local jungle = nvals_cave[vi] < 0
|
||||||
|
|
||||||
|
if jungle then
|
||||||
|
jungle_warren_floor(abs_cracks, vi, area, data, data_param2)
|
||||||
|
else
|
||||||
|
mushroom_warren_floor(abs_cracks, vi, area, data, data_param2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- columns
|
||||||
|
-- no flowstone below the Sunless Sea, replace with something else
|
||||||
|
local random_dir = {1, -1, area.zstride, -area.zstride}
|
||||||
|
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||||
|
local jungle = nvals_cave[vi] < 0
|
||||||
|
if jungle then
|
||||||
|
data[vi] = c_plant_matter
|
||||||
|
minetest.get_node_timer(area:position(vi)):start(math.random(30, 120))
|
||||||
|
else
|
||||||
|
data[vi] = c_mycelial_dirt
|
||||||
|
if math.random() < 0.05 then
|
||||||
|
local rand_vi = vi + random_dir[math.random(1,4)]
|
||||||
|
if data[rand_vi] == c_air then
|
||||||
|
data[rand_vi] = c_giant_mycelium
|
||||||
|
minetest.get_node_timer(area:position(rand_vi)):start(math.random(1,giant_mycelium_timer_spread))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
vm:set_param2_data(data_param2)
|
||||||
|
end
|
||||||
|
|
||||||
|
--Primordial Caverns
|
||||||
|
subterrane.register_layer({
|
||||||
|
name = "primordial",
|
||||||
|
y_max = df_caverns.config.primordial_max,
|
||||||
|
y_min = df_caverns.config.primordial_min,
|
||||||
|
cave_threshold = df_caverns.config.sunless_sea_threshold, -- Make the caves a bit bigger than above
|
||||||
|
perlin_cave = perlin_cave_primordial,
|
||||||
|
perlin_wave = perlin_wave_primordial,
|
||||||
|
solidify_lava = true,
|
||||||
|
columns = {
|
||||||
|
maximum_radius = 20,
|
||||||
|
minimum_radius = 5,
|
||||||
|
node = "default:stone", -- no flowstone below the Sunless Sea, replace with something else
|
||||||
|
weight = 0.5,
|
||||||
|
maximum_count = 60,
|
||||||
|
minimum_count = 10,
|
||||||
|
},
|
||||||
|
decorate = decorate_primordial,
|
||||||
|
double_frequency = true,
|
||||||
|
is_ground_content = df_caverns.is_ground_content,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there.
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Primordial plant growth",
|
||||||
|
nodenames = {"df_primordial_items:dirt_with_jungle_grass"},
|
||||||
|
neighbors = {"air"},
|
||||||
|
interval = 60.0,
|
||||||
|
chance = 50,
|
||||||
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
|
if minetest.find_node_near(pos, 2, {"group:primordial_jungle_plant"}) == nil then
|
||||||
|
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||||
|
local node_above = minetest.get_node(pos_above)
|
||||||
|
if node_above.name == "air" then
|
||||||
|
minetest.set_node(pos_above, {name = jungle_plant_names[math.random(1,#jungle_plant_names)]})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Primordial fungus growth",
|
||||||
|
nodenames = {"df_primordial_items:dirt_with_mycelium"},
|
||||||
|
neighbors = {"air"},
|
||||||
|
interval = 60.0,
|
||||||
|
chance = 50,
|
||||||
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
|
if minetest.find_node_near(pos, 3, {"group:primordial_fungal_plant"}) == nil then
|
||||||
|
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||||
|
local node_above = minetest.get_node(pos_above)
|
||||||
|
if node_above.name == "air" then
|
||||||
|
minetest.set_node(pos_above, {name = fungal_plant_names[math.random(1,#fungal_plant_names)]})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
BIN
df_caverns/screenshots/cave_pearls.jpg
Normal file
After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 146 KiB |
BIN
df_caverns/screenshots/mysterious_seal.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
df_caverns/screenshots/primordial_fungal.jpg
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
df_caverns/screenshots/primordial_jungle.jpg
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
df_caverns/screenshots/spindlestems.jpg
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 40 KiB |
@ -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
|
@ -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
|
@ -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,
|
||||||
})
|
})
|
||||||
|
@ -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
|
||||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
-- this may be a floor, but only if we eventually hit a ceiling in this column
|
||||||
local humidity = humiditymap[index2d]
|
previous_potential_floor_vi = vi-area.ystride
|
||||||
df_caverns.tunnel_floor(minp, maxp, area, vi-area.ystride, nvals_cracks, data, data_param2, humidity > 30)
|
previous_potential_floor_y = y-1
|
||||||
|
elseif current_node == c_stone and previous_node == c_air and previous_potential_floor_vi then
|
||||||
|
-- we hit a ceiling after passing through a floor
|
||||||
|
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
||||||
|
local humidity = humiditymap[index2d]
|
||||||
|
if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then
|
||||||
|
df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30)
|
||||||
end
|
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)
|
||||||
|
@ -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
|
end
|
||||||
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))
|
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
|
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)
|
||||||
|
18
df_caverns/underworld_names.cfg
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
name "glowing_pits" {
|
||||||
|
customGroupA = "Actinic, Amethyst, Angry, Atrocious, Bad, Blighted, Baneful, Baleful, Beastly, Calamitous, Corrupt, Crazed, Damnable, Demoniacal, Demonic, Depraved, Destructive, Devilish, Diabolical, Disastrous, Execrable, Fiendish, Foul, Frenzied, Glaring, Harmful, Hateful, Heinous, Hellish, Hideous, Infernal, Iniquitous, Injurious, Loathsome, Lost, Maleficent, Malevolent, Malicious, Malignant, Manic, Nefarious, Nightmare, Obscene, Offensive, Pernicious, Poison, Possessed, Rancorous, Repugnant, Repulsive, Revolting, Spiteful, Unhallowed, Unpleasant, Vicious, Vile, Villainous, Violent, Wicked, Wrathful"
|
||||||
|
|
||||||
|
customGroupB = "Abyss, Aperture, Breach, Cavity, Chasm, Crevasse, Depth, Deep, Fissure, Funnel, Gate, Gulf, Hell, Hole, Hollow, Inferno, Maw, Mouth, Opening, Pit, Portal, Puncture, Ravager, Rent, Rift, Rim, Schism, Shaft, Split, Throat, Void, Well"
|
||||||
|
|
||||||
|
customGroupC = "Adversity, Affliction, Annihilation, Bale, Bane, Blight, Calamity, Cataclysm, Catastrophe, Collapse, Conclusion, Condemnation, Death, Defeat, Destiny, Destruction, Disaster, Doom, Downfall, Failure, Grief, Harm, Hazard, Judgment, Karma, Misadventure, Mischance, Misfortune, Mishap, Ruin, Ruination, Tragedy, Undoing, Verdict, Woe"
|
||||||
|
|
||||||
|
rules = "%50The_$A_$B, The_$B_of_$C, %10The_$A_$B_of_$C"
|
||||||
|
}
|
||||||
|
|
||||||
|
name "underworld_ruins" {
|
||||||
|
|
||||||
|
customGroupA = "Abandoned, Absent, Adrift, Alien, Anonymous, Bare, Barren, Blank, Buried, Clandestine, Cloaked, Concealed, Covered, Cryptic, Dark, Dead, Depleted, Deserted, Desolate, Despoiled, Destitute, Devoid, Disappeared, Distant, Exhausted, Empty, Forfeit, Forfeited, Forsaken, Hidden, Incognito, Indiscernible, Invisible, Irretrievable, Irrevocable, Masked, Mislaid, Misplaced, Mystic, Mystical, Nameless, Obscured, Secluded, Secret, Sequestered, Shadowy, Shrouded, Stark, Strange, Uncelebrated, Uncharted, Undiscovered, Unexplained, Unexplored, Unfamiliar, Unfilled, Unidentified, Unknown, Unnamed, Unredeemed, Unsung, Untold, Vacant, Vacated, Vanished, Veiled, Wayward, Warrior's, King's, Knave's, Coward's, Cardinal's, Priest's, Soldier's, Noble, Steadfast, Children's, Howling, Silent, Grinding, Dusty"
|
||||||
|
|
||||||
|
customGroupB = "Temple, Chapel, House, Sanctuary, Shrine, Fortress, Tomb, Crypt, Graves, Citadel, Garrison, Rampart, Redoubt, Refuge, Asylum, Haven, Hideout, Retreat, Shelter, Stronghold, Covert, Den, Settlement, Preserve, Seat, Watch, Bulwark, Necropolis, Catacomb, Ruin, Hulk, Wreck"
|
||||||
|
|
||||||
|
rules = "The_$A_$B"
|
||||||
|
}
|
@ -17,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
|
@ -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")
|
||||||
|
@ -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
|
minetest.register_craft({
|
||||||
simplecrafting_lib.register("cooking", {
|
type = "shapeless",
|
||||||
input = {
|
output = "df_farming:"..item.."_simple_meal",
|
||||||
["group:dfcaverns_cookable"] = 1,
|
recipe = {"group:dfcaverns_cookable", prefix..":"..item},
|
||||||
[prefix..":"..item] = 1,
|
replacements = replacements
|
||||||
},
|
})
|
||||||
output = {
|
minetest.register_craft({
|
||||||
["df_farming:"..item.."_biscuit"] = 1,
|
type = "shapeless",
|
||||||
},
|
output = "df_farming:"..item.."_medium_meal",
|
||||||
cooktime = 5.0,
|
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
||||||
})
|
replacements = replacements
|
||||||
simplecrafting_lib.register("cooking", {
|
})
|
||||||
input = {
|
minetest.register_craft({
|
||||||
["group:dfcaverns_cookable"] = 2,
|
type = "shapeless",
|
||||||
[prefix..":"..item] = 1,
|
output = "df_farming:"..item.."_complex_meal",
|
||||||
},
|
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
||||||
output = {
|
replacements = replacements
|
||||||
["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({
|
|
||||||
type = "shapeless",
|
|
||||||
output = "df_farming:"..item.."_biscuit",
|
|
||||||
recipe = {"group:dfcaverns_cookable", prefix..":"..item},
|
|
||||||
replacements = returns
|
|
||||||
})
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = "df_farming:"..item.."_stew",
|
|
||||||
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
|
||||||
replacements = returns
|
|
||||||
})
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = "df_farming:"..item.."_roast",
|
|
||||||
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
|
||||||
replacements = returns
|
|
||||||
})
|
|
||||||
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
|
@ -1,9 +0,0 @@
|
|||||||
default
|
|
||||||
farming?
|
|
||||||
cottages?
|
|
||||||
bucket?
|
|
||||||
dynamic_liquid?
|
|
||||||
wool?
|
|
||||||
intllib?
|
|
||||||
doc?
|
|
||||||
simplecrafting_lib?
|
|
@ -1 +0,0 @@
|
|||||||
Adds farmable underground plants that die in sunlight. Also includes various cooking reactions.
|
|
@ -16,9 +16,16 @@ local register_dimple_cup = function(number)
|
|||||||
paramtype = "light",
|
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)
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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 ""
|
||||||
|
@ -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
|
||||||
|
@ -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
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
BIN
df_farming/sounds/df_farming_chomp_crunch.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_chomp_crunch.4.ogg
Normal file
BIN
df_farming/sounds/df_farming_crisp_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_crisp_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_gummy_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_mushy_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.1.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.2.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.3.ogg
Normal file
BIN
df_farming/sounds/df_farming_soft_chew.4.ogg
Normal file
5
df_farming/sounds/license.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
df_farming_gummy_chew 1,2 and 3 are from https://freesound.org/people/Breviceps/sounds/447916/ by Breviceps under the CC0 public domain license
|
||||||
|
df_farming_chomp_crunch are from https://freesound.org/people/bbrocer/sounds/382650/ by bbrocer under the CC0 public domain license
|
||||||
|
df_farming_crisp_chew 1 and 2 are from https://freesound.org/people/InspectorJ/sounds/412068/ by InspectorJ under the CC-BY-SA 3.0 license
|
||||||
|
df_farming_soft_chew 1, 2, 3 and 4 are from https://freesound.org/people/miekyj/sounds/326464/ by miekyj under the CC0 public domain license
|
||||||
|
df_farming_mushy_chew 1, 2 and 3 are from https://freesound.org/people/nickyg11p/sounds/390800/ by nickyg11p under the CC0 public domain license
|
@ -15,10 +15,17 @@ local register_sweet_pod = function(number)
|
|||||||
inventory_image = "dfcaverns_sweet_pod_"..tostring(number)..".png",
|
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({
|
||||||
|
Before Width: | Height: | Size: 550 B |
Before Width: | Height: | Size: 391 B |
BIN
df_farming/textures/dfcaverns_cave_straw.png
Normal file
After Width: | Height: | Size: 838 B |
Before Width: | Height: | Size: 174 B After Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 188 B After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 267 B After Width: | Height: | Size: 208 B |
BIN
df_farming/textures/dfcaverns_cave_wheat_flattened.png
Normal file
After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 383 B After Width: | Height: | Size: 380 B |
Before Width: | Height: | Size: 634 B After Width: | Height: | Size: 633 B |
Before Width: | Height: | Size: 818 B After Width: | Height: | Size: 802 B |
BIN
df_farming/textures/dfcaverns_pig_tail_flattened.png
Normal file
After Width: | Height: | Size: 694 B |
BIN
df_farming/textures/dfcaverns_prepared_food01x16.png
Normal file
After Width: | Height: | Size: 820 B |
BIN
df_farming/textures/dfcaverns_prepared_food01x32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food02x16.png
Normal file
After Width: | Height: | Size: 928 B |
BIN
df_farming/textures/dfcaverns_prepared_food02x32.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food03x16.png
Normal file
After Width: | Height: | Size: 804 B |
BIN
df_farming/textures/dfcaverns_prepared_food03x32.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food04x16.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food04x32.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food05x16.png
Normal file
After Width: | Height: | Size: 706 B |
BIN
df_farming/textures/dfcaverns_prepared_food05x32.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food06x16.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
df_farming/textures/dfcaverns_prepared_food06x32.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food07x16.png
Normal file
After Width: | Height: | Size: 908 B |
BIN
df_farming/textures/dfcaverns_prepared_food07x32.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food08x16.png
Normal file
After Width: | Height: | Size: 757 B |
BIN
df_farming/textures/dfcaverns_prepared_food08x32.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food09x16.png
Normal file
After Width: | Height: | Size: 706 B |
BIN
df_farming/textures/dfcaverns_prepared_food09x32.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food10x16.png
Normal file
After Width: | Height: | Size: 904 B |
BIN
df_farming/textures/dfcaverns_prepared_food10x32.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
df_farming/textures/dfcaverns_prepared_food11x16.png
Normal file
After Width: | Height: | Size: 993 B |