98 lines
2.6 KiB
Lua
Raw Normal View History

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, table
= math, minetest, nodecore, pairs, table
local math_floor, math_random, table_insert
= math.floor, math.random, table.insert
-- LUALOCALS > ---------------------------------------------------------
local pcache = {}
2019-08-26 01:01:58 -04:00
local strings = {
progress = "@1 discovered, @2 available, @3 future",
explore = "The discovery system only alerts you to the existence of"
2021-12-13 20:58:38 -05:00
.. " some basic game mechanics. More advanced content, such as"
.. " emergent systems and automation, you will have to"
.. " invent yourself!",
hint = "- @1",
done = "- DONE: @1",
future = "- FUTURE: @1"
2019-08-26 01:01:58 -04:00
}
for k, v in pairs(strings) do
nodecore.translate_inform(v)
strings[k] = function(...) return nodecore.translate(v, ...) end
end
local function shuffle(t)
for i = #t, 2, -1 do
local j = math_random(1, i)
t[i], t[j] = t[j], t[i]
end
end
local function gethint(player)
local pname = player:get_player_name()
local now = math_floor(minetest.get_us_time() / 1000000)
local cached = pcache[pname]
if cached and cached.time == now then return cached.found end
local found, done = nodecore.hint_state(pname)
local future
if nodecore.get_player_privs_cached(pname).debug then
local seen = {}
for _, v in pairs(found) do seen[v] = true end
for _, v in pairs(done) do seen[v] = true end
future = {}
for _, v in pairs(nodecore.hints) do
if not seen[v] then
future[#future + 1] = strings.future(v.text)
end
end
shuffle(future)
end
for k, v in pairs(found) do found[k] = strings.hint(v.text) end
shuffle(found)
for k, v in pairs(done) do done[k] = strings.done(v.text) end
shuffle(done)
local prog = #found
local left = #(nodecore.hints) - prog - #done
table_insert(found, 1, "")
table_insert(found, 1, strings.progress(#done, prog, left))
found[#found + 1] = ""
2019-08-26 01:01:58 -04:00
found[#found + 1] = strings.explore()
found[#found + 1] = ""
for i = 1, #done do found[#found + 1] = done[i] end
if future then
found[#found + 1] = ""
for i = 1, #future do found[#found + 1] = future[i] end
end
pcache[pname] = {time = now, found = found}
return found
end
local function clearcache(_, pname)
pcache[pname] = nil
return true
end
local mytab = {
title = "Discovery",
visible = function(_, player)
return nodecore.interact(player)
and not nodecore.hints_disabled()
or false
end,
content = gethint,
on_discover = clearcache,
on_privchange = clearcache
}
nodecore.register_inventory_tab(mytab)
nodecore.register_on_discover(function(player)
return nodecore.inventory_notify(player, "discover")
end)