diff --git a/src/land.c b/src/land.c index a450068..3c436de 100644 --- a/src/land.c +++ b/src/land.c @@ -180,14 +180,14 @@ static void commodity_exchange_open(void) { */ static void commodity_update(unsigned int wid, char* str) { (void)str; - char buf[128]; + char buf[PATH_MAX]; char* comname; Commodity* com; comname = toolkit_getList(wid, "lstGoods"); com = commodity_get(comname); - snprintf(buf, 128, + snprintf(buf, PATH_MAX, "%d tons\n" "%d Scred\n" "\n" @@ -1473,7 +1473,10 @@ void takeoff(void) { hyperspace_target = h; /* Cleanup. */ - save_all(); /* Must be before cleaning up planet. Duh! */ + if(save_all() < 0) { /* Must be before cleaning up planet. Duh! */ + dialogue_alert("Failed to save game! You should exit and check the log to \ + see what happened and then file a bug report!"); + } land_cleanup(); /* Cleanup stuff. */ hooks_run("takeoff"); /* Must be run after cleanup sine we don't want the missions to think we are landed. */ diff --git a/src/opengl.c b/src/opengl.c index 261ef1c..3f498bd 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -643,7 +643,12 @@ void gl_freeTexture(glTexture* texture) { * @return 1 if the pixel is transparent or 0 if it isn't. */ int gl_isTrans(const glTexture* t, const int x, const int y) { - return !(t->trans[(y*(int)(t->w)+x)/8] & (1<<((y*(int)(t->w)+x)%8))); + int i; + + /* Get the position in the sheet. */ + i = y*(int)(t->w) + x; + /* Now we have to pull out the individual bit. */ + return !(t->trans[i/8] & (1 << (i%8))); } /** diff --git a/src/save.c b/src/save.c index fd4d5a4..bd77d7d 100644 --- a/src/save.c +++ b/src/save.c @@ -5,6 +5,8 @@ */ #include /* remove() */ +#include + #include "lephisto.h" #include "log.h" #include "lxml.h" @@ -55,7 +57,11 @@ static void load_menu_load(unsigned int wdw, char* str); static void load_menu_delete(unsigned wdw, char* str); static int load_game(char* file); -/* Save all the game data. */ +/** + * @brief Save all the players game data. + * @param writer XML writer to use. + * @return 0 on success. + */ static int save_data(xmlTextWriterPtr writer) { /* The data itself. */ if(diff_save(writer) < 0) return -1; /* Must save first or can get cleared. */ @@ -68,9 +74,12 @@ static int save_data(xmlTextWriterPtr writer) { return 0; } -/* Save the current game. */ +/** + * @brief Save the current game. + * @return 0 on success. + */ int save_all(void) { - char file[PATH_MAX]; + char file[PATH_MAX], old[PATH_MAX]; xmlDocPtr doc; xmlTextWriterPtr writer; @@ -98,9 +107,7 @@ int save_all(void) { /* Save the data. */ if(save_data(writer) < 0) { ERR("Trying to save game data"); - xmlFreeTextWriter(writer); - xmlFreeDoc(doc); - return -1; + goto err_writer; } /* Finish the element. */ @@ -110,23 +117,42 @@ int save_all(void) { /* Write to file. */ if(lfile_dirMakeExist("%ssaves", lfile_basePath()) < 0) { WARN("Aborting save..."); - xmlFreeTextWriter(writer); - xmlFreeDoc(doc); - return -1; + goto err_writer; } snprintf(file, PATH_MAX, "%ssaves/%s.ls", lfile_basePath(), player_name); + /* Back up old savegame. */ + snprintf(old, PATH_MAX, "%s.backup", file); + if(lfile_fileExists(file)) { + if(rename(file, old) < 0) { + WARN("Unable to back up old save: %s. Not saving!", strerror(errno)); + goto err_writer; + } + } + /* Critical section, if crashes, the players save game gets screwed!!! - * HAHAHAHAHA!!!!! -- NOT! + * Luckily we have a copy just in case.. */ xmlFreeTextWriter(writer); - xmlSaveFileEnc(file, doc, "UTF-8"); + if(xmlSaveFileEnc(file, doc, "UTF-8") < 0) { + WARN("Failed to write savegame! You'll most likey have to restore it by \ + copying your backup savegame over your current savegame."); + goto err; + } xmlFreeDoc(doc); return 0; + +err_writer: + xmlFreeTextWriter(writer); +err: + xmlFreeDoc(doc); + return -1; } -/* Open the load game menu. */ +/** + * @brief Open the load game menu. + */ void load_game_menu(void) { unsigned int wid; char** files;