/** * @brief Checks to see if there's a savegame available. * * @return 1 if a savegame is available, 0 otherwise. */ int save_hasSave (void) { char **files; int nfiles, i, len; int has_save; /* Look for saved games. */ files = nfile_readDir( &nfiles, "%ssaves", nfile_dataPath() ); has_save = 0; for (i=0; i<nfiles; i++) { len = strlen(files[i]); /* no save extension */ if ((len >= 5) && (strcmp(&files[i][len-3],".ns")==0)) { has_save = 1; break; } } /* Clean up. */ for (i=0; i<nfiles; i++) free(files[i]); free(files); return has_save; }
/** * @brief Opens the load game menu. */ void load_game_menu (void) { unsigned int wid; char **files; int nfiles, i, len; /* window */ wid = window_create( "Load Game", -1, -1, LOAD_WIDTH, LOAD_HEIGHT ); window_setCancel( wid, load_menu_close ); /* load the saves */ files = nfile_readDir( &nfiles, "%ssaves", nfile_basePath() ); for (i=0; i<nfiles; i++) { len = strlen(files[i]); /* no save extension */ if ((len < 5) || strcmp(&files[i][len-3],".ns")) { free(files[i]); memmove( &files[i], &files[i+1], sizeof(char*) * (nfiles-i-1) ); nfiles--; i--; } else /* remove the extension */ files[i][len-3] = '\0'; } /* case there are no files */ if (files == NULL) { files = malloc(sizeof(char*)); files[0] = strdup("None"); nfiles = 1; } window_addList( wid, 20, -50, LOAD_WIDTH-BUTTON_WIDTH-50, LOAD_HEIGHT-110, "lstSaves", files, nfiles, 0, NULL ); /* buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBack", "Back", load_menu_close ); window_addButton( wid, -20, 30 + BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT, "btnLoad", "Load", load_menu_load ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDelete", "Del", load_menu_delete ); /* default action */ window_setAccept( wid, load_menu_load ); }
/** * @brief Loads or refreshes saved games. */ int load_refresh (void) { char **files, buf[PATH_MAX], *tmp; int nfiles, i, len; int ok; nsave_t *ns; if (load_saves != NULL) load_free(); load_saves = array_create( nsave_t ); /* load the saves */ files = nfile_readDir( &nfiles, "%ssaves", nfile_dataPath() ); for (i=0; i<nfiles; i++) { len = strlen(files[i]); /* no save or backup save extension */ if (((len < 5) || strcmp(&files[i][len-3],".ns")) && ((len < 12) || strcmp(&files[i][len-10],".ns.backup"))) { free(files[i]); memmove( &files[i], &files[i+1], sizeof(char*) * (nfiles-i-1) ); nfiles--; i--; } } /* Make sure files are none. */ if (files == NULL) return 0; /* Make sure backups are after saves. */ for (i=0; i<nfiles-1; i++) { len = strlen( files[i] ); /* Only interested in swapping backup with file after it if it's not backup. */ if ((len < 12) || strcmp( &files[i][len-10],".ns.backup" )) continue; /* Don't match. */ if (strncmp( files[i], files[i+1], (len-10) )) continue; /* Swap around. */ tmp = files[i]; files[i] = files[i+1]; files[i+1] = tmp; } /* Allocate and parse. */ ok = 0; ns = NULL; for (i=0; i<nfiles; i++) { if (!ok) ns = &array_grow( &load_saves ); nsnprintf( buf, sizeof(buf), "%ssaves/%s", nfile_dataPath(), files[i] ); ok = load_load( ns, buf ); } /* If the save was invalid, array is 1 member too large. */ if (ok) array_resize( &load_saves, array_size(load_saves)-1 ); /* Clean up memory. */ for (i=0; i<nfiles; i++) free(files[i]); free(files); return 0; }