From 46dfa4a8c38efc817a0c519a104fcc3a58bbda94 Mon Sep 17 00:00:00 2001 From: Allanis Date: Wed, 15 May 2013 21:53:03 +0100 Subject: [PATCH] [Add] You can now save and partially load games (mission is data is lost). --- src/lfile.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/lfile.h | 5 +++-- src/save.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/lfile.c b/src/lfile.c index f688d03..3003fd0 100644 --- a/src/lfile.c +++ b/src/lfile.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #endif @@ -49,3 +51,46 @@ int lfile_dirMakeExist(char* path) { return 0; } +// List all the files in a dir (besides . and ..). +char** lfile_readDir(int* lfiles, char* path) { + char file[PATH_MAX]; + char** files; + + snprintf(file, PATH_MAX, "%s%s", lfile_basePath(), path); + +#ifdef LINUX + DIR* d; + struct dirent *dir; + char* name; + int mfiles; + + (*lfiles) = 0; + mfiles = 100; + files = malloc(sizeof(char*)*mfiles); + + d = opendir(file); + if(d == NULL) { + return NULL; + } + + while((dir = readdir(d)) != NULL) { + name = dir->d_name; + + if((strcmp(name, ".")==0) || (strcmp(name, "..")==0)) + continue; + + if((*lfiles)+1 > mfiles) { + mfiles += 100; + files = realloc(files, sizeof(char*) * mfiles); + } + + files[(*lfiles)] = strdup(name); + (*lfiles)++; + } + + closedir(d); +#endif + + return files; +} + diff --git a/src/lfile.h b/src/lfile.h index ab49ba9..f2d1444 100644 --- a/src/lfile.h +++ b/src/lfile.h @@ -1,5 +1,6 @@ #pragma once -char* lfile_basePath(void); -int lfile_dirMakeExist(char* path); +char* lfile_basePath(void); +int lfile_dirMakeExist(char* path); +char** lfile_readDir(int* lfiles, char* path); diff --git a/src/save.c b/src/save.c index 87292ae..b21501e 100644 --- a/src/save.c +++ b/src/save.c @@ -22,6 +22,7 @@ extern void menu_main_close(void); // Static. static int save_data(xmlTextWriterPtr writer); static void load_menu_close(char* str); +static void load_menu_load(char* str); static int load_game(char* file); // Save all the game data. @@ -49,6 +50,7 @@ int save_all(void) { xmlw_start(writer); xmlw_startElem(writer, "lephisto_save"); + // Save the version or something.. xmlw_startElem(writer, "version"); xmlw_elem(writer, "lephisto", "%d.%d.%d", VMAJOR, VMINOR, VREV); xmlw_elem(writer, "data", dataname); @@ -82,10 +84,41 @@ int save_all(void) { // Open the load game menu. void load_game_menu(void) { unsigned int wid; + char** files; + int lfiles, i, len; + // Window. wid = window_create("Load Game", -1, -1, LOAD_WIDTH, LOAD_HEIGHT); + + // Load the saves. + files = lfile_readDir(&lfiles, "saves"); + for(i = 0; i < lfiles; i++) { + len = strlen(files[i]); + + // No save extension. + if((len < 6) || strcmp(&files[i][len-3], ".ls")) { + free(files[i]); + memmove(&files[i], &files[i+1], sizeof(char*) * (lfiles-i-1)); + lfiles--; + i--; + } + else // Remove the extension. + files[i][len-3] = '\0'; + } + + window_addList(wid, 20, -50, + LOAD_WIDTH-BUTTON_WIDTH-50, LOAD_HEIGHT-90, + "lstSaves", files, lfiles, 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); + + // Default action. + window_setFptr(wid, load_menu_load); } static void load_menu_close(char* str) { @@ -94,6 +127,21 @@ static void load_menu_close(char* str) { window_destroy(window_get("Load Game")); } +static void load_menu_load(char* str) { + (void)str; + char* save, path[PATH_MAX]; + int wid; + + wid = window_get("Load Game"); + + save = toolkit_getList(wid, "lstSaves"); + + snprintf(path, PATH_MAX, "%ssaves/%s.ls", lfile_basePath(), save); + load_game(path); + load_menu_close(NULL); + menu_main_close(); +} + // Load a new game. static int load_game(char* file) { xmlNodePtr node;