summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Carmona Varo <ferkiwi@gmail.com>2015-10-25 02:51:44 +0200
committerFernando Carmona Varo <ferkiwi@gmail.com>2015-10-25 02:51:44 +0200
commit289cacf17a5812c5fb6cfc7134dedabfea0d86e7 (patch)
tree089134beac23e549dd7a020fe1956b3cec6dc90d
parentebde4407511a7255e1e5b6d897f81188c4fe2eb3 (diff)
Implemented myhighscores API, and used it in pacmine
-rwxr-xr-xmyhighscore/api.lua68
-rwxr-xr-xmyhighscore/scoreboard.lua33
-rwxr-xr-xpacmine/depends.txt1
-rwxr-xr-xpacmine/gamestate.lua14
4 files changed, 104 insertions, 12 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)
diff --git a/myhighscore/scoreboard.lua b/myhighscore/scoreboard.lua
index 226e86a..38e659e 100755
--- a/myhighscore/scoreboard.lua
+++ b/myhighscore/scoreboard.lua
@@ -13,15 +13,26 @@ local game_name = "the game"
local game_player_name = "the player"
local game_player_score = "648138"
-local game_form = "size[6,8;]"..
- "background[0,0;6,8;myhighscore_form_bg.png]"..
- "label[1,0.5;HIGH SCORES FOR "..game_name.."]"..
- "label[1,1.5;PLAYER]"..
- "label[3.5,1.5;SCORE]"..
- "label[0.5,2;"..game_player_name.."]"..
- "label[3,2;"..game_player_score.."]"..
- "button[2,7;1,2;back;Back]"..
- "button_exit[4,7;1,2;exit;Exit]"
+local function get_formspec_for_game(name)
+ local def = myhighscore.registered_games[name]
+ local scores = myhighscore.scores[name] or {}
+ -- Obtain a comma separated list of scores to display
+ local scorelist = ""
+ for _,score in pairs(scores) do
+ scorelist = scorelist .. minetest.formspec_escape(score.player) ..
+ "\t\t\t\t " .. score.score ..","
+ end
+
+ return "size[6,8;]"..
+ "background[0,0;6,8;myhighscore_form_bg.png]"..
+ "label[1,0.5;HIGH SCORES FOR "..def.description.."]"..
+ "label[1,1.5;PLAYER]"..
+ "label[3.5,1.5;SCORE]"..
+ "textlist[0.5,2;5,5;;"..scorelist.."]"..
+ "button[2,7;1,2;back;Back]"..
+ "button_exit[4,7;1,2;exit;Exit]"
+end
+
minetest.register_node("myhighscore:score_board", {
description = "Score Board",
@@ -29,7 +40,7 @@ minetest.register_node("myhighscore:score_board", {
"myhighscore_top.png",
"myhighscore_back.png",
"myhighscore_side.png^[transformFX",
- "myhighscore_side.png",y
+ "myhighscore_side.png",
"myhighscore_back.png",
"myhighscore_front.png",
},
@@ -56,7 +67,7 @@ minetest.register_node("myhighscore:score_board", {
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.env:get_meta(pos)
if fields['game'] then
- meta:set_string('formspec', game_form)
+ meta:set_string('formspec', get_formspec_for_game("pacmine"))
elseif fields["back"] then
meta:set_string('formspec', button_form)
end
diff --git a/pacmine/depends.txt b/pacmine/depends.txt
new file mode 100755
index 0000000..01e0fb0
--- /dev/null
+++ b/pacmine/depends.txt
@@ -0,0 +1 @@
+myhighscore
diff --git a/pacmine/gamestate.lua b/pacmine/gamestate.lua
index 718bf02..7bbc0af 100755
--- a/pacmine/gamestate.lua
+++ b/pacmine/gamestate.lua
@@ -64,6 +64,14 @@ function pacmine.game_end(id)
pacmine.remove_hud(player, gamestate.player_name)
player:moveto(vector.add(gamestate.pos,{x=0.5,y=0.5,z=-1.5}))
end
+ -- Save score
+ local ranking = myhighscore.save_score("pacmine", {
+ player = gamestate.player_name,
+ score = gamestate.score
+ })
+ if ranking then
+ minetest.chat_send_player(gamestate.player_name, "You made it to the highscores! Your Ranking: " .. ranking)
+ end
-- Clear the data
pacmine.games[id] = nil
pacmine.players[id] = nil
@@ -314,3 +322,9 @@ minetest.register_chatcommand("pacmine_exit", {
end
end
})
+
+-- Register with the myhighscore mod
+myhighscore.register_game("pacmine", {
+ description = "Pacmine",
+ icon = "pacmine_1.png",
+})