76 lines
2.2 KiB
Lua
Executable File
76 lines
2.2 KiB
Lua
Executable File
|
|
-- Store any information we might need for the games that will use highscore
|
|
-- (icons, description, or whatever)
|
|
myhighscore.registered_games = {}
|
|
|
|
-- This table will contain a table for each registered game which
|
|
-- will be an array of player scores
|
|
myhighscore.scores = {}
|
|
|
|
-- How many scores to keep saved per game
|
|
local stored_scores = 50
|
|
|
|
-- Name of the folder to save the scores to
|
|
-- each game highscore list will be saved in a file inside this directory
|
|
local score_directory = minetest.get_worldpath().."/myhighscores/"
|
|
|
|
-- You can register a new arcade game using this function
|
|
-- The definition will get added to the table of registered games.
|
|
function myhighscore.register_game(name, definition)
|
|
definition.description = definition.description or name
|
|
myhighscore.registered_games[name] = definition
|
|
myhighscore.load_scores(name)
|
|
end
|
|
|
|
-- Returns true if score from A is smaller than score from B
|
|
-- Used for sorting the score arra
|
|
function myhighscore.is_score_higher(scoreA, scoreB)
|
|
return scoreA.score > scoreB.score
|
|
end
|
|
|
|
-- Saves a given score for the given game. "score" will be a table containing at least:
|
|
-- player (player name) and score (points)
|
|
function myhighscore.save_score(name, score)
|
|
local scores = myhighscore.scores[name]
|
|
|
|
-- Check first if the last score is higher
|
|
if scores[stored_scores] and
|
|
myhighscore.is_score_higher(scores[stored_scores], score) then
|
|
return false
|
|
end
|
|
|
|
table.insert(scores, score)
|
|
-- sort the array
|
|
table.sort(scores, myhighscore.is_score_higher)
|
|
-- check position and remove any extra ones
|
|
local pos = 0
|
|
for i,sc in pairs(scores) do
|
|
if sc == score then
|
|
pos = i
|
|
elseif i > stored_scores then
|
|
scores[i] = nil
|
|
end
|
|
end
|
|
-- save it to disk
|
|
local f, err = io.open(score_directory .. name, "w")
|
|
f:write(minetest.serialize(scores))
|
|
f:close()
|
|
-- return the position we hold on the list
|
|
return pos
|
|
end
|
|
|
|
|
|
-- Read scores from disk for the given game, or initialize the scores table if not present
|
|
function myhighscore.load_scores(name)
|
|
local f, err = io.open(score_directory .. name, "r")
|
|
local data = {}
|
|
if f then
|
|
data = minetest.deserialize(f:read("*a")) or {}
|
|
f:close()
|
|
end
|
|
myhighscore.scores[name] = data
|
|
end
|
|
|
|
-- Create the scores directory if it doesn't exist!
|
|
minetest.mkdir(score_directory)
|