int OnSaveStateOk(const void *gallery, const void *item) { if (!GAME_LOADED) return 0; char *path; const char *config_name = pl_file_get_filename(CURRENT_GAME); path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, ((const pl_menu_item*)item)->id); if (pl_file_exists(path) && pspUiConfirm("Load state?")) { if (LoadState(path)) { ResumeEmulation = 1; pl_rewind_reset(&Rewinder); pl_menu_find_item_by_id(&(((const PspUiGallery*)gallery)->Menu), ((const pl_menu_item*)item)->id); free(path); return 1; } pspUiAlert("ERROR: State failed to load"); } free(path); return 0; }
const char* pl_file_get_extension(const char *path) { const char *filename = pl_file_get_filename(path); const char *ext; if (!(ext = strrchr(filename, '.'))) return filename + strlen(filename); return ext + 1; }
int OnMenuOk(const void *uimenu, const void* sel_item) { if (uimenu == &ControlUiMenu) { /* Save to MS */ if (SaveButtonConfig()) pspUiAlert("Changes saved"); else pspUiAlert("ERROR: Changes not saved"); } else if (uimenu == &SystemUiMenu) { switch (((const pl_menu_item*)sel_item)->id) { case SYSTEM_RESET: /* Reset system */ if (pspUiConfirm("Reset the system?")) { ResumeEmulation = 1; system_reset(); pl_rewind_reset(&Rewinder); return 1; } break; case SYSTEM_SCRNSHOT: /* Save screenshot */ if (!pl_util_save_image_seq(ScreenshotPath, pl_file_get_filename(CURRENT_GAME), Screen)) pspUiAlert("ERROR: Screenshot not saved"); else pspUiAlert("Screenshot saved successfully"); break; } } return 0; }
/* Save or load SRAM */ void system_manage_sram(uint8 *sram, int slot, int mode) { FILE *fd; const char *config_name = pl_file_get_filename(CURRENT_GAME); char *path = (char*)malloc(sizeof(char) * (strlen(SaveStatePath) + strlen(config_name) + 8)); sprintf(path, "%s%s.srm", SaveStatePath, config_name); /*switch(mode) { case SRAM_SAVE: if(sms.save) { fd = fopen(path, "w"); if(fd) { fwrite(sram, 0x8000, 1, fd); fclose(fd); } } break; case SRAM_LOAD: fd = fopen(path, "r"); if(fd) { sms.save = 1; fread(sram, 0x8000, 1, fd); fclose(fd); } else {*/ /* No SRAM file, so initialize memory */ /* memset(sram, 0x00, 0x8000); } break; } */ free(path); }
static void DisplayStateTab() { if (!GAME_LOADED) { TabIndex++; return; } pl_menu_item *item, *sel; SceIoStat stat; char caption[32]; ScePspDateTime latest; const char *config_name = pl_file_get_filename(CURRENT_GAME); char *path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); char *game_name = strdup(config_name); char *dot = strrchr(game_name, '.'); if (dot) *dot='\0'; memset(&latest, 0, sizeof(latest)); /* Initialize icons */ sel = SaveStateGallery.Menu.items; for (item = SaveStateGallery.Menu.items; item; item = item->next) { sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, item->id); if (pl_file_exists(path)) { if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else { /* Determine the latest save state */ if (pl_util_date_compare(&latest, &stat.st_mtime) < 0) { sel = item; latest = stat.st_mtime; } sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); } pl_menu_set_item_caption(item, caption); item->param = LoadStateIcon(path); pl_menu_set_item_help_text(item, PresentSlotText); } else { pl_menu_set_item_caption(item, "Empty"); item->param = NoSaveIcon; pl_menu_set_item_help_text(item, EmptySlotText); } } free(path); /* Highlight the latest save state if none are selected */ if (SaveStateGallery.Menu.selected == NULL) SaveStateGallery.Menu.selected = sel; pspUiOpenGallery(&SaveStateGallery, game_name); free(game_name); /* Destroy any icons */ for (item = SaveStateGallery.Menu.items; item; item = item->next) if (item->param != NULL && item->param != NoSaveIcon) pspImageDestroy((PspImage*)item->param); }
int OnSaveStateButtonPress(const PspUiGallery *gallery, pl_menu_item *sel, u32 button_mask) { if (!GAME_LOADED) return 0; if (button_mask & PSP_CTRL_SQUARE || button_mask & PSP_CTRL_TRIANGLE) { char caption[32]; char *path; const char *config_name = pl_file_get_filename(CURRENT_GAME); path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, sel->id); do /* not a real loop; flow control construct */ { if (button_mask & PSP_CTRL_SQUARE) { if (pl_file_exists(path) && !pspUiConfirm("Overwrite existing state?")) break; pspUiFlashMessage("Saving, please wait ..."); PspImage *icon; if (!(icon = SaveState(path, Screen))) { pspUiAlert("ERROR: State not saved"); break; } SceIoStat stat; /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, help text */ sel->param = icon; pl_menu_set_item_help_text(sel, PresentSlotText); /* Get file modification time/date */ if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); pl_menu_set_item_caption(sel, caption); } else if (button_mask & PSP_CTRL_TRIANGLE) { if (!pl_file_exists(path) || !pspUiConfirm("Delete state?")) break; if (!pl_file_rm(path)) { pspUiAlert("ERROR: State not deleted"); break; } /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, caption */ sel->param = NoSaveIcon; pl_menu_set_item_help_text(sel, EmptySlotText); pl_menu_set_item_caption(sel, "Empty"); } } while (0); if (path) free(path); return 0; } return OnGenericButtonPress(NULL, NULL, button_mask); }