frontend: save autoload

This commit is contained in:
notaz 2013-08-31 00:58:56 +03:00
parent b59172e3d4
commit c7074ddb02
6 changed files with 54 additions and 17 deletions

View file

@ -490,6 +490,30 @@ int emu_reload_rom(const char *rom_fname_in)
if (currentConfig.EmuOpt & EOPT_EN_SRAM) if (currentConfig.EmuOpt & EOPT_EN_SRAM)
emu_save_load_game(1, 1); emu_save_load_game(1, 1);
// state autoload?
if (g_autostateld_opt) {
int time, newest = 0, newest_slot = -1;
int slot;
for (slot = 0; slot < 10; slot++) {
if (emu_check_save_file(slot, &time)) {
if (time > newest) {
newest = time;
newest_slot = slot;
}
}
}
if (newest_slot >= 0) {
lprintf("autoload slot %d\n", newest_slot);
state_slot = newest_slot;
emu_save_load_game(1, 0);
}
else {
lprintf("no save to autoload.\n");
}
}
retval = 1; retval = 1;
out: out:
if (menu_romload_started) if (menu_romload_started)
@ -736,19 +760,25 @@ void update_movie(void)
} }
} }
static int try_ropen_file(const char *fname) static int try_ropen_file(const char *fname, int *time)
{ {
struct stat st;
FILE *f; FILE *f;
f = fopen(fname, "rb"); f = fopen(fname, "rb");
if (f) { if (f) {
if (time != NULL) {
*time = 0;
if (fstat(fileno(f), &st) == 0)
*time = (int)st.st_mtime;
}
fclose(f); fclose(f);
return 1; return 1;
} }
return 0; return 0;
} }
char *emu_get_save_fname(int load, int is_sram, int slot) char *emu_get_save_fname(int load, int is_sram, int slot, int *time)
{ {
char *saveFname = static_buff; char *saveFname = static_buff;
char ext[16]; char ext[16];
@ -761,11 +791,11 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
if (!load) if (!load)
return saveFname; return saveFname;
if (try_ropen_file(saveFname)) if (try_ropen_file(saveFname, time))
return saveFname; return saveFname;
romfname_ext(saveFname, sizeof(static_buff), NULL, ext); romfname_ext(saveFname, sizeof(static_buff), NULL, ext);
if (try_ropen_file(saveFname)) if (try_ropen_file(saveFname, time))
return saveFname; return saveFname;
} }
else else
@ -783,11 +813,11 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
} }
else { else {
romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext); romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext);
if (try_ropen_file(saveFname)) if (try_ropen_file(saveFname, time))
return saveFname; return saveFname;
romfname_ext(saveFname, sizeof(static_buff), NULL, ext); romfname_ext(saveFname, sizeof(static_buff), NULL, ext);
if (try_ropen_file(saveFname)) if (try_ropen_file(saveFname, time))
return saveFname; return saveFname;
// try the other ext // try the other ext
@ -797,7 +827,7 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
strcat(ext, ext_othr); strcat(ext, ext_othr);
romfname_ext(saveFname, sizeof(static_buff), "mds"PATH_SEP, ext); romfname_ext(saveFname, sizeof(static_buff), "mds"PATH_SEP, ext);
if (try_ropen_file(saveFname)) if (try_ropen_file(saveFname, time))
return saveFname; return saveFname;
} }
} }
@ -807,7 +837,7 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
int emu_check_save_file(int slot, int *time) int emu_check_save_file(int slot, int *time)
{ {
return emu_get_save_fname(1, 0, slot) ? 1 : 0; return emu_get_save_fname(1, 0, slot, time) ? 1 : 0;
} }
int emu_save_load_game(int load, int sram) int emu_save_load_game(int load, int sram)
@ -816,7 +846,7 @@ int emu_save_load_game(int load, int sram)
char *saveFname; char *saveFname;
// make save filename // make save filename
saveFname = emu_get_save_fname(load, sram, state_slot); saveFname = emu_get_save_fname(load, sram, state_slot, NULL);
if (saveFname == NULL) { if (saveFname == NULL) {
if (!sram) if (!sram)
emu_status_msg(load ? "LOAD FAILED (missing file)" : "SAVE FAILED"); emu_status_msg(load ? "LOAD FAILED (missing file)" : "SAVE FAILED");

View file

@ -121,7 +121,7 @@ void emu_set_defconfig(void);
int emu_read_config(const char *rom_fname, int no_defaults); int emu_read_config(const char *rom_fname, int no_defaults);
int emu_write_config(int game); int emu_write_config(int game);
char *emu_get_save_fname(int load, int is_sram, int slot); char *emu_get_save_fname(int load, int is_sram, int slot, int *time);
int emu_check_save_file(int slot, int *time); int emu_check_save_file(int slot, int *time);
void emu_text_out8 (int x, int y, const char *text); void emu_text_out8 (int x, int y, const char *text);

View file

@ -135,7 +135,7 @@ static void draw_savestate_bg(int slot)
const char *fname; const char *fname;
void *tmp_state; void *tmp_state;
fname = emu_get_save_fname(1, 0, slot); fname = emu_get_save_fname(1, 0, slot, NULL);
if (!fname) if (!fname)
return; return;
@ -1166,6 +1166,7 @@ void menu_update_msg(const char *msg)
static menu_entry e_menu_hidden[] = static menu_entry e_menu_hidden[] =
{ {
mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoOpt, 0x080), mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoOpt, 0x080),
mee_onoff("autoload savestates", MA_OPT_AUTOLOAD_SAVE, g_autostateld_opt, 1),
mee_end, mee_end,
}; };

