Aaron Suen 3edf1b214c Add a way to access another tool tier
Lux resonance can boost tools by one more level!

This opens up some new opportunities for silk touch,
such as being able to relocate living grass.
2020-05-31 09:03:41 -04:00

120 lines
3.5 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ItemStack, math, minetest, nodecore, pairs
= ItemStack, math, minetest, nodecore, pairs
local math_ceil, math_exp, math_log
= math.ceil, math.exp, math.log
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local convert = {}
local charge = {}
local boost_suff = "_boost"
for _, shape in pairs({"mallet", "spade", "hatchet", "pick", "mattock"}) do
for _, temper in pairs({"tempered", "annealed"}) do
local orig = minetest.registered_items["nc_lode:tool_" .. shape .. "_" .. temper]
local def = nodecore.underride({
description = "Infused " .. orig.description,
inventory_image = orig.inventory_image .. "^(" .. modname
.. "_base.png^[mask:" .. modname
.. "_infuse_mask.png^[mask:nc_lode_tool_" .. shape
.. ".png^[opacity:80])",
tool_wears_to = orig.name
}, orig)
def.after_use = nil
def.groups = nodecore.underride({lux_tool = 1}, orig.groups or {})
local tc = {}
for k, v in pairs(orig.tool_capabilities.opts) do
tc[k] = v + 1
end
tc.uses = 0.5
def.tool_capabilities = nodecore.toolcaps(tc)
for k, v in pairs(orig.tool_capabilities.opts) do
tc[k] = v + 2
end
local boost = nodecore.underride({
inventory_image = orig.inventory_image .. "^(" .. modname
.. "_base.png^[mask:" .. modname
.. "_infuse_mask.png^[mask:nc_lode_tool_" .. shape
.. ".png^[opacity:120])",
tool_capabilities = nodecore.toolcaps(tc)
}, def)
def.name = modname .. ":tool_" .. shape .. "_" .. temper
minetest.register_tool(def.name, def)
boost.name = modname .. ":tool_" .. shape .. "_" .. temper .. boost_suff
minetest.register_tool(boost.name, boost)
convert[orig.name] = def.name
charge[def.name] = true
charge[boost.name] = true
end
end
local alltools = {}
for k in pairs(convert) do alltools[#alltools + 1] = k end
for k in pairs(charge) do
if not convert[k] then
alltools[#alltools + 1] = k
end
end
local ratefactor = 40000
nodecore.register_soaking_aism({
label = "Lux Infusion",
fieldname = "infuse",
interval = 2,
chance = 1,
itemnames = alltools,
soakrate = function(stack, aismdata)
local name = stack:get_name()
if (not charge[name]) and (not convert[name]) then return false end
local pos = aismdata.pos or aismdata.player and aismdata.player:get_pos()
return nodecore.lux_soak_rate(pos)
end,
soakcheck = function(data, stack)
local name = stack:get_name()
if convert[name] and stack:get_wear() < 3277 then
stack = ItemStack(convert[name])
stack:set_wear(65535)
return data.total, stack
end
if not charge[name] then return data.total, stack end
local wear = stack:get_wear()
local newear = math_ceil(wear * math_exp(-data.total / ratefactor))
if newear == wear then return data.total, stack end
local used = math_log(wear / newear) * ratefactor
stack:set_wear(newear)
return data.total - used, stack
end
})
nodecore.register_aism({
label = "Lux Boost",
interval = 2,
chance = 1,
itemnames = {"group:lux_tool"},
action = function(stack, data)
local name = stack:get_name()
local boosted = name:sub(-#boost_suff) == boost_suff
local boost = #nodecore.find_nodes_around(data.pos, "group:lux_fluid", 2) > 0
if boost == boosted then return end
if boost and not boosted then
name = name .. boost_suff
else
name = name:sub(1, -1 - #boost_suff)
end
stack:set_name(name)
return stack
end
})