diff --git a/Source/m_menu.c b/Source/m_menu.c index 5ba93933..2b68ce81 100644 --- a/Source/m_menu.c +++ b/Source/m_menu.c @@ -51,6 +51,8 @@ #include "d_deh.h" #include "m_misc.h" #include "m_misc2.h" // [FG] M_StringDuplicate() +#include "p_setup.h" // [FG] maplumpnum +#include "w_wad.h" // [FG] W_IsIWADLump() / W_WadNameForLump() extern patch_t* hu_font[HU_FONTSIZE]; extern boolean message_dontfuckwithme; @@ -919,6 +921,56 @@ void M_DoSave(int slot) quickSaveSlot = slot; } +// [FG] generate a default save slot name when the user saves to an empty slot +static void SetDefaultSaveName (int slot) +{ + // map from IWAD or PWAD? + if (W_IsIWADLump(maplumpnum)) + { + snprintf(savegamestrings[itemOn], SAVESTRINGSIZE, + "%s", lumpinfo[maplumpnum].name); + } + else + { + char *wadname = M_StringDuplicate(W_WadNameForLump(maplumpnum)); + char *ext = strrchr(wadname, '.'); + + if (ext != NULL) + { + *ext = '\0'; + } + + snprintf(savegamestrings[itemOn], SAVESTRINGSIZE, + "%s (%s)", lumpinfo[maplumpnum].name, + wadname); + (free)(wadname); + } + + M_ForceUppercase(savegamestrings[itemOn]); +} + +// [FG] override savegame name if it already starts with a map identifier +static boolean StartsWithMapIdentifier (char *str) +{ + M_ForceUppercase(str); + + if (strlen(str) >= 4 && + str[0] == 'E' && isdigit(str[1]) && + str[2] == 'M' && isdigit(str[3])) + { + return true; + } + + if (strlen(str) >= 5 && + str[0] == 'M' && str[1] == 'A' && str[2] == 'P' && + isdigit(str[3]) && isdigit(str[4])) + { + return true; + } + + return false; +} + // // User wants to save. Start string input for M_Responder // @@ -929,8 +981,13 @@ void M_SaveSelect(int choice) saveSlot = choice; strcpy(saveOldString,savegamestrings[choice]); - if (!strcmp(savegamestrings[choice],s_EMPTYSTRING)) // Ty 03/27/98 - externalized + // [FG] override savegame name if it already starts with a map identifier + if (!strcmp(savegamestrings[choice],s_EMPTYSTRING) || // Ty 03/27/98 - externalized + StartsWithMapIdentifier(savegamestrings[choice])) + { savegamestrings[choice][0] = 0; + SetDefaultSaveName(choice); + } saveCharIndex = strlen(savegamestrings[choice]); } diff --git a/Source/p_setup.c b/Source/p_setup.c index fdacfce5..aa4ca354 100644 --- a/Source/p_setup.c +++ b/Source/p_setup.c @@ -1024,6 +1024,9 @@ static void P_LoadReject(int lumpnum) // // killough 5/3/98: reformatted, cleaned up +// [FG] current map lump number +int maplumpnum = -1; + void P_SetupLevel(int episode, int map, int playermask, skill_t skill) { int i; @@ -1139,6 +1142,9 @@ void P_SetupLevel(int episode, int map, int playermask, skill_t skill) // preload graphics if (precache) R_PrecacheLevel(); + + // [FG] current map lump number + maplumpnum = lumpnum; } // diff --git a/Source/p_setup.h b/Source/p_setup.h index 20bf6f2e..1eeaf3ea 100644 --- a/Source/p_setup.h +++ b/Source/p_setup.h @@ -45,6 +45,8 @@ extern int bmapheight; // in mapblocks extern fixed_t bmaporgx; extern fixed_t bmaporgy; // origin of block map extern mobj_t **blocklinks; // for thing chains +// [FG] current map lump number +extern int maplumpnum; #endif diff --git a/Source/w_wad.c b/Source/w_wad.c index 8aba08fb..82646bc7 100644 --- a/Source/w_wad.c +++ b/Source/w_wad.c @@ -32,6 +32,8 @@ #include #include "w_wad.h" +#include "m_misc2.h" // [FG] M_BaseName() +#include "d_main.h" // [FG] wadfiles // // GLOBALS @@ -213,6 +215,8 @@ static void W_AddFile(const char *name) // killough 1/31/98: static, const lump_p->data = NULL; // killough 1/31/98 lump_p->namespace = ns_global; // killough 4/17/98 strncpy (lump_p->name, fileinfo->name, 8); + // [FG] WAD file that contains the lump + lump_p->wad_file = name; } free(fileinfo2free); // killough @@ -560,6 +564,21 @@ void WritePredefinedLumpWad(const char *filename) I_Error("Cannot open predefined lumps wad %s for output\n", filename); } +// [FG] name of the WAD file that contains the lump +const char *W_WadNameForLump (const int lump) +{ + return (lump >= 0 && lump < numlumps) ? + (lumpinfo[lump].wad_file ? + M_BaseName(lumpinfo[lump].wad_file) : + "predefined") : "invalid"; +} + +boolean W_IsIWADLump (const int lump) +{ + return lump >= 0 && lump < numlumps && + lumpinfo[lump].wad_file == wadfiles[0]; +} + //---------------------------------------------------------------------------- // // $Log: w_wad.c,v $ diff --git a/Source/w_wad.h b/Source/w_wad.h index 23231412..61b1bd7c 100644 --- a/Source/w_wad.h +++ b/Source/w_wad.h @@ -74,6 +74,9 @@ typedef struct int handle; int position; + + // [FG] WAD file that contains the lump + const char *wad_file; } lumpinfo_t; // killough 1/31/98: predefined lumps @@ -108,6 +111,10 @@ void I_BeginRead(unsigned int bytes), I_EndRead(void); // killough 10/98 // Function to write all predefined lumps to a PWAD if requested extern void WritePredefinedLumpWad(const char *filename); // jff 5/6/98 +// [FG] name of the WAD file that contains the lump +const char *W_WadNameForLump (const int lump); +boolean W_IsIWADLump (const int lump); + #endif //----------------------------------------------------------------------------