diff --git a/cgdoom/d_englsh.h b/cgdoom/d_englsh.h index 3649248..5c6b7e8 100644 --- a/cgdoom/d_englsh.h +++ b/cgdoom/d_englsh.h @@ -135,7 +135,7 @@ // // G_game.C // -#define GGSAVED "Game will save on exit" +#define GGSAVED "Save file will be created on exit" // // HU_stuff.C diff --git a/cgdoom/g_game.c b/cgdoom/g_game.c index 7abb1f1..50199e2 100644 --- a/cgdoom/g_game.c +++ b/cgdoom/g_game.c @@ -924,11 +924,11 @@ void G_DoWorldDone (void) extern boolean setsizeneeded; void R_ExecuteSetViewSize (void); -char savename[256]; +int saveslotnumber; -void G_LoadGame (char* name) +void G_LoadGame (int slot) { - CGDstrcpy (savename, name); + saveslotnumber = slot; gameaction = ga_loadgame; } @@ -940,11 +940,21 @@ void G_DoLoadGame (void) int i; int a,b,c; char vcheck[VERSIONSIZE]; + char savename[64]; gameaction = ga_nothing; - length = M_ReadFile (savename, &savebuffer); - I_ReinitAfterError(); + /* Read data from yet-unsaved saves */ + if (CGD_DelayedSaves[saveslotnumber].data != NULL) { + savebuffer = (void *)CGD_DelayedSaves[saveslotnumber].data; + length = CGD_DelayedSaves[saveslotnumber].size; + } + else { + sprintf(savename, "%s_%d.dsg", CGD_WADFileName, saveslotnumber); + length = M_ReadFile (savename, &savebuffer); + I_ReinitAfterError(); + } + save_p = savebuffer + SAVESTRINGSIZE; if (length < 0) @@ -982,7 +992,8 @@ void G_DoLoadGame (void) I_Error ("Bad savegame"); // done - Z_Free (savebuffer); + if (CGD_DelayedSaves[saveslotnumber].data == NULL) + Z_Free (savebuffer); if (setsizeneeded) R_ExecuteSetViewSize (); @@ -1073,7 +1084,7 @@ boolean G_DoSaveGame (void) gameaction = ga_nothing; savedescription[0] = 0; - static char msg[40]; + static char msg[64]; sprintf(msg, GGSAVED " (%d kB)", length >> 10); players[consoleplayer].message = msg; diff --git a/cgdoom/g_game.h b/cgdoom/g_game.h index 5917c46..0a41841 100644 --- a/cgdoom/g_game.h +++ b/cgdoom/g_game.h @@ -44,12 +44,11 @@ void G_DeferedPlayDemo (char* demo); // Can be called by the startup code or M_Responder, // calls P_SetupLevel or W_EnterWorld. -//void G_LoadGame (char* name); void G_DoLoadGame (void); // Called by M_Responder. -void G_LoadGame (char* name); +void G_LoadGame (int slot); void G_SaveGame (int slot, char* description); void G_TimeDemo (char* name); diff --git a/cgdoom/m_menu.c b/cgdoom/m_menu.c index 3b6c374..185b5ec 100644 --- a/cgdoom/m_menu.c +++ b/cgdoom/m_menu.c @@ -467,6 +467,14 @@ void M_ReadSaveStrings(void) for (i = 0;i < load_end;i++) { + /* Use the pending file write as a bypass */ + if (CGD_DelayedSaves[i].data != NULL) { + memcpy(savegamestrings[i], CGD_DelayedSaves[i].data, + SAVESTRINGSIZE); + LoadMenu[i].status = 1; + continue; + } + sprintf(name, "%s_%d.dsg", CGD_WADFileName, i); memcpy(fc_path, u"\\\\fls0\\", 14); for (j = 0; name[j]; j++) @@ -537,9 +545,7 @@ void M_DrawSaveLoadBorder(int x,int y,int height,int count) // void M_LoadSelect(int choice) { - char name[64]; - sprintf(name, "%s_%d.dsg", CGD_WADFileName, choice); - G_LoadGame (name); + G_LoadGame (choice); M_ClearMenus (); } diff --git a/cgdoom/z_zone.c b/cgdoom/z_zone.c index ec92662..d2f057e 100644 --- a/cgdoom/z_zone.c +++ b/cgdoom/z_zone.c @@ -165,7 +165,7 @@ void Z_Free (const void* ptr) if (block->id != ZONEID) { - I_Error ("Z_Free: freed a pointer without ZONEID"); + I_Error ("Z_Free: freed a pointer without ZONEID: %p", ptr); } if (block->user > (void **)0x100)