View file

@ -41,6 +41,7 @@ typedef enum
MA_OPT_ROTATION, /* uiq */ MA_OPT_ROTATION, /* uiq */
MA_OPT_TEARING_FIX, /* wiz */ MA_OPT_TEARING_FIX, /* wiz */
MA_OPT_VOUT_MODE, MA_OPT_VOUT_MODE,
MA_OPT_AUTOLOAD_SAVE,
MA_OPT2_GAMMA, MA_OPT2_GAMMA,
MA_OPT2_A_SN_GAMMA, MA_OPT2_A_SN_GAMMA,
MA_OPT2_DBLBUFF, /* giz */ MA_OPT2_DBLBUFF, /* giz */

@ -1 +1 @@
Subproject commit 7ceadd9993ea84078e9d74d79215419e06496f90 Subproject commit 9089665ca1260c338c4239583f59de981bc80c1c

View file

@ -74,16 +74,21 @@ static struct in_default_bind in_evdev_defbinds[] =
{ KEY_D, IN_BINDTYPE_PLAYER12, GBTN_C }, { KEY_D, IN_BINDTYPE_PLAYER12, GBTN_C },
{ KEY_ENTER, IN_BINDTYPE_PLAYER12, GBTN_START }, { KEY_ENTER, IN_BINDTYPE_PLAYER12, GBTN_START },
{ KEY_F, IN_BINDTYPE_EMU, PEVB_FF }, { KEY_F, IN_BINDTYPE_EMU, PEVB_FF },
{ KEY_BACKSLASH, IN_BINDTYPE_EMU, PEVB_MENU }, { KEY_BACKSPACE,IN_BINDTYPE_EMU, PEVB_FF },
{ KEY_BACKSLASH,IN_BINDTYPE_EMU, PEVB_MENU },
{ KEY_SPACE, IN_BINDTYPE_EMU, PEVB_MENU }, { KEY_SPACE, IN_BINDTYPE_EMU, PEVB_MENU },
/* Pandora */ { KEY_LEFTCTRL, IN_BINDTYPE_EMU, PEVB_MENU },
{ KEY_HOME, IN_BINDTYPE_PLAYER12, GBTN_A }, { KEY_HOME, IN_BINDTYPE_PLAYER12, GBTN_A },
{ KEY_PAGEDOWN, IN_BINDTYPE_PLAYER12, GBTN_B }, { KEY_PAGEDOWN, IN_BINDTYPE_PLAYER12, GBTN_B },
{ KEY_END, IN_BINDTYPE_PLAYER12, GBTN_C }, { KEY_END, IN_BINDTYPE_PLAYER12, GBTN_C },
{ KEY_LEFTALT, IN_BINDTYPE_PLAYER12, GBTN_START }, { KEY_LEFTALT, IN_BINDTYPE_PLAYER12, GBTN_START },
{ KEY_RIGHTSHIFT,IN_BINDTYPE_EMU, PEVB_STATE_SAVE }, { KEY_1, IN_BINDTYPE_EMU, PEVB_STATE_SAVE },
{ KEY_RIGHTCTRL, IN_BINDTYPE_EMU, PEVB_STATE_LOAD }, { KEY_2, IN_BINDTYPE_EMU, PEVB_STATE_LOAD },
{ KEY_LEFTCTRL, IN_BINDTYPE_EMU, PEVB_MENU }, { KEY_3, IN_BINDTYPE_EMU, PEVB_SSLOT_PREV },
{ KEY_4, IN_BINDTYPE_EMU, PEVB_SSLOT_NEXT },
{ KEY_5, IN_BINDTYPE_EMU, PEVB_PICO_PPREV },
{ KEY_6, IN_BINDTYPE_EMU, PEVB_PICO_PNEXT },
{ KEY_7, IN_BINDTYPE_EMU, PEVB_PICO_SWINP },
{ 0, 0, 0 } { 0, 0, 0 }
}; };