FS#11632: (rockboy) Some fixes and improvements by Michael Stummvoll

- increase number of slots to save/load state.
- add volume control.
- present old description when overwriting exsinting savegame and don't save when cancelled while input the description.

Flyspray: FS#11632
Author: Michael Stummvoll


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28554 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Teruaki Kawashima 2010-11-11 10:58:09 +00:00
parent 10807e85f6
commit 91bab9b5a5
2 changed files with 50 additions and 42 deletions

View file

@ -11,7 +11,7 @@
#include "rtc-gb.h"
#include "pcm.h"
#define MAX_SLOTS 5
#define SLOT_COUNT 50
#define DESC_SIZE 20
/* load/save state function declarations */
@ -169,7 +169,7 @@ static void build_slot_path(char *buf, size_t bufsiz, int slot_id) {
*
* Returns true on success and false on failure.
*
* @desc is a brief user-provided description (<20 bytes) of the state.
* @desc is a brief user-provided description of the state.
* If no description is provided, set @desc to NULL.
*
*/
@ -215,35 +215,11 @@ static bool do_file(char *path, char *desc, bool is_load) {
return true;
}
/*
* do_slot - load or save game data in the given slot
*
* Returns true on success and false on failure.
*/
static bool do_slot(int slot_id, bool is_load) {
char path_buf[256], desc_buf[DESC_SIZE];
/* build slot filename, clear desc buf */
build_slot_path(path_buf, sizeof(path_buf), slot_id);
memset(desc_buf, 0, sizeof(desc_buf));
/* if we're saving to a slot, then get a brief description */
if (!is_load)
{
if ( rb->kbd_input(desc_buf, sizeof(desc_buf)) < 0 )
return false;
if ( !strlen(desc_buf) )
strlcpy(desc_buf, "Untitled", sizeof(desc_buf));
}
/* load/save file */
return do_file(path_buf, desc_buf, is_load);
}
/*
* get information on the given slot
*/
static void slot_info(char *info_buf, size_t info_bufsiz, int slot_id) {
static void slot_info(char *info_buf, size_t info_bufsiz, int slot_id,
bool number) {
char buf[256];
int fd;
@ -259,18 +235,44 @@ static void slot_info(char *info_buf, size_t info_bufsiz, int slot_id) {
buf[DESC_SIZE] = '\0';
strlcpy(info_buf, buf, info_bufsiz);
}
else
else if(number)
strlcpy(info_buf, "ERROR", info_bufsiz);
close(fd);
}
else
else if(number)
{
/* if we couldn't open the file, then the slot is empty */
strlcpy(info_buf, "<Empty>", info_bufsiz);
}
}
/*
* do_slot - load or save game data in the given slot
*
* Returns true on success and false on failure.
*/
static bool do_slot(int slot_id, bool is_load) {
char path_buf[256], desc_buf[DESC_SIZE];
/* build slot filename, clear desc buf */
build_slot_path(path_buf, sizeof(path_buf), slot_id);
memset(desc_buf, 0, sizeof(desc_buf));
/* if we're saving to a slot, then get a brief description */
if (!is_load)
{
slot_info(desc_buf, sizeof(desc_buf), slot_id, false);
if ( rb->kbd_input(desc_buf, sizeof(desc_buf)) < 0 )
return false;
if ( !strlen(desc_buf) )
strlcpy(desc_buf, "Untitled", sizeof(desc_buf));
}
/* load/save file */
return do_file(path_buf, desc_buf, is_load);
}
/*
* slot_get_name
*/
@ -299,17 +301,16 @@ static int list_action_callback(int action, struct gui_synclist *lists)
*/
static void do_slot_menu(bool is_load) {
bool done=false;
char items[MAX_SLOTS][DESC_SIZE];
char items[SLOT_COUNT][DESC_SIZE];
int result;
int i;
int num_items = sizeof(items) / sizeof(*items);
struct simplelist_info info;
/* create menu items */
for (i = 0; i < num_items; i++)
slot_info(items[i], sizeof(*items), i);
for (i = 0; i < SLOT_COUNT; i++)
slot_info(items[i], sizeof(*items), i, true);
rb->simplelist_info_init(&info, NULL, num_items, (void *)items);
rb->simplelist_info_init(&info, NULL, SLOT_COUNT, (void *)items);
info.get_name = slot_get_name;
info.action_callback = list_action_callback;
@ -319,7 +320,7 @@ static void do_slot_menu(bool is_load) {
break;
result = info.selection;
if (result<num_items && result >= 0 )
if (result<SLOT_COUNT && result >= 0 )
done = do_slot(result, is_load);
else
done = true;
@ -384,7 +385,7 @@ static void do_opt_menu(void)
#endif
MENUITEM_STRINGLIST(menu, "Options", NULL,
"Max Frameskip", "Sound", "Stats", "Set Keys (Buggy)",
"Max Frameskip", "Sound", "Volume", "Stats", "Set Keys (Buggy)",
#ifdef HAVE_LCD_COLOR
"Screen Size", "Screen Rotate", "Set Palette",
#endif
@ -392,6 +393,9 @@ static void do_opt_menu(void)
options.dirty=1; /* Assume that the settings have been changed */
struct viewport *parentvp = NULL;
const struct settings_list* vol = rb->find_setting(&rb->global_settings->volume, NULL);
while(!done)
{
result = rb->do_menu(&menu, &selected, NULL, false);
@ -407,24 +411,27 @@ static void do_opt_menu(void)
rb->set_option("Sound", &options.sound, INT, onoff, 2, NULL );
if(options.sound) sound_dirty();
break;
case 2: /* Stats */
case 2: /* Volume */
rb->option_screen((struct settings_list*)vol, parentvp, false, "Volume");
break;
case 3: /* Stats */
rb->set_option("Stats", &options.showstats, INT, onoff, 2, NULL );
break;
case 3: /* Keys */
case 4: /* Keys */
setupkeys();
break;
#ifdef HAVE_LCD_COLOR
case 4: /* Screen Size */
case 5: /* Screen Size */
rb->set_option("Screen Size", &options.scaling, INT, scaling,
sizeof(scaling)/sizeof(*scaling), NULL );
setvidmode();
break;
case 5: /* Screen rotate */
case 6: /* Screen rotate */
rb->set_option("Screen Rotate", &options.rotate, INT, rotate,
sizeof(rotate)/sizeof(*rotate), NULL );
setvidmode();
break;
case 6: /* Palette */
case 7: /* Palette */
rb->set_option("Set Palette", &options.pal, INT, palette, 17, NULL );
set_pal();
break;

View file

@ -563,6 +563,7 @@ Calvin Walden
Michael Gentry
David Fowle
Fabian Vogel
Michael Stummvoll
The libmad team
The wavpack team