From 37a98d548f908718035a4448f9df02f03690afad Mon Sep 17 00:00:00 2001 From: Lamibe <43702757+Lamibe@users.noreply.github.com> Date: Fri, 7 Mar 2025 23:09:21 +0100 Subject: [PATCH 1/3] Put savefiles in a dedicated folder --- src/d_main.c | 8 +++++--- src/deh_soc.c | 17 ++++++++--------- src/g_game.c | 5 +++-- src/g_game.h | 1 + src/p_saveg.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/p_saveg.h | 1 + 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index d75a4d5013..4171e808d3 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1304,7 +1304,10 @@ void D_SRB2Main(void) CONS_Printf(M_GetText("Development mode ON.\n")); // default savegame - strcpy(savegamename, SAVEGAMENAME"%u.ssg"); + if(M_CheckParm("-savedir") && M_IsNextParm()) + { + snprintf(savefolder, sizeof(savefolder) - 1, "%s/", M_GetNextParm()); + } strcpy(liveeventbackup, "live"SAVEGAMENAME".bkp"); // intentionally not ending with .ssg { @@ -1333,7 +1336,6 @@ void D_SRB2Main(void) snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, srb2home); // can't use sprintf since there is %u in savegamename - strcatbf(savegamename, srb2home, PATHSEP); strcatbf(liveeventbackup, srb2home, PATHSEP); snprintf(luafiledir, sizeof luafiledir, "%s" PATHSEP "luafiles", srb2home); @@ -1346,7 +1348,6 @@ void D_SRB2Main(void) snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, userhome); // can't use sprintf since there is %u in savegamename - strcatbf(savegamename, userhome, PATHSEP); strcatbf(liveeventbackup, userhome, PATHSEP); snprintf(luafiledir, sizeof luafiledir, "%s" PATHSEP "luafiles", userhome); @@ -1354,6 +1355,7 @@ void D_SRB2Main(void) } configfile[sizeof configfile - 1] = '\0'; + P_SetSaveGameName("gamedata", SAVEGAMENAME); } // Create addons dir diff --git a/src/deh_soc.c b/src/deh_soc.c index 343beb3012..800c474e3d 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -35,6 +35,7 @@ #include "fastcmp.h" #include "lua_script.h" // Reluctantly included for LUA_EvalMath #include "netcode/d_clisrv.h" +#include "p_saveg.h" #ifdef HWRENDER #include "hardware/hw_light.h" @@ -3907,6 +3908,7 @@ void readmaincfg(MYFILE *f) else if (fastcmp(word, "GAMEDATA")) { size_t filenamelen; + char tmpfilename[256]; // Check the data filename so that mods // can't write arbitrary files. @@ -3914,23 +3916,20 @@ void readmaincfg(MYFILE *f) I_Error("Maincfg: bad data file name '%s'\n", word2); G_SaveGameData(clientGamedata); - strlcpy(gamedatafilename, word2, sizeof (gamedatafilename)); - strlwr(gamedatafilename); savemoddata = true; // Also save a time attack folder - filenamelen = strlen(gamedatafilename); // Strip off the extension + filenamelen = strlen(word2); // Strip off the extension if (filenamelen >= 4) filenamelen -= 4; if (filenamelen >= sizeof(timeattackfolder)) filenamelen = sizeof(timeattackfolder)-1; - strncpy(timeattackfolder, gamedatafilename, filenamelen); - timeattackfolder[min(filenamelen, sizeof (timeattackfolder) - 1)] = '\0'; + strncpy(tmpfilename, word2, filenamelen); + tmpfilename[min(filenamelen, sizeof (timeattackfolder) - 1)] = '\0'; + strlwr(tmpfilename); + strncpy(timeattackfolder, tmpfilename, sizeof(timeattackfolder) - 1); - strcpy(savegamename, timeattackfolder); - strlcat(savegamename, "%u.ssg", sizeof(savegamename)); - // can't use sprintf since there is %u in savegamename - strcatbf(savegamename, srb2home, PATHSEP); + P_SetSaveGameName(tmpfilename, tmpfilename); strcpy(liveeventbackup, va("live%s.bkp", timeattackfolder)); strcatbf(liveeventbackup, srb2home, PATHSEP); diff --git a/src/g_game.c b/src/g_game.c index 1c186ae031..bb8dce444f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -71,6 +71,7 @@ JoyType_t Joystick2; char gamedatafilename[64] = "gamedata.dat"; char timeattackfolder[64] = "main"; +char savefolder[64] = "save"; char customversionstring[32] = "\0"; static void G_DoCompleted(void); @@ -4745,7 +4746,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) { save_t savebuffer; char vcheck[VERSIONSIZE]; - char savename[255]; + char savename[260]; // memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots memset(&savedata, 0, sizeof(savedata)); @@ -4835,7 +4836,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) { save_t savebuffer; boolean saved; - char savename[256] = ""; + char savename[260] = ""; const char *backup; if (marathonmode) diff --git a/src/g_game.h b/src/g_game.h index f72ea6b41b..89f173ebcd 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -23,6 +23,7 @@ extern char gamedatafilename[64]; extern char timeattackfolder[64]; +extern char savefolder[64]; extern char customversionstring[32]; #define GAMEDATASIZE (4*8192) diff --git a/src/p_saveg.c b/src/p_saveg.c index 650622f59f..98a123206c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -36,6 +36,7 @@ #include "lua_script.h" #include "p_slopes.h" #include "hu_stuff.h" +#include "m_menu.h" savedata_t savedata; @@ -5355,6 +5356,51 @@ static inline boolean P_UnArchiveLuabanksAndConsistency(save_t *save_p) return true; } +void P_SetSaveGameName(const char* gamedataPrefix, const char* savedataPrefix) +{ + char buffer[512]; + snprintf(buffer, sizeof(buffer) -1, "%s/%s", srb2home, savefolder); + I_mkdir(buffer, 0755); + snprintf(gamedatafilename, sizeof(gamedatafilename) - 1, "%s/%s/%s.dat", srb2home, savefolder, gamedataPrefix); + snprintf(savegamename, sizeof(savegamename) - 1, "%s/%s/%s%%u.ssg", srb2home, savefolder, savedataPrefix); + + CONS_Printf("%s\n%s\n%s\n", gamedatafilename, timeattackfolder, savegamename); + + // Attempt to copy files from root if we don't have a gamedata + FILE* f = fopen(gamedatafilename, "rb"); + if(!f) + { + char dataBuffer[GAMEDATASIZE]; + char buffer2[512]; + snprintf(buffer, sizeof(buffer) - 1, "%s/%s.dat", srb2home, gamedataPrefix); + + f = fopen(buffer, "rb"); + if(f) + { + fclose(f); + rename(buffer, gamedatafilename); + } + + + // Now repeat for saves + for(int slot = 0; slot < (MAXSAVEGAMES - 1); slot++) + { + snprintf(buffer, sizeof(buffer) - 1, "%s/%s%u.ssg", srb2home, savedataPrefix, slot); + f = fopen(buffer, "rb"); + if(f) + { + snprintf(buffer2, sizeof(buffer2) - 1, "%s/%s/%s%u.ssg", srb2home, savefolder, savedataPrefix, slot); + fclose(f); + rename(buffer, buffer2); + } + } + } + else + { + fclose(f); + } +} + void P_SaveGame(save_t *save_p, INT16 mapnum) { P_ArchiveMisc(save_p, mapnum); diff --git a/src/p_saveg.h b/src/p_saveg.h index 05e82190ae..d1b976fb93 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -32,6 +32,7 @@ typedef struct size_t pos; } save_t; +void P_SetSaveGameName(const char* gamedataPrefix, const char* savedataPrefix); void P_SaveGame(save_t *save_p, INT16 mapnum); void P_SaveNetGame(save_t *save_p, boolean resending); boolean P_LoadGame(save_t *save_p, INT16 mapoverride); -- GitLab From 6619f326315aadc0c83c664a56e7422555a0ef9b Mon Sep 17 00:00:00 2001 From: Lamibe <43702757+Lamibe@users.noreply.github.com> Date: Sat, 8 Mar 2025 14:42:08 +0100 Subject: [PATCH 2/3] Added live-event backup --- src/d_main.c | 9 ++------- src/deh_soc.c | 3 --- src/doomdef.h | 4 ++-- src/g_game.c | 2 +- src/g_game.h | 2 +- src/p_saveg.c | 3 ++- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 4171e808d3..23ccd71f28 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -132,8 +132,8 @@ INT32 debugload = 0; UINT16 numskincolors; menucolor_t *menucolorhead, *menucolortail; -char savegamename[256]; -char liveeventbackup[256]; +char savegamename[512]; +char liveeventbackup[512]; char srb2home[256] = "."; char srb2path[256] = "."; @@ -1308,8 +1308,6 @@ void D_SRB2Main(void) { snprintf(savefolder, sizeof(savefolder) - 1, "%s/", M_GetNextParm()); } - strcpy(liveeventbackup, "live"SAVEGAMENAME".bkp"); // intentionally not ending with .ssg - { const char *userhome = D_Home(); //Alam: path to home @@ -1347,9 +1345,6 @@ void D_SRB2Main(void) else snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, userhome); - // can't use sprintf since there is %u in savegamename - strcatbf(liveeventbackup, userhome, PATHSEP); - snprintf(luafiledir, sizeof luafiledir, "%s" PATHSEP "luafiles", userhome); #endif // DEFAULTDIR } diff --git a/src/deh_soc.c b/src/deh_soc.c index 800c474e3d..e79380170c 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3931,9 +3931,6 @@ void readmaincfg(MYFILE *f) P_SetSaveGameName(tmpfilename, tmpfilename); - strcpy(liveeventbackup, va("live%s.bkp", timeattackfolder)); - strcatbf(liveeventbackup, srb2home, PATHSEP); - gamedataadded = true; titlechanged = true; } diff --git a/src/doomdef.h b/src/doomdef.h index 81ab7bbfb5..c53acc0cff 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -537,8 +537,8 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG; // Things that used to be in dstrings.h #define SAVEGAMENAME "srb2sav" -extern char savegamename[256]; -extern char liveeventbackup[256]; +extern char savegamename[512]; +extern char liveeventbackup[512]; // m_misc.h #ifdef GETTEXT diff --git a/src/g_game.c b/src/g_game.c index bb8dce444f..34f2678799 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -69,7 +69,7 @@ JoyType_t Joystick2; // 1024 bytes is plenty for a savegame #define SAVEGAMESIZE (1024) -char gamedatafilename[64] = "gamedata.dat"; +char gamedatafilename[512] = "gamedata.dat"; char timeattackfolder[64] = "main"; char savefolder[64] = "save"; char customversionstring[32] = "\0"; diff --git a/src/g_game.h b/src/g_game.h index 89f173ebcd..c5c1b3863e 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -21,7 +21,7 @@ #include "m_cheat.h" // objectplacing #include "m_cond.h" -extern char gamedatafilename[64]; +extern char gamedatafilename[512]; extern char timeattackfolder[64]; extern char savefolder[64]; extern char customversionstring[32]; diff --git a/src/p_saveg.c b/src/p_saveg.c index 98a123206c..035492894a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -37,6 +37,7 @@ #include "p_slopes.h" #include "hu_stuff.h" #include "m_menu.h" +#include "i_system.h" savedata_t savedata; @@ -5363,6 +5364,7 @@ void P_SetSaveGameName(const char* gamedataPrefix, const char* savedataPrefix) I_mkdir(buffer, 0755); snprintf(gamedatafilename, sizeof(gamedatafilename) - 1, "%s/%s/%s.dat", srb2home, savefolder, gamedataPrefix); snprintf(savegamename, sizeof(savegamename) - 1, "%s/%s/%s%%u.ssg", srb2home, savefolder, savedataPrefix); + snprintf(liveeventbackup, sizeof(liveeventbackup) - 1, "%s/%s/live%s.bkp", srb2home, savefolder, savedataPrefix); CONS_Printf("%s\n%s\n%s\n", gamedatafilename, timeattackfolder, savegamename); @@ -5370,7 +5372,6 @@ void P_SetSaveGameName(const char* gamedataPrefix, const char* savedataPrefix) FILE* f = fopen(gamedatafilename, "rb"); if(!f) { - char dataBuffer[GAMEDATASIZE]; char buffer2[512]; snprintf(buffer, sizeof(buffer) - 1, "%s/%s.dat", srb2home, gamedataPrefix); -- GitLab From f59fef69af6c3e09c08516a4f4d27564ecf9ce7e Mon Sep 17 00:00:00 2001 From: Lamibe <43702757+Lamibe@users.noreply.github.com> Date: Sat, 8 Mar 2025 18:31:06 +0100 Subject: [PATCH 3/3] Fixed a warning --- src/deh_soc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index e79380170c..7fce4aa119 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3908,7 +3908,7 @@ void readmaincfg(MYFILE *f) else if (fastcmp(word, "GAMEDATA")) { size_t filenamelen; - char tmpfilename[256]; + char tmpfilename[sizeof(timeattackfolder)]; // Check the data filename so that mods // can't write arbitrary files. @@ -3927,7 +3927,7 @@ void readmaincfg(MYFILE *f) strncpy(tmpfilename, word2, filenamelen); tmpfilename[min(filenamelen, sizeof (timeattackfolder) - 1)] = '\0'; strlwr(tmpfilename); - strncpy(timeattackfolder, tmpfilename, sizeof(timeattackfolder) - 1); + strncpy(timeattackfolder, tmpfilename, sizeof(timeattackfolder)); P_SetSaveGameName(tmpfilename, tmpfilename); -- GitLab