feat: extend items with Items.tome and Items.amulet
This commit is contained in:
1 parent
2faa8dbe75
commit
9a647af6e3
2 files changed
+190
-11
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user