diff options
Diffstat (limited to 'myhighscore/api.lua')
-rwxr-xr-x | myhighscore/api.lua | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/myhighscore/api.lua b/myhighscore/api.lua index bbad4d7..f1e84f8 100755 --- a/myhighscore/api.lua +++ b/myhighscore/api.lua @@ -1,9 +1,75 @@ +-- 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 -myhighscore.register_game(name, definition) +-- 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) |