Compare commits
3 Commits
small_stuf
...
v2.0
Author | SHA1 | Date | |
---|---|---|---|
64020d1384 | |||
98fb313eb1 | |||
12919e9a16 |
@ -16,6 +16,8 @@ Below the Sunless Sea are seas of a more dangerous sort: lakes of oil and the ma
|
|||||||
|
|
||||||
At the very foundation of the world lies an ancient impenetrable realm. There are signs that life once existed here but it is now long gone. Its dead hollows rest on a layer of Slade, a dense material impervious to conventional mining efforts.
|
At the very foundation of the world lies an ancient impenetrable realm. There are signs that life once existed here but it is now long gone. Its dead hollows rest on a layer of Slade, a dense material impervious to conventional mining efforts.
|
||||||
|
|
||||||
|
Unconventional methods of penetrating the Slade do exist, however. And should it be breached, the exotic Primordial cavern layer can be found beneath.
|
||||||
|
|
||||||
## Other Features
|
## Other Features
|
||||||
|
|
||||||
The giant caverns generated by this mod differ slightly from the default giant caverns found in some mapgens, they use an additional source of noise to generate more ledges and horizontal floors. They also contain stalactites and stalagmites of various sizes - from single-node spikes decorating the default twisty tunnels to mountainous behemoths in the main caverns that can reach tens of meters in diameter and hundreds of meters in height.
|
The giant caverns generated by this mod differ slightly from the default giant caverns found in some mapgens, they use an additional source of noise to generate more ledges and horizontal floors. They also contain stalactites and stalagmites of various sizes - from single-node spikes decorating the default twisty tunnels to mountainous behemoths in the main caverns that can reach tens of meters in diameter and hundreds of meters in height.
|
||||||
@ -37,3 +39,5 @@ The "[doc](https://forum.minetest.net/viewtopic.php?f=9&t=15912&p=240152)" mod i
|
|||||||
"[ropes](https://github.com/minetest-mods/ropes)" are very useful for navigating some of the large open spaces this mod provides.
|
"[ropes](https://github.com/minetest-mods/ropes)" are very useful for navigating some of the large open spaces this mod provides.
|
||||||
|
|
||||||
"[radiant damage](https://github.com/FaceDeer/radiant_damage)" greatly increases the danger of the Magma Sea if heat radiance is enabled, as well as several of the rare crystals in the deeper layers that emit Mese radiation if that damage type is enabled.
|
"[radiant damage](https://github.com/FaceDeer/radiant_damage)" greatly increases the danger of the Magma Sea if heat radiance is enabled, as well as several of the rare crystals in the deeper layers that emit Mese radiation if that damage type is enabled.
|
||||||
|
|
||||||
|
Adding "[named_waypoints](https://github.com/FaceDeer/named_waypoints)" and "[namegen](https://github.com/FaceDeer/namegen)" will provide some landmarks in the Underworld that a player can use to navigate by.
|
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
|
||||||
|
if math.random() < 0.01 then
|
||||||
df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
|
df_trees.spawn_tower_cap_vm(vi+ystride, area, data)
|
||||||
|
elseif math.random() < 0.04 then
|
||||||
|
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_spindlestem_white)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -71,6 +77,8 @@ local fungiwood_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, d
|
|||||||
df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungiwood_shrublist)
|
df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungiwood_shrublist)
|
||||||
elseif math.random() < 0.03 and abs_cracks > 0.35 then
|
elseif math.random() < 0.03 and abs_cracks > 0.35 then
|
||||||
df_trees.spawn_fungiwood_vm(vi+ystride, area, data)
|
df_trees.spawn_fungiwood_vm(vi+ystride, area, data)
|
||||||
|
elseif math.random() < 0.04 then
|
||||||
|
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -88,8 +96,9 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
|
|
||||||
-- Partly fill flooded caverns and warrens
|
-- Partly fill flooded caverns and warrens
|
||||||
if minp.y <= subsea_level then
|
if minp.y <= subsea_level then
|
||||||
for vi in area:iterp(minp, maxp) do
|
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||||
if data[vi] == c_air and area:get_y(vi) <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then
|
-- convert all air below sea level into water
|
||||||
|
if y <= subsea_level and data[vi] == c_air and nvals_cave[vi] < -flooding_threshold then
|
||||||
data[vi] = c_water
|
data[vi] = c_water
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -103,7 +112,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local abs_cracks = math.abs(nvals_cracks[index2d])
|
local abs_cracks = math.abs(nvals_cracks[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||||
-- underwater floor
|
-- underwater floor
|
||||||
@ -129,7 +138,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local abs_cracks = math.abs(nvals_cracks[index2d])
|
local abs_cracks = math.abs(nvals_cracks[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||||
-- underwater ceiling, do nothing
|
-- underwater ceiling, do nothing
|
||||||
@ -156,7 +165,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -174,7 +183,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -202,7 +211,8 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
local ystride = area.ystride
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -211,6 +221,26 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
else
|
else
|
||||||
df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if biome_name ~= "barren" then
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
if cracks > 0.25 then
|
||||||
|
local rand = math.random()
|
||||||
|
if rand > cracks then
|
||||||
|
if math.random() < 0.25 then
|
||||||
|
data[vi] = c_dirt_moss
|
||||||
|
else
|
||||||
|
data[vi] = c_dirt
|
||||||
|
end
|
||||||
|
if data[vi+ystride] == c_air and math.random() < 0.25 then
|
||||||
|
df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if rand > cracks*2 then
|
||||||
|
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -220,7 +250,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -239,7 +269,7 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0)
|
local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
|
||||||
|
|
||||||
if dry and data[vi] == c_wet_flowstone then
|
if dry and data[vi] == c_wet_flowstone then
|
||||||
data[vi] = c_dry_flowstone
|
data[vi] = c_dry_flowstone
|
||||||
@ -271,4 +301,5 @@ subterrane.register_layer({
|
|||||||
decorate = decorate_level_1,
|
decorate = decorate_level_1,
|
||||||
warren_region_variability_threshold = 0.33,
|
warren_region_variability_threshold = 0.33,
|
||||||
double_frequency = true,
|
double_frequency = true,
|
||||||
|
is_ground_content = df_caverns.is_ground_content,
|
||||||
})
|
})
|
@ -18,6 +18,8 @@ local wall_vein_perlin_params = {
|
|||||||
flags = "eased",
|
flags = "eased",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local c_pearls = minetest.get_content_id("df_mapitems:cave_pearls")
|
||||||
|
|
||||||
local subsea_level = df_caverns.config.level2_min - (df_caverns.config.level2_min - df_caverns.config.level1_min) * 0.33 -- "sea level" for the flooded caverns.
|
local subsea_level = df_caverns.config.level2_min - (df_caverns.config.level2_min - df_caverns.config.level1_min) * 0.33 -- "sea level" for the flooded caverns.
|
||||||
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) -- cavern value out to which we're flooding tunnels and warrens
|
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) -- cavern value out to which we're flooding tunnels and warrens
|
||||||
|
|
||||||
@ -60,6 +62,8 @@ if minetest.get_modpath("df_farming") then
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local c_red = minetest.get_content_id("df_trees:spindlestem_cap_red")
|
||||||
|
|
||||||
local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
|
local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
|
||||||
local ystride = area.ystride
|
local ystride = area.ystride
|
||||||
if abs_cracks < 0.1 then
|
if abs_cracks < 0.1 then
|
||||||
@ -72,8 +76,10 @@ local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
|||||||
end
|
end
|
||||||
if math.random() < 0.1 then
|
if math.random() < 0.1 then
|
||||||
df_caverns.place_shrub(vi+ystride, area, data, data_param2, goblin_cap_shrublist)
|
df_caverns.place_shrub(vi+ystride, area, data, data_param2, goblin_cap_shrublist)
|
||||||
|
elseif math.random() < 0.02 then
|
||||||
|
df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_red)
|
||||||
elseif math.random() < 0.015 then
|
elseif math.random() < 0.015 then
|
||||||
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data)
|
df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -92,7 +98,7 @@ local spore_tree_cavern_floor = function(abs_cracks, vert_rand, vi, area, data,
|
|||||||
if math.random() < 0.1 then
|
if math.random() < 0.1 then
|
||||||
df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist)
|
df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist)
|
||||||
elseif math.random() < 0.05 then
|
elseif math.random() < 0.05 then
|
||||||
df_trees.spawn_spore_tree_vm(vi+ystride, area, data)
|
df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -129,12 +135,13 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local cavern_def = node_arrays.cavern_def
|
local cavern_def = node_arrays.cavern_def
|
||||||
|
|
||||||
local vein_noise
|
local vein_noise
|
||||||
|
local vein_area
|
||||||
|
|
||||||
-- Partly fill flooded caverns and warrens
|
-- Partly fill flooded caverns and warrens
|
||||||
for vi in area:iterp(minp, maxp) do
|
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||||
local cave_val = nvals_cave[cave_area:transform(area, vi)]
|
local cave_val = nvals_cave[vi]
|
||||||
if cave_val < -flooding_threshold then
|
if cave_val < -flooding_threshold then
|
||||||
|
if mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp) then
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local cave_threshold = cavern_def.cave_threshold
|
local cave_threshold = cavern_def.cave_threshold
|
||||||
@ -143,14 +150,14 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then
|
||||||
-- add giant rooty structures to the flooded barren caverns
|
-- add giant rooty structures to the flooded barren caverns
|
||||||
if vein_noise == nil then
|
if vein_noise == nil then
|
||||||
vein_noise = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
|
vein_noise, vein_area = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params)
|
||||||
end
|
end
|
||||||
-- we can reuse cave_area here, its extents are minp, maxp too.
|
if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then
|
||||||
if data[vi] == c_air and math.abs(vein_noise[cave_area:transform(area, vi)]) < 0.02 then
|
|
||||||
data[vi] = c_veinstone
|
data[vi] = c_veinstone
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if data[vi] == c_air and area:get_y(vi) <= subsea_level then
|
end
|
||||||
|
if data[vi] == c_air and y <= subsea_level then
|
||||||
data[vi] = c_water -- otherwise, fill air with water when below sea level
|
data[vi] = c_water -- otherwise, fill air with water when below sea level
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -164,7 +171,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local abs_cracks = math.abs(nvals_cracks[index2d])
|
local abs_cracks = math.abs(nvals_cracks[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||||
-- underwater floor
|
-- underwater floor
|
||||||
@ -192,7 +199,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local abs_cracks = math.abs(nvals_cracks[index2d])
|
local abs_cracks = math.abs(nvals_cracks[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||||
-- underwater ceiling, do nothing
|
-- underwater ceiling, do nothing
|
||||||
@ -224,7 +231,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -242,7 +249,8 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
local ystride = area.ystride
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -251,13 +259,23 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
else
|
else
|
||||||
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
||||||
end
|
end
|
||||||
|
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
|
||||||
|
for i= 1, 4 do
|
||||||
|
if math.random() > 0.5 then
|
||||||
|
local index = vi-i*ystride
|
||||||
|
if data[index] == c_air then
|
||||||
|
df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
-- air pockets
|
-- air pockets
|
||||||
local ystride = area.ystride
|
local ystride = area.ystride
|
||||||
local cracks = nvals_cracks[index2d]
|
local cracks = nvals_cracks[index2d]
|
||||||
if cracks > 0.5 and data[vi-ystride] == c_water then
|
if cracks > 0.4 and data[vi-ystride] == c_water then
|
||||||
data[vi-ystride] = c_air
|
data[vi-ystride] = c_air
|
||||||
if cracks > 0.7 and data[vi-ystride*2] == c_water then
|
if cracks > 0.6 and data[vi-ystride*2] == c_water then
|
||||||
data[vi-ystride*2] = c_air
|
data[vi-ystride*2] = c_air
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -270,7 +288,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -288,7 +306,8 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
local ystride = area.ystride
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name ~= "barren" then
|
if flooded_caverns or biome_name ~= "barren" then
|
||||||
@ -297,8 +316,28 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
else
|
else
|
||||||
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then
|
||||||
|
for i= 1, 4 do
|
||||||
|
if math.random() > 0.5 then
|
||||||
|
local index = vi-i*ystride
|
||||||
|
if data[index] == c_air then
|
||||||
|
df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2)
|
||||||
end
|
end
|
||||||
-- else air pockets?
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- air pockets
|
||||||
|
local cracks = nvals_cracks[index2d]
|
||||||
|
if cracks > 0.4 and data[vi-ystride] == c_water then
|
||||||
|
data[vi-ystride] = c_air
|
||||||
|
if cracks > 0.6 and data[vi-ystride*2] == c_water then
|
||||||
|
data[vi-ystride*2] = c_air
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
@ -307,7 +346,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local dry = (biome_name == "barren") and (nvals_cave[cave_area:transform(area, vi)] > 0)
|
local dry = (biome_name == "barren") and (nvals_cave[vi] > 0)
|
||||||
|
|
||||||
if dry and data[vi] == c_wet_flowstone then
|
if dry and data[vi] == c_wet_flowstone then
|
||||||
data[vi] = c_dry_flowstone
|
data[vi] = c_dry_flowstone
|
||||||
@ -337,5 +376,6 @@ subterrane.register_layer({
|
|||||||
decorate = decorate_level_2,
|
decorate = decorate_level_2,
|
||||||
warren_region_variability_threshold = 0.33,
|
warren_region_variability_threshold = 0.33,
|
||||||
double_frequency = true,
|
double_frequency = true,
|
||||||
|
is_ground_content = df_caverns.is_ground_content,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -20,12 +20,15 @@ local c_dry_flowstone = minetest.get_content_id("df_mapitems:dry_flowstone")
|
|||||||
|
|
||||||
local c_glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore")
|
local c_glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore")
|
||||||
|
|
||||||
|
local c_salty_cobble = minetest.get_content_id("df_mapitems:salty_cobble")
|
||||||
|
local c_salt_crystal = minetest.get_content_id("df_mapitems:salt_crystal")
|
||||||
|
|
||||||
local c_sprite
|
local c_sprite
|
||||||
if minetest.get_modpath("ice_sprites") then
|
if minetest.get_modpath("ice_sprites") then
|
||||||
c_sprite = minetest.get_content_id("ice_sprites:ice_sprite")
|
c_sprite = minetest.get_content_id("ice_sprites:ice_sprite")
|
||||||
end
|
end
|
||||||
|
|
||||||
local subsea_level = df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33
|
local subsea_level = math.floor(df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33)
|
||||||
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold)
|
local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold)
|
||||||
|
|
||||||
local ice_thickness = 3
|
local ice_thickness = 3
|
||||||
@ -157,20 +160,28 @@ local nether_cap_cavern_ceiling = function(abs_cracks, vert_rand, vi, area, data
|
|||||||
end
|
end
|
||||||
|
|
||||||
local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
|
local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2)
|
||||||
|
local ai = vi+area.ystride
|
||||||
|
|
||||||
if abs_cracks < 0.075 then
|
if abs_cracks < 0.075 then
|
||||||
if vert_rand < 0.004 then
|
if vert_rand < 0.004 then
|
||||||
subterrane.big_stalagmite(vi+area.ystride, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
|
subterrane.big_stalagmite(ai, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone)
|
||||||
|
elseif data[vi] ~= c_air and math.random() < 0.5 then
|
||||||
|
data[vi] = c_salty_cobble
|
||||||
|
if data[ai] == c_air and math.random() < 0.25 then
|
||||||
|
data[ai] = c_salt_crystal
|
||||||
|
data_param2[ai] = math.random(1,4)-1
|
||||||
|
end
|
||||||
else
|
else
|
||||||
local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4
|
local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4
|
||||||
local height = math.floor(abs_cracks * 66)
|
local height = math.floor(abs_cracks * 66)
|
||||||
subterrane.stalagmite(vi+area.ystride, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids)
|
subterrane.stalagmite(ai, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids)
|
||||||
end
|
end
|
||||||
elseif math.random() > abs_cracks + 0.66 then
|
elseif math.random() > abs_cracks + 0.66 then
|
||||||
df_trees.spawn_blood_thorn_vm(vi+area.ystride, area, data, data_param2)
|
df_trees.spawn_blood_thorn_vm(ai, area, data, data_param2)
|
||||||
data[vi] = c_desert_sand
|
data[vi] = c_desert_sand
|
||||||
else
|
else
|
||||||
if math.random() < 0.1 then
|
if math.random() < 0.1 then
|
||||||
df_caverns.place_shrub(vi+area.ystride, area, data, data_param2, blood_thorn_shrublist)
|
df_caverns.place_shrub(ai, area, data, data_param2, blood_thorn_shrublist)
|
||||||
data[vi] = c_desert_sand
|
data[vi] = c_desert_sand
|
||||||
elseif math.random() > 0.25 then
|
elseif math.random() > 0.25 then
|
||||||
data[vi] = c_desert_sand
|
data[vi] = c_desert_sand
|
||||||
@ -196,20 +207,19 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
|
|
||||||
-- Partly fill flooded caverns and warrens
|
-- Partly fill flooded caverns and warrens
|
||||||
if minp.y <= subsea_level then
|
if minp.y <= subsea_level then
|
||||||
for vi in area:iterp(minp, maxp) do
|
for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do
|
||||||
local y = area:get_y(vi)
|
local cave = nvals_cave[vi]
|
||||||
if y <= subsea_level and nvals_cave[cave_area:transform(area, vi)] < -flooding_threshold then
|
if y <= subsea_level and cave < -flooding_threshold then
|
||||||
if data[vi] == c_air and y <= subsea_level then
|
if data[vi] == c_air and y <= subsea_level then
|
||||||
data[vi] = c_water
|
data[vi] = c_water
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if (mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp)) then
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
|
|
||||||
if biome_name == "blackcap" then
|
if biome_name == "blackcap" then
|
||||||
-- oil slick
|
-- oil slick
|
||||||
local cave = math.abs(nvals_cave[cave_area:transform(area, vi)])
|
if y == subsea_level and data[vi] == c_water and math.abs(cave) + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
|
||||||
if y == subsea_level and data[vi] == c_water and cave + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then
|
|
||||||
data[vi] = c_oil
|
data[vi] = c_oil
|
||||||
end
|
end
|
||||||
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then
|
||||||
@ -219,6 +229,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
-- Cavern floors
|
-- Cavern floors
|
||||||
@ -229,7 +240,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local cracks = nvals_cracks[index2d]
|
local cracks = nvals_cracks[index2d]
|
||||||
local abs_cracks = math.abs(cracks)
|
local abs_cracks = math.abs(cracks)
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||||
-- underwater floor
|
-- underwater floor
|
||||||
@ -274,7 +285,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local abs_cracks = math.abs(nvals_cracks[index2d])
|
local abs_cracks = math.abs(nvals_cracks[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||||
-- underwater ceiling, do nothing
|
-- underwater ceiling, do nothing
|
||||||
@ -310,7 +321,16 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
else
|
else
|
||||||
-- bloodthorn ceiling
|
-- bloodthorn ceiling
|
||||||
if abs_cracks < 0.075 then
|
if abs_cracks < 0.075 then
|
||||||
|
if data[vi] ~= c_air and math.random() < 0.5 then
|
||||||
|
data[vi] = c_salty_cobble
|
||||||
|
local bi = vi - area.ystride
|
||||||
|
if data[bi] == c_air and math.random() < 0.25 then
|
||||||
|
data[bi] = c_salt_crystal
|
||||||
|
data_param2[bi] = 19 + math.random(1,4)
|
||||||
|
end
|
||||||
|
else
|
||||||
df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false)
|
df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false)
|
||||||
|
end
|
||||||
elseif abs_cracks > 0.75 and math.random() < 0.05 then
|
elseif abs_cracks > 0.75 and math.random() < 0.05 then
|
||||||
data[vi] = c_glow_ore
|
data[vi] = c_glow_ore
|
||||||
df_mapitems.place_big_crystal(data, data_param2, vi-area.ystride, true)
|
df_mapitems.place_big_crystal(data, data_param2, vi-area.ystride, true)
|
||||||
@ -326,7 +346,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name == "blackcap" then
|
if flooded_caverns or biome_name == "blackcap" then
|
||||||
@ -344,7 +364,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then
|
||||||
if flooded_caverns or biome_name == "blackcap" then
|
if flooded_caverns or biome_name == "blackcap" then
|
||||||
@ -373,7 +393,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then
|
||||||
-- underwater ceiling, do nothing
|
-- underwater ceiling, do nothing
|
||||||
@ -411,7 +431,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
for _, vi in ipairs(node_arrays.warren_floor_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not.
|
||||||
|
|
||||||
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then
|
||||||
-- underwater floor, do nothing
|
-- underwater floor, do nothing
|
||||||
@ -453,7 +473,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data)
|
|||||||
for _, vi in ipairs(node_arrays.column_nodes) do
|
for _, vi in ipairs(node_arrays.column_nodes) do
|
||||||
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
local index2d = mapgen_helper.index2di(minp, maxp, area, vi)
|
||||||
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
local biome_name = get_biome(heatmap[index2d], humiditymap[index2d])
|
||||||
local flooded_caverns = nvals_cave[cave_area:transform(area, vi)] < 0
|
local flooded_caverns = nvals_cave[vi] < 0
|
||||||
|
|
||||||
if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then
|
if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then
|
||||||
if not flooded_caverns then
|
if not flooded_caverns then
|
||||||
@ -507,4 +527,5 @@ subterrane.register_layer({
|
|||||||
decorate = decorate_level_3,
|
decorate = decorate_level_3,
|
||||||
warren_region_variability_threshold = 0.33,
|
warren_region_variability_threshold = 0.33,
|
||||||
double_frequency = true,
|
double_frequency = true,
|
||||||
|
is_ground_content = df_caverns.is_ground_content,
|
||||||
})
|
})
|
||||||
|
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
|
||||||
|
if math.random() < 0.00025 and ((y < median + 3) or (y > ceiling_height - 3)) then
|
||||||
|
data[vi] = c_gas_wisp
|
||||||
|
else
|
||||||
data[vi] = c_gas
|
data[vi] = c_gas
|
||||||
|
end
|
||||||
else
|
else
|
||||||
data[vi] = c_oil
|
data[vi] = c_oil
|
||||||
end
|
end
|
||||||
@ -97,13 +102,8 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
--write it to world
|
--write it to world
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
|
|
||||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||||
if chunk_generation_time < 1000 then
|
mapgen_helper.record_time("df_caverns oil sea", time_taken)
|
||||||
minetest.log("info", "[df_caverns] oil sea mapblock generation took "..chunk_generation_time.." ms") --tell people how long
|
|
||||||
else
|
|
||||||
minetest.log("warning", "[df_caverns] oil sea took "..chunk_generation_time.." ms to generate map block "
|
|
||||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_ore({
|
minetest.register_ore({
|
||||||
|
425
df_caverns/primordial.lua
Normal file
@ -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
|
||||||
|
-- this may be a floor, but only if we eventually hit a ceiling in this column
|
||||||
|
previous_potential_floor_vi = vi-area.ystride
|
||||||
|
previous_potential_floor_y = y-1
|
||||||
|
elseif current_node == c_stone and previous_node == c_air and previous_potential_floor_vi then
|
||||||
|
-- we hit a ceiling after passing through a floor
|
||||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
||||||
local humidity = humiditymap[index2d]
|
local humidity = humiditymap[index2d]
|
||||||
df_caverns.tunnel_floor(minp, maxp, area, vi-area.ystride, nvals_cracks, data, data_param2, humidity > 30)
|
if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then
|
||||||
|
df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30)
|
||||||
end
|
end
|
||||||
previous_state = "in_tunnel"
|
if y <= maxp_y and y >= minp_y then
|
||||||
else
|
|
||||||
if previous_state == "in_tunnel" and not mapgen_helper.buildable_to(data[vi]) then
|
|
||||||
local index2d = mapgen_helper.index2d(minp, maxp, x, z)
|
|
||||||
local humidity = humiditymap[index2d]
|
|
||||||
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30)
|
df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30)
|
||||||
end
|
end
|
||||||
previous_state = "in_rock"
|
previous_potential_floor_vi = nil
|
||||||
|
elseif not mapgen_helper.buildable_to(current_node) then
|
||||||
|
-- we've entered a non-stone ceiling of some kind. Abort potential floor-ceiling pair detection.
|
||||||
|
previous_potential_floor_vi = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
previous_node = current_node
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--send data back to voxelmanip
|
--send data back to voxelmanip
|
||||||
@ -55,12 +77,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
--write it to world
|
--write it to world
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
|
|
||||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||||
if chunk_generation_time < 1000 then
|
mapgen_helper.record_time("df_caverns surface tunnels", time_taken)
|
||||||
minetest.log("info", "[df_caverns surface tunnels] "..chunk_generation_time.." ms") --tell people how long
|
|
||||||
else
|
|
||||||
minetest.log("warning", "[df_caverns surface tunnels] took "..chunk_generation_time.." ms to generate map block "
|
|
||||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
|
||||||
end
|
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
@ -1,8 +1,82 @@
|
|||||||
if not df_caverns.config.enable_underworld then
|
if not df_caverns.config.enable_underworld or not minetest.get_modpath("df_underworld_items") then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||||
|
|
||||||
|
local S = minetest.get_translator("df_caverns")
|
||||||
|
|
||||||
|
local bones_loot_path = minetest.get_modpath("bones_loot")
|
||||||
|
local named_waypoints_path = minetest.get_modpath("named_waypoints")
|
||||||
|
local namegen_path = minetest.get_modpath("namegen")
|
||||||
|
|
||||||
|
local name_pit = function() end
|
||||||
|
local name_ruin = function() end
|
||||||
|
|
||||||
|
if named_waypoints_path then
|
||||||
|
|
||||||
|
local item_required = nil
|
||||||
|
if minetest.settings:get_bool("dfcaverns_underworld_hud_requires_item", true) then
|
||||||
|
local setting_item_required = minetest.settings:get("dfcaverns_underworld_hud_item_required")
|
||||||
|
if setting_item_required == nil or setting_item_required == "" then
|
||||||
|
setting_item_required = "map:mapping_kit"
|
||||||
|
end
|
||||||
|
item_required = setting_item_required
|
||||||
|
end
|
||||||
|
|
||||||
|
local pit_waypoint_def = {
|
||||||
|
default_name = S("A glowing pit"),
|
||||||
|
default_color = 0xFF88FF,
|
||||||
|
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_discovery_range")) or 60,
|
||||||
|
visibility_requires_item = item_required,
|
||||||
|
}
|
||||||
|
|
||||||
|
if minetest.settings:get_bool("dfcaverns_show_pits_in_hud", true) then
|
||||||
|
pit_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_visibility_range")) or 500
|
||||||
|
pit_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
|
||||||
|
end
|
||||||
|
named_waypoints.register_named_waypoints("glowing_pits", pit_waypoint_def)
|
||||||
|
|
||||||
|
local seal_waypoint_def = {
|
||||||
|
default_name = S("Mysterious seal"),
|
||||||
|
default_color = 0x9C2233,
|
||||||
|
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_discovery_range")) or 10,
|
||||||
|
visibility_requires_item = item_required,
|
||||||
|
}
|
||||||
|
|
||||||
|
if minetest.settings:get_bool("dfcaverns_show_seals_in_hud", true) then
|
||||||
|
seal_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_visibility_range")) or 200
|
||||||
|
seal_waypoint_def.on_discovery = named_waypoints.default_discovery_popup
|
||||||
|
end
|
||||||
|
named_waypoints.register_named_waypoints("puzzle_seals", seal_waypoint_def)
|
||||||
|
|
||||||
|
if namegen_path then
|
||||||
|
namegen.parse_lines(io.lines(modpath.."/underworld_names.cfg"))
|
||||||
|
|
||||||
|
name_pit = function()
|
||||||
|
return namegen.generate("glowing_pits")
|
||||||
|
end
|
||||||
|
name_ruin = function()
|
||||||
|
return namegen.generate("underworld_ruins")
|
||||||
|
end
|
||||||
|
|
||||||
|
local underworld_ruin_def = {
|
||||||
|
default_name = S("Ancient ruin"),
|
||||||
|
discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_discovery_range")) or 40,
|
||||||
|
visibility_requires_item = item_required,
|
||||||
|
}
|
||||||
|
if minetest.settings:get_bool("dfcaverns_show_ruins_in_hud", true) then
|
||||||
|
underworld_ruin_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_visibility_range")) or 250
|
||||||
|
underworld_ruin_def.on_discovery = named_waypoints.default_discovery_popup
|
||||||
|
end
|
||||||
|
|
||||||
|
named_waypoints.register_named_waypoints("underworld_ruins", underworld_ruin_def)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local c_slade = minetest.get_content_id("df_underworld_items:slade")
|
local c_slade = minetest.get_content_id("df_underworld_items:slade")
|
||||||
|
local c_slade_block = minetest.get_content_id("df_underworld_items:slade_block")
|
||||||
local c_air = minetest.get_content_id("air")
|
local c_air = minetest.get_content_id("air")
|
||||||
local c_water = minetest.get_content_id("default:water_source")
|
local c_water = minetest.get_content_id("default:water_source")
|
||||||
|
|
||||||
@ -56,6 +130,11 @@ local wave_mult = 50
|
|||||||
local y_max = median + 2*wave_mult + ceiling_displace + -2*ceiling_mult
|
local y_max = median + 2*wave_mult + ceiling_displace + -2*ceiling_mult
|
||||||
local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult
|
local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult
|
||||||
|
|
||||||
|
--df_caverns.config.underworld_min = y_min
|
||||||
|
|
||||||
|
--local poisson = mapgen_helper.get_poisson_points({x=-32000, z=-32000}, {x=32000, z=32000}, 1000)
|
||||||
|
--minetest.debug(dump(poisson.objects))
|
||||||
|
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
-- Buildings
|
-- Buildings
|
||||||
|
|
||||||
@ -63,8 +142,11 @@ local oubliette_threshold = 0.8
|
|||||||
local town_threshold = 1.1
|
local town_threshold = 1.1
|
||||||
|
|
||||||
local local_random = function(x, z)
|
local local_random = function(x, z)
|
||||||
|
local next_seed = math.floor(math.random()*2^21)
|
||||||
math.randomseed(x + z*2^16)
|
math.randomseed(x + z*2^16)
|
||||||
return math.random()
|
local ret = math.random()
|
||||||
|
math.randomseed(next_seed)
|
||||||
|
return ret
|
||||||
end
|
end
|
||||||
|
|
||||||
-- create a deterministic list of buildings
|
-- create a deterministic list of buildings
|
||||||
@ -192,9 +274,9 @@ local pit_region_size = region_mapblocks * mapgen_chunksize * 16
|
|||||||
local scatter_2d = function(min_xz, gridscale, border_width)
|
local scatter_2d = function(min_xz, gridscale, border_width)
|
||||||
local bordered_scale = gridscale - 2 * border_width
|
local bordered_scale = gridscale - 2 * border_width
|
||||||
local point = {}
|
local point = {}
|
||||||
point.x = math.random() * bordered_scale + min_xz.x + border_width
|
point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width)
|
||||||
point.y = 0
|
point.y = 0
|
||||||
point.z = math.random() * bordered_scale + min_xz.z + border_width
|
point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width)
|
||||||
return point
|
return point
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -203,13 +285,13 @@ local get_corner = function(pos)
|
|||||||
return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32}
|
return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32}
|
||||||
end
|
end
|
||||||
|
|
||||||
local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed"))
|
local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^21
|
||||||
|
|
||||||
local get_pit = function(pos)
|
local get_pit = function(pos)
|
||||||
if region_mapblocks < 1 then return nil end
|
if region_mapblocks < 1 then return nil end
|
||||||
|
|
||||||
local corner_xz = get_corner(pos)
|
local corner_xz = get_corner(pos)
|
||||||
local next_seed = math.floor(math.random() * 2^31)
|
local next_seed = math.floor(math.random() * 2^21)
|
||||||
math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed)
|
math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed)
|
||||||
local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance)
|
local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance)
|
||||||
local variance_multiplier = math.random()
|
local variance_multiplier = math.random()
|
||||||
@ -231,6 +313,18 @@ local perlin_pit = {
|
|||||||
|
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
minetest.register_chatcommand("find_pit", {
|
||||||
|
params = "",
|
||||||
|
privs = {server=true},
|
||||||
|
decription = "find a nearby glowing pit",
|
||||||
|
func = function(name, param)
|
||||||
|
local player = minetest.get_player_by_name(name)
|
||||||
|
local pit = get_pit(player:get_pos())
|
||||||
|
if pit then
|
||||||
|
minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z))
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_on_generated(function(minp, maxp, seed)
|
minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
|
|
||||||
@ -264,8 +358,16 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
local wave = nvals_wave[index2d] * wave_mult
|
local wave = nvals_wave[index2d] * wave_mult
|
||||||
|
|
||||||
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
||||||
|
|
||||||
|
if named_waypoints_path and floor_height == y and pit and pit.location.x == x and pit.location.z == z then
|
||||||
|
named_waypoints.add_waypoint("glowing_pits", {x=x, y=y, z=z}, {name=name_pit()})
|
||||||
|
end
|
||||||
|
|
||||||
|
local underside_height = math.floor(y_min + math.abs(wave) / 5)+2 -- divide wave by five to smooth out the underside of the slade, we only want the interface to ripple a little down here
|
||||||
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
|
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
|
||||||
if y <= floor_height then
|
if (y == underside_height or y == underside_height - 1) and (x % 8 == 0 or z % 8 == 0) then
|
||||||
|
data[vi] = c_air
|
||||||
|
elseif y < floor_height and y > underside_height then
|
||||||
data[vi] = c_slade
|
data[vi] = c_slade
|
||||||
if pit and
|
if pit and
|
||||||
pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and
|
pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and
|
||||||
@ -275,15 +377,13 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
then
|
then
|
||||||
-- there's a pit nearby
|
-- there's a pit nearby
|
||||||
if pit_uninitialized then
|
if pit_uninitialized then
|
||||||
nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) -- determine which areas are spongey with warrens
|
nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit)
|
||||||
pit_uninitialized = false
|
pit_uninitialized = false
|
||||||
end
|
end
|
||||||
local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance
|
local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance
|
||||||
local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value
|
local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value
|
||||||
if distance < pit.radius -3 then
|
if distance < pit.radius -2.5 then
|
||||||
if y < y_min + 4 then -- make a layer of amethyst at the bottom of the pit to keep the plasma from digging infinitely downward.
|
if y < median + floor_displace + wave - pit.depth or y < underside_height + plasma_depth_min then
|
||||||
data[vi] = c_amethyst
|
|
||||||
elseif y < median + floor_displace + wave - pit.depth then
|
|
||||||
data[vi] = c_pit_plasma
|
data[vi] = c_pit_plasma
|
||||||
else
|
else
|
||||||
data[vi] = c_air
|
data[vi] = c_air
|
||||||
@ -296,7 +396,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif y < ceiling_height and data[vi] ~= c_amethyst then
|
elseif y >= floor_height and y < ceiling_height and data[vi] ~= c_amethyst then
|
||||||
data[vi] = c_air
|
data[vi] = c_air
|
||||||
elseif data[vi] == c_water then
|
elseif data[vi] == c_water then
|
||||||
data[vi] = c_air -- no water down here
|
data[vi] = c_air -- no water down here
|
||||||
@ -365,6 +465,11 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation)
|
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation)
|
||||||
elseif building.building_type == "medium building" then
|
elseif building.building_type == "medium building" then
|
||||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation)
|
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation)
|
||||||
|
if named_waypoints_path and namegen_path then
|
||||||
|
if not next(named_waypoints.get_waypoints_in_area("underworld_ruins", vector.subtract(building.pos, 250), vector.add(building.pos, 250))) then
|
||||||
|
named_waypoints.add_waypoint("underworld_ruins", {x=building.pos.x, y=floor_height+1, z=building.pos.z}, {name=name_ruin()})
|
||||||
|
end
|
||||||
|
end
|
||||||
elseif building.building_type == "small slab" then
|
elseif building.building_type == "small slab" then
|
||||||
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation)
|
mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation)
|
||||||
else
|
else
|
||||||
@ -376,6 +481,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- puzzle seal
|
||||||
|
local puzzle_seal = nil
|
||||||
|
if pit_uninitialized and math.random() < 0.05 then
|
||||||
|
local index2d = mapgen_helper.index2d(emin, emax, minp.x + 3, minp.z + 3)
|
||||||
|
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
|
||||||
|
local wave = nvals_wave[index2d] * wave_mult
|
||||||
|
|
||||||
|
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)
|
||||||
|
local underside_height = math.floor(y_min + math.abs(wave) / 5)
|
||||||
|
|
||||||
|
if floor_height < maxp.y and floor_height > minp.y then
|
||||||
|
for plat_vi in area:iter(minp.x, floor_height-6, minp.z, minp.x+6, floor_height, minp.z+6) do
|
||||||
|
data[plat_vi] = c_slade_block
|
||||||
|
end
|
||||||
|
puzzle_seal = {x=minp.x+3, y=floor_height+1, z=minp.z+3}
|
||||||
|
minetest.log("info", "Puzzle seal generated at " .. minetest.pos_to_string(puzzle_seal))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--send data back to voxelmanip
|
--send data back to voxelmanip
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:set_param2_data(data_param2)
|
vm:set_param2_data(data_param2)
|
||||||
@ -386,11 +510,51 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
--write it to world
|
--write it to world
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
|
|
||||||
local chunk_generation_time = math.ceil((os.clock() - t_start) * 1000) --grab how long it took
|
if puzzle_seal ~= nil then
|
||||||
if chunk_generation_time < 1000 then
|
if named_waypoints_path then
|
||||||
minetest.log("info", "[df_caverns] underworld mapblock generation took "..chunk_generation_time.." ms") --tell people how long
|
named_waypoints.add_waypoint("puzzle_seals", puzzle_seal)
|
||||||
else
|
|
||||||
minetest.log("warning", "[df_caverns] underworld took "..chunk_generation_time.." ms to generate map block "
|
|
||||||
.. minetest.pos_to_string(minp) .. minetest.pos_to_string(maxp))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.place_schematic({x=puzzle_seal.x-3, y=puzzle_seal.y, z=puzzle_seal.z-3}, df_underworld_items.seal_temple_schem, 0, {}, true)
|
||||||
|
local node_name = minetest.get_node(puzzle_seal).name
|
||||||
|
local node_def = minetest.registered_nodes[node_name]
|
||||||
|
node_def.on_construct(puzzle_seal)
|
||||||
|
end
|
||||||
|
|
||||||
|
if bones_loot_path then
|
||||||
|
for i = 1, 30 do
|
||||||
|
local x = math.random(minp.x, maxp.x)
|
||||||
|
local z = math.random(minp.z, maxp.z)
|
||||||
|
local index2d = mapgen_helper.index2d(emin, emax, x, z)
|
||||||
|
local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands
|
||||||
|
local wave = nvals_wave[index2d] * wave_mult
|
||||||
|
local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)-1
|
||||||
|
local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave)
|
||||||
|
if floor_height < ceiling_height then
|
||||||
|
local zone = math.abs(nvals_zone[index2d])
|
||||||
|
if math.random() < zone then -- bones are more common in the built-up areas
|
||||||
|
local floor_node = minetest.get_node({x=x, y=floor_height, z=z})
|
||||||
|
local floor_node_def = minetest.registered_nodes[floor_node.name]
|
||||||
|
if floor_node_def and not floor_node_def.buildable_to then
|
||||||
|
local y = floor_height + 1
|
||||||
|
while y < ceiling_height do
|
||||||
|
local target_pos = {x=x, y=y, z=z}
|
||||||
|
local target_node = minetest.get_node(target_pos)
|
||||||
|
if target_node.name == "air" then
|
||||||
|
bones_loot.place_bones(target_pos, "underworld_warrior", math.random(3, 10), nil, true)
|
||||||
|
break
|
||||||
|
elseif target_node.name == "bones:bones" then
|
||||||
|
-- don't stack bones on bones, it looks silly
|
||||||
|
break
|
||||||
|
end
|
||||||
|
y = y + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local time_taken = os.clock() - t_start -- how long this chunk took, in seconds
|
||||||
|
mapgen_helper.record_time("df_caverns underworld", time_taken)
|
||||||
end)
|
end)
|
||||||
|
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
|
|
||||||
simplecrafting_lib.register("cooking", {
|
|
||||||
input = {
|
|
||||||
["group:dfcaverns_cookable"] = 1,
|
|
||||||
[prefix..":"..item] = 1,
|
|
||||||
},
|
|
||||||
output = {
|
|
||||||
["df_farming:"..item.."_biscuit"] = 1,
|
|
||||||
},
|
|
||||||
cooktime = 5.0,
|
|
||||||
})
|
|
||||||
simplecrafting_lib.register("cooking", {
|
|
||||||
input = {
|
|
||||||
["group:dfcaverns_cookable"] = 2,
|
|
||||||
[prefix..":"..item] = 1,
|
|
||||||
},
|
|
||||||
output = {
|
|
||||||
["df_farming:"..item.."_stew"] = 1,
|
|
||||||
},
|
|
||||||
cooktime = 10.0,
|
|
||||||
})
|
|
||||||
simplecrafting_lib.register("cooking", {
|
|
||||||
input = {
|
|
||||||
["group:dfcaverns_cookable"] = 3,
|
|
||||||
[prefix..":"..item] = 1,
|
|
||||||
},
|
|
||||||
output = {
|
|
||||||
["df_farming:"..item.."_roast"] = 1,
|
|
||||||
},
|
|
||||||
cooktime = 15.0,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
output = "df_farming:"..item.."_biscuit",
|
output = "df_farming:"..item.."_simple_meal",
|
||||||
recipe = {"group:dfcaverns_cookable", prefix..":"..item},
|
recipe = {"group:dfcaverns_cookable", prefix..":"..item},
|
||||||
replacements = returns
|
replacements = replacements
|
||||||
})
|
})
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
output = "df_farming:"..item.."_stew",
|
output = "df_farming:"..item.."_medium_meal",
|
||||||
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
||||||
replacements = returns
|
replacements = replacements
|
||||||
})
|
})
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
output = "df_farming:"..item.."_roast",
|
output = "df_farming:"..item.."_complex_meal",
|
||||||
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item},
|
||||||
replacements = returns
|
replacements = replacements
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
register_cooking_recipes("df_farming", "cave_flour", S("Cave Wheat Flour"))
|
|
||||||
register_cooking_recipes("df_farming", "cave_wheat_seed", S("Cave Wheat Seed"))
|
--{
|
||||||
register_cooking_recipes("df_farming", "sweet_pod_seed", S("Sweet Pod Spore"))
|
-- prefix =,
|
||||||
register_cooking_recipes("df_farming", "sugar", S("Sweet Pod Sugar"))
|
-- item =,
|
||||||
register_cooking_recipes("group", "plump_helmet", S("Plump Helmet"))
|
-- replacements =,
|
||||||
register_cooking_recipes("df_farming", "plump_helmet_spawn", S("Plump Helmet Spawn"))
|
-- simple = {name = , image = , sound = },
|
||||||
register_cooking_recipes("df_farming", "quarry_bush_leaves", S("Quarry Bush Leaf"))
|
-- medium = {name = , image = , sound = },
|
||||||
register_cooking_recipes("df_farming", "quarry_bush_seed", S("Rock Nut"))
|
-- complex = {name = , image = , sound = },
|
||||||
register_cooking_recipes("df_farming", "dimple_cup_seed", S("Dimple Cup Spore"))
|
--}
|
||||||
register_cooking_recipes("df_farming", "pig_tail_seed", S("Pig Tail Spore"))
|
|
||||||
register_cooking_recipes("df_farming", "dwarven_syrup_bucket", S("Dwarven Syrup"), {{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}})
|
local chomp = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}
|
||||||
|
local crisp = {eat = {name = "df_farming_crisp_chew", gain = 1.0}}
|
||||||
|
local gummy = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}
|
||||||
|
local mushy = {eat = {name = "df_farming_mushy_chew", gain = 1.0}}
|
||||||
|
local soft = {eat = {name = "df_farming_soft_chew", gain = 1.0}}
|
||||||
|
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="cave_flour",
|
||||||
|
simple = {name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp},
|
||||||
|
medium = {name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy},
|
||||||
|
complex = {name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="cave_wheat_seed",
|
||||||
|
simple = {name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp},
|
||||||
|
medium = {name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft},
|
||||||
|
complex = {name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="sweet_pod_seed",
|
||||||
|
simple = {name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy},
|
||||||
|
medium = {name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy},
|
||||||
|
complex = {name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="sugar",
|
||||||
|
simple = {name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp},
|
||||||
|
medium = {name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp},
|
||||||
|
complex = {name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="group", item="plump_helmet",
|
||||||
|
simple = {name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy},
|
||||||
|
medium = {name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy},
|
||||||
|
complex = {name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="plump_helmet_spawn",
|
||||||
|
simple = {name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy},
|
||||||
|
medium = {name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft},
|
||||||
|
complex = {name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="quarry_bush_leaves",
|
||||||
|
simple = {name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft},
|
||||||
|
medium = {name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft},
|
||||||
|
complex = {name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="quarry_bush_seed",
|
||||||
|
simple = {name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft},
|
||||||
|
medium = {name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp},
|
||||||
|
complex = {name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="dimple_cup_seed",
|
||||||
|
simple = {name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp},
|
||||||
|
medium = {name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp},
|
||||||
|
complex = {name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="pig_tail_seed",
|
||||||
|
simple = {name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft},
|
||||||
|
medium = {name=S("Pig Tail Spore Tofu"), image="dfcaverns_prepared_food30x16.png", sound = gummy},
|
||||||
|
complex = {name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy},
|
||||||
|
})
|
||||||
|
register_cooking_recipes({prefix="df_farming", item="dwarven_syrup_bucket", replacements={{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}},
|
||||||
|
simple = {name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy},
|
||||||
|
medium = {name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy},
|
||||||
|
complex = {name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy},
|
||||||
|
})
|
||||||
|
|
||||||
|
-- dfcaverns_prepared_food28 is currently unused
|
||||||
|
-- dfcaverns_prepared_food13 is used for dwarven bread
|
@ -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 |