summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/d_iwad.c28
-rw-r--r--src/d_iwad.h1
-rw-r--r--src/doom/d_main.c57
-rw-r--r--src/m_config.c37
-rw-r--r--src/m_config.h1
5 files changed, 89 insertions, 35 deletions
diff --git a/src/d_iwad.c b/src/d_iwad.c
index 72e3e3ad..5cc31738 100644
--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -727,3 +727,31 @@ iwad_t **D_FindAllIWADs(int mask)
return result;
}
+//
+// Get the IWAD name used for savegames.
+//
+
+char *D_SaveGameIWADName(GameMission_t gamemission)
+{
+ size_t i;
+
+ // Determine the IWAD name to use for savegames.
+ // This determines the directory the savegame files get put into.
+ //
+ // Note that we match on gamemission rather than on IWAD name.
+ // This ensures that doom1.wad and doom.wad saves are stored
+ // in the same place.
+
+ for (i=0; i<arrlen(iwads); ++i)
+ {
+ if (gamemission == iwads[i].mission)
+ {
+ return iwads[i].name;
+ }
+ }
+
+ // Default fallback:
+
+ return "unknown.wad";
+}
+
diff --git a/src/d_iwad.h b/src/d_iwad.h
index f95b4258..f3a6c2d8 100644
--- a/src/d_iwad.h
+++ b/src/d_iwad.h
@@ -48,6 +48,7 @@ char *D_FindWADByName(char *filename);
char *D_TryFindWADByName(char *filename);
char *D_FindIWAD(int mask, GameMission_t *mission);
iwad_t **D_FindAllIWADs(int mask);
+char *D_SaveGameIWADName(GameMission_t gamemission);
#endif
diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index f626d408..0e5324b4 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -786,40 +786,6 @@ void D_SetGameDescription(void)
}
}
-static void SetSaveGameDir(char *iwad_filename)
-{
- char *sep;
- char *basefile;
-
- // Extract the base filename
-
- sep = strrchr(iwad_filename, DIR_SEPARATOR);
-
- if (sep == NULL)
- {
- basefile = iwad_filename;
- }
- else
- {
- basefile = sep + 1;
- }
-
- // ~/.chocolate-doom/savegames/
-
- savegamedir = Z_Malloc(strlen(configdir) + 30, PU_STATIC, 0);
- sprintf(savegamedir, "%ssavegames%c", configdir,
- DIR_SEPARATOR);
-
- M_MakeDirectory(savegamedir);
-
- // eg. ~/.chocolate-doom/savegames/doom2.wad/
-
- sprintf(savegamedir + strlen(savegamedir), "%s%c",
- basefile, DIR_SEPARATOR);
-
- M_MakeDirectory(savegamedir);
-}
-
// Check if the IWAD file is the Chex Quest IWAD.
// Returns true if this is chex.wad.
@@ -1121,6 +1087,27 @@ static void LoadHacxDeh(void)
}
}
+// Figure out what IWAD name to use for savegames.
+
+static char *SaveGameIWADName(void)
+{
+ // Chex quest hack
+
+ if (gameversion == exe_chex)
+ {
+ return "chex.wad";
+ }
+
+ // Hacx hack
+
+ if (gameversion == exe_hacx)
+ {
+ return "hacx.wad";
+ }
+
+ return D_SaveGameIWADName(gamemission);
+}
+
//
// D_DoomMain
//
@@ -1439,7 +1426,7 @@ void D_DoomMain (void)
LoadChexDeh();
LoadHacxDeh();
D_SetGameDescription();
- SetSaveGameDir(iwadfile);
+ savegamedir = M_GetSaveGameDir(SaveGameIWADName());
// Check for -file in shareware
if (modifiedgame)
diff --git a/src/m_config.c b/src/m_config.c
index a0f97dc2..52718018 100644
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -1577,3 +1577,40 @@ void M_SetConfigDir(char *dir)
M_MakeDirectory(configdir);
}
+//
+// Calculate the path to the directory to use to store save games.
+// Creates the directory as necessary.
+//
+
+char *M_GetSaveGameDir(char *iwadname)
+{
+ char *savegamedir;
+
+ // If not "doing" a configuration directory (Windows), don't "do"
+ // a savegame directory, either.
+
+ if (!strcmp(configdir, ""))
+ {
+ savegamedir = strdup("");
+ }
+ else
+ {
+ // ~/.chocolate-doom/savegames/
+
+ savegamedir = malloc(strlen(configdir) + 30);
+ sprintf(savegamedir, "%ssavegames%c", configdir,
+ DIR_SEPARATOR);
+
+ M_MakeDirectory(savegamedir);
+
+ // eg. ~/.chocolate-doom/savegames/doom2.wad/
+
+ sprintf(savegamedir + strlen(savegamedir), "%s%c",
+ iwadname, DIR_SEPARATOR);
+
+ M_MakeDirectory(savegamedir);
+ }
+
+ return savegamedir;
+}
+
diff --git a/src/m_config.h b/src/m_config.h
index ff772bea..999b50ae 100644
--- a/src/m_config.h
+++ b/src/m_config.h
@@ -34,6 +34,7 @@ void M_SaveDefaultsAlternate(char *main, char *extra);
void M_SetConfigDir(char *dir);
void M_BindVariable(char *name, void *variable);
void M_SetConfigFilenames(char *main_config, char *extra_config);
+char *M_GetSaveGameDir(char *iwadname);
extern char *configdir;