Added high score and save/load functionality to xobox game.
Change-Id: I5e553a38b9290aeeb3cebaf1abf90ae6fc4ac362 Reviewed-on: http://gerrit.rockbox.org/799 Reviewed-by: Michael Giacomelli <giac2000@hotmail.com>
This commit is contained in:
parent
fcb835f61a
commit
d35be7d0db
2 changed files with 104 additions and 5 deletions
|
@ -23,6 +23,7 @@
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
#include "lib/helper.h"
|
#include "lib/helper.h"
|
||||||
#include "lib/playback_control.h"
|
#include "lib/playback_control.h"
|
||||||
|
#include "lib/highscore.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -417,6 +418,12 @@ static int difficulty = 75; /* Percentage of screen that needs to be filled
|
||||||
* in order to win the game */
|
* in order to win the game */
|
||||||
|
|
||||||
static bool quit = false;
|
static bool quit = false;
|
||||||
|
static bool _ingame = false;
|
||||||
|
|
||||||
|
#define RESUME_FILE PLUGIN_GAMES_DATA_DIR "/xobox.resume"
|
||||||
|
#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/xobox.score"
|
||||||
|
#define NUM_SCORES 5
|
||||||
|
static struct highscore highscores[NUM_SCORES];
|
||||||
|
|
||||||
static unsigned int board[BOARD_H][BOARD_W];
|
static unsigned int board[BOARD_H][BOARD_W];
|
||||||
static int testboard[BOARD_H][BOARD_W];
|
static int testboard[BOARD_H][BOARD_W];
|
||||||
|
@ -1019,12 +1026,66 @@ static void init_game (void)
|
||||||
rb->splash (HZ * 2, "Ready?");
|
rb->splash (HZ * 2, "Ready?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool load_game(void)
|
||||||
|
{
|
||||||
|
int fd = rb->open(RESUME_FILE, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool load_success =
|
||||||
|
rb->read(fd, &player, sizeof(player)) == sizeof(player) &&
|
||||||
|
rb->read(fd, &qixes, sizeof(qixes)) == sizeof(qixes) &&
|
||||||
|
rb->read(fd, &stack, sizeof(stack)) == sizeof(stack) &&
|
||||||
|
rb->read(fd, &board, sizeof(board)) == sizeof(board) &&
|
||||||
|
rb->read(fd, &testboard, sizeof(testboard)) == sizeof(testboard) &&
|
||||||
|
rb->read(fd, &speed, sizeof(speed)) == sizeof(speed) &&
|
||||||
|
rb->read(fd, &difficulty, sizeof(difficulty)) == sizeof(difficulty) &&
|
||||||
|
rb->read(fd, &stackPointer, sizeof(stackPointer)) == sizeof(stackPointer) &&
|
||||||
|
rb->read(fd, &percentage_cache,
|
||||||
|
sizeof(percentage_cache)) == sizeof(percentage_cache);
|
||||||
|
|
||||||
|
rb->close(fd);
|
||||||
|
_ingame = load_success;
|
||||||
|
|
||||||
|
return load_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool save_game(void)
|
||||||
|
{
|
||||||
|
int fd = rb->open(RESUME_FILE, O_WRONLY|O_CREAT, 0666);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool save_success =
|
||||||
|
rb->write(fd, &player, sizeof(player)) > 0 &&
|
||||||
|
rb->write(fd, &qixes, sizeof(qixes)) > 0 &&
|
||||||
|
rb->write(fd, &stack, sizeof(stack)) > 0 &&
|
||||||
|
rb->write(fd, &board, sizeof(board)) > 0 &&
|
||||||
|
rb->write(fd, &testboard, sizeof(testboard)) > 0 &&
|
||||||
|
rb->write(fd, &speed, sizeof(speed)) > 0 &&
|
||||||
|
rb->write(fd, &difficulty, sizeof(difficulty)) > 0 &&
|
||||||
|
rb->write(fd, &stackPointer, sizeof(stackPointer)) > 0 &&
|
||||||
|
rb->write(fd, &percentage_cache, sizeof(percentage_cache)) > 0;
|
||||||
|
|
||||||
|
rb->close(fd);
|
||||||
|
|
||||||
|
if (!save_success) {
|
||||||
|
rb->remove(RESUME_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return save_success;
|
||||||
|
}
|
||||||
|
|
||||||
/* the main menu */
|
/* the main menu */
|
||||||
static bool _ingame;
|
|
||||||
static int xobox_menu_cb(int action, const struct menu_item_ex *this_item)
|
static int xobox_menu_cb(int action, const struct menu_item_ex *this_item)
|
||||||
{
|
{
|
||||||
|
intptr_t item = (intptr_t)this_item;
|
||||||
if(action == ACTION_REQUEST_MENUITEM
|
if(action == ACTION_REQUEST_MENUITEM
|
||||||
&& !_ingame && ((intptr_t)this_item)==0)
|
&& !_ingame && (item == 0 || item == 6))
|
||||||
return ACTION_EXIT_MENUITEM;
|
return ACTION_EXIT_MENUITEM;
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
@ -1037,12 +1098,16 @@ static int xobox_menu(bool ingame)
|
||||||
MENUITEM_STRINGLIST(main_menu, "Xobox Menu", xobox_menu_cb,
|
MENUITEM_STRINGLIST(main_menu, "Xobox Menu", xobox_menu_cb,
|
||||||
"Resume Game", "Start New Game",
|
"Resume Game", "Start New Game",
|
||||||
"Speed", "Difficulty",
|
"Speed", "Difficulty",
|
||||||
"Playback Control", "Quit");
|
"High Scores", "Playback Control",
|
||||||
|
"Quit Without Saving", "Quit");
|
||||||
_ingame = ingame;
|
_ingame = ingame;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
switch (rb->do_menu(&main_menu, &selection, NULL, false)) {
|
switch (rb->do_menu(&main_menu, &selection, NULL, false)) {
|
||||||
case 0:
|
case 0:
|
||||||
|
rb->remove(RESUME_FILE);
|
||||||
|
refresh_board();
|
||||||
|
rb->splash (HZ*2, "Ready?");
|
||||||
return 0;
|
return 0;
|
||||||
case 1:
|
case 1:
|
||||||
init_game ();
|
init_game ();
|
||||||
|
@ -1055,9 +1120,22 @@ static int xobox_menu(bool ingame)
|
||||||
5, 50, 95, NULL);
|
5, 50, 95, NULL);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
playback_control(NULL);
|
highscore_show(-1, highscores, NUM_SCORES, true);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
playback_control(NULL);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
return 1;
|
||||||
|
case 7:
|
||||||
|
if (_ingame) {
|
||||||
|
rb->splash(HZ, "Saving game...");
|
||||||
|
|
||||||
|
if (!save_game()) {
|
||||||
|
rb->splash(HZ, "Failed to save game");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
case MENU_ATTACHED_USB:
|
case MENU_ATTACHED_USB:
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1074,7 +1152,7 @@ static int xobox_loop (void)
|
||||||
bool pause = false;
|
bool pause = false;
|
||||||
int end;
|
int end;
|
||||||
|
|
||||||
if (xobox_menu(false)) {
|
if (xobox_menu(_ingame)) {
|
||||||
return PLUGIN_OK;
|
return PLUGIN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1129,6 +1207,18 @@ static int xobox_loop (void)
|
||||||
}
|
}
|
||||||
if (player.gameover) {
|
if (player.gameover) {
|
||||||
rb->splash (HZ, "Game Over!");
|
rb->splash (HZ, "Game Over!");
|
||||||
|
|
||||||
|
int pos = highscore_update(player.score, player.level, "",
|
||||||
|
highscores, NUM_SCORES);
|
||||||
|
|
||||||
|
if (pos != -1) {
|
||||||
|
if (pos == 0) {
|
||||||
|
rb->splashf(HZ, "New High Score: %d", player.score);
|
||||||
|
}
|
||||||
|
|
||||||
|
highscore_show(-1, highscores, NUM_SCORES, true);
|
||||||
|
}
|
||||||
|
|
||||||
if (xobox_menu(false)) {
|
if (xobox_menu(false)) {
|
||||||
quit = true;
|
quit = true;
|
||||||
}
|
}
|
||||||
|
@ -1158,6 +1248,12 @@ enum plugin_status plugin_start (const void *parameter)
|
||||||
/* Turn off backlight timeout */
|
/* Turn off backlight timeout */
|
||||||
backlight_ignore_timeout();
|
backlight_ignore_timeout();
|
||||||
|
|
||||||
|
highscore_load(SCORE_FILE, highscores, NUM_SCORES);
|
||||||
|
|
||||||
|
if (!load_game()) {
|
||||||
|
rb->splash(HZ, "Failed to load saved game");
|
||||||
|
}
|
||||||
|
|
||||||
randomize ();
|
randomize ();
|
||||||
ret = xobox_loop ();
|
ret = xobox_loop ();
|
||||||
|
|
||||||
|
@ -1165,5 +1261,7 @@ enum plugin_status plugin_start (const void *parameter)
|
||||||
backlight_use_settings();
|
backlight_use_settings();
|
||||||
rb->lcd_setfont (FONT_UI);
|
rb->lcd_setfont (FONT_UI);
|
||||||
|
|
||||||
|
highscore_save(SCORE_FILE, highscores, NUM_SCORES);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -636,6 +636,7 @@ Ryan Billing
|
||||||
Dmitry Gamza
|
Dmitry Gamza
|
||||||
Sebastian Leonhardt
|
Sebastian Leonhardt
|
||||||
Avi Eisenberg
|
Avi Eisenberg
|
||||||
|
Richard Burke
|
||||||
|
|
||||||
The libmad team
|
The libmad team
|
||||||
The wavpack team
|
The wavpack team
|
||||||
|
|
Loading…
Reference in a new issue