nodecore-cd2025/mods/nc_lode/metallurgy.lua
Aaron Suen be6b5ec8a0 Remove "Cube" from node descriptions.
Consistent with everything else in the world, we assume that "cube"
is the default state for things to be in (this is NodeCore after
all) and only use shape descriptors for things like lumps, prills
and other non-cube versions of things that also exist as cubes.
2019-04-02 08:10:17 -04:00

174 lines
4.8 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ItemStack, math, minetest, nodecore, pairs, type
= ItemStack, math, minetest, nodecore, pairs, type
local math_exp, math_floor, math_log, math_random
= math.exp, math.floor, math.log, math.random
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
function nodecore.register_lode(shape, rawdef)
for _, temper in pairs({"Hot", "Annealed", "Tempered"}) do
local def = nodecore.underride({}, rawdef)
local snd = temper:lower()
if snd == "hot" then snd = "annealed" end
def = nodecore.underride(def, {
description = temper .. " Lode " .. shape,
name = (shape .. "_" .. temper):lower():gsub(" ", "_"),
groups = { cracky = 3 },
["metal_temper_" .. temper:lower()] = true,
metal_alt_hot = modname .. ":" .. shape:lower() .. "_hot",
metal_alt_annealed = modname .. ":" .. shape:lower() .. "_annealed",
metal_alt_tempered = modname .. ":" .. shape:lower() .. "_tempered",
sounds = nodecore.sounds("nc_lode_" .. snd)
})
def.metal_temper_cool = (not def.metal_temper_hot) or nil
if temper ~= "Hot" then
def.light_source = nil
else
def.groups = def.groups or {}
def.groups.falling_node = 1
def.damage_per_second = 2
end
if def.tiles then
local t = {}
for k, v in pairs(def.tiles) do
t[k] = v:gsub("#", temper:lower())
end
def.tiles = t
end
for k, v in pairs(def) do
if type(v) == "string" then
def[k] = v:gsub("##", temper):gsub("#", temper:lower())
end
end
if def.bytemper then def.bytemper(temper, def) end
minetest.register_item(modname .. ":" .. def.name, def)
end
end
nodecore.register_lode("Block", {
type = "node",
description = "## Lode",
tiles = { modname .. "_#.png" },
light_source = 8,
crush_damage = 4
})
nodecore.register_lode("Prill", {
type = "craft",
inventory_image = modname .. "_#.png^[mask:" .. modname .. "_mask_prill.png",
})
local logadj = math_log(2)
local function exporand()
local r = 0
while r == 0 do r = math_random() end
return math_floor(math_exp(-math_log(r) * logadj))
end
nodecore.register_craft({
label = "lode cobble to prills",
action = "cook",
touchgroups = {flame = 3},
duration = 30,
cookfx = true,
check = function(pos)
local below = {x = pos.x, y = pos.y - 1, z = pos.z}
return not nodecore.match(below, {walkable = true})
end,
nodes = {
{
match = modname .. ":cobble",
replace = "nc_terrain:cobble"
}
},
after = function(pos)
local below = {x = pos.x, y = pos.y - 1, z = pos.z}
return nodecore.item_eject(below, modname
.. ":prill_hot " .. exporand())
end
})
nodecore.register_cook_abm({nodenames = {modname .. ":cobble"}, neighbors = {"group:flame"}})
local function replacestack(pos, alt)
local stack = nodecore.stack_get(pos)
nodecore.remove_node(pos)
local def = minetest.registered_items[stack:get_name()] or {}
local repl = ItemStack(def["metal_alt_" .. alt] or "")
repl:set_count(stack:get_count() * repl:get_count())
return nodecore.item_eject(pos, repl)
end
nodecore.register_craft({
label = "lode stack heating",
action = "cook",
touchgroups = {flame = 3},
duration = 30,
cookfx = true,
nodes = {{match = {metal_temper_cool = true, stacked = true, count = false}}},
after = function(pos) return replacestack(pos, "hot") end
})
nodecore.register_craft({
label = "lode stack annealing",
action = "cook",
touchgroups = {flame = 0},
duration = 120,
priority = -1,
cookfx = {smoke = true, hiss = true},
nodes = {{match = {metal_temper_hot = true, stacked = true, count = false}}},
after = function(pos) return replacestack(pos, "annealed") end
})
nodecore.register_craft({
label = "lode stack quenching",
action = "cook",
touchgroups = {flame = 0},
check = function(pos)
return #minetest.find_nodes_in_area(
{x = pos.x - 1, y = pos.y - 1, z = pos.z - 1},
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
{"group:coolant"}) > 0
end,
cookfx = true,
nodes = {{match = {metal_temper_hot = true, stacked = true, count = false}}},
after = function(pos) return replacestack(pos, "tempered") end
})
-- Because of how massive they are, forging a block is a hot-working process.
nodecore.register_craft({
label = "forge lode block",
action = "pummel",
toolgroups = {thumpy = 3},
nodes = {
{
match = {name = modname .. ":prill_hot", count = 8},
replace = "air"
}
},
items = {
modname .. ":block_hot"
}
})
-- Blocks can be chopped back into prills using only hardened tools.
nodecore.register_craft({
label = "break apart lode block",
action = "pummel",
toolgroups = {choppy = 5},
nodes = {
{
match = modname .. ":block_annealed",
replace = "air"
}
},
items = {
{name = modname .. ":prill_annealed 2", count = 4, scatter = 5}
}
})