-- LUALOCALS < --------------------------------------------------------- local math, minetest, nodecore, pairs, table = math, minetest, nodecore, pairs, table local math_floor, math_random, table_remove, table_sort = math.floor, math.random, table.remove, table.sort -- LUALOCALS > --------------------------------------------------------- local pcache = {} local strings = { onemore = "(and 1 more hint)", fewmore = "(and @1 more hints)", progress = "Progress: @1 complete, @2 current, @3 future", explore = "Not all game content is covered by hints. Explore!", hint = "- @1", done = "- DONE: @1" } for k, v in pairs(strings) do nodecore.translate_inform(v) strings[k] = function(...) return nodecore.translate(v, ...) 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) for k, v in pairs(found) do found[k] = strings.hint(v.text) end for k, v in pairs(done) do done[k] = strings.done(v.text) end local prog = #found local left = #(nodecore.hints) - prog - #done while #found > 5 do table_remove(found, math_random(1, #found)) end while #found < 5 do local j = math_random(1, #done) found[#found + 1] = done[j] table_remove(done, j) end table_sort(found) if #found == (prog - 1) then found[#found + 1] = strings.onemore() elseif #found < prog then found[#found + 1] = strings.fewmore(prog - #found) end found[#found + 1] = "" found[#found + 1] = strings.progress(#done, prog, left) found[#found + 1] = strings.explore() pcache[pname] = {time = now, found = found} return found end nodecore.register_inventory_tab({ title = "Hints", content = gethint })