feat: extend items with Items.tome and Items.amulet

This commit is contained in:
dualfroz committed 2026-09-07 11:21:37 +02:00
1 parent 2faa8dbe75
commit 9a647af6e3
2 files changed
+190 -11

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
-- Persistent top-N high score table. A run's own numeric score (see
-- morgue.lua's Morgue.score) only matters across runs if something
-- remembers it - this is that memory, carried inside meta.lua's own save
-- file exactly like renown and achievements already are, so a leaderboard
-- outlives every single run that fed it.
local Leaderboard = {}
Leaderboard.CAPACITY = 10
function Leaderboard.new()
return {}
end
-- Shifts board's tail down to open a gap for `entry` at the first slot
-- whose current occupant does not outscore it, then drops it there.
-- Returns the 1-based rank entry lands at, counting past Leaderboard.CAPACITY
-- when the board is already full - the caller trims that overflow back off.
local function insertSorted(board, entry)
local i = #board + 1
while i > 1 and board[i - 1].score < entry.score do
board[i] = board[i - 1]
i = i - 1
end
board[i] = entry
return i
end
-- Inserts `entry` (expects at least a numeric .score field) into `board`,
-- keeping it sorted best-score-first and capped at Leaderboard.CAPACITY.
-- A run that does not crack the cap is dropped outright rather than kept
-- around uncounted - a leaderboard only remembers what actually placed.
-- Returns the rank it landed at, or nil if it did not make the cut.
function Leaderboard.record(board, entry)
local rank = insertSorted(board, entry)
while #board > Leaderboard.CAPACITY do
table.remove(board)
end
if rank > Leaderboard.CAPACITY then return nil end
return rank
end
function Leaderboard.top(board, count)
local out = {}
for i = 1, math.min(count or Leaderboard.CAPACITY, #board) do
out[i] = board[i]
end
return out
end
function Leaderboard.bestScore(board)
return board[1] and board[1].score or 0
end
return Leaderboard