diff options
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/d_iwad.c (renamed from src/doom/d_iwad.c) | 310 | ||||
-rw-r--r-- | src/d_iwad.h (renamed from src/doom/d_iwad.h) | 15 | ||||
-rw-r--r-- | src/d_mode.h | 2 | ||||
-rw-r--r-- | src/doom/Makefile.am | 1 | ||||
-rw-r--r-- | src/doom/d_main.c | 238 | ||||
-rw-r--r-- | src/heretic/d_main.c | 149 |
7 files changed, 310 insertions, 406 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c931d27f..a7746831 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,6 +32,7 @@ d_event.c d_event.h \ doomkeys.h \ doomfeatures.h \ doomtype.h \ +d_iwad.c d_iwad.h \ d_mode.c d_mode.h \ d_ticcmd.h \ i_cdmus.c i_cdmus.h \ diff --git a/src/doom/d_iwad.c b/src/d_iwad.c index dcf2651a..6f7bff70 100644 --- a/src/doom/d_iwad.c +++ b/src/d_iwad.c @@ -29,10 +29,9 @@ #include <ctype.h> #include <string.h> -#include "deh_main.h" +#include "deh_str.h" #include "doomkeys.h" -#include "doomdef.h" -#include "doomstat.h" +#include "d_iwad.h" #include "i_system.h" #include "m_argv.h" #include "m_config.h" @@ -316,37 +315,15 @@ static void CheckDOSDefaults(void) #endif -static struct -{ - char *name; - GameMission_t mission; -} iwads[] = { - {"doom2.wad", doom2}, - {"plutonia.wad", pack_plut}, - {"tnt.wad", pack_tnt}, - {"doom.wad", doom}, - {"doom1.wad", doom}, - {"chex.wad", doom}, -}; - -// Hack for chex quest mode - -static void CheckChex(char *iwad_name) -{ - if (!strcmp(iwad_name, "chex.wad")) - { - gameversion = exe_chex; - } -} - // Search a directory to try to find an IWAD // Returns the location of the IWAD if found, otherwise NULL. -static char *SearchDirectoryForIWAD(char *dir) +static char *SearchDirectoryForIWAD(char *dir, iwad_t *iwads, + GameMission_t *mission) { size_t i; - for (i=0; i<arrlen(iwads); ++i) + for (i=0; iwads[i].name != NULL; ++i) { char *filename; char *iwadname; @@ -366,8 +343,7 @@ static char *SearchDirectoryForIWAD(char *dir) if (M_FileExists(filename)) { - CheckChex(iwads[i].name); - gamemission = iwads[i].mission; + *mission = iwads[i].mission; return filename; } @@ -381,13 +357,14 @@ static char *SearchDirectoryForIWAD(char *dir) // When given an IWAD with the '-iwad' parameter, // attempt to identify it by its name. -static void IdentifyIWADByName(char *name) +static GameMission_t IdentifyIWADByName(char *name, iwad_t *iwads) { size_t i; + GameMission_t mission; - gamemission = none; + mission = none; - for (i=0; i<arrlen(iwads); ++i) + for (i=0; iwads[i].name != NULL; ++i) { char *iwadname; @@ -401,11 +378,12 @@ static void IdentifyIWADByName(char *name) if (!strcasecmp(name + strlen(name) - strlen(iwadname), iwadname)) { - CheckChex(iwads[i].name); - gamemission = iwads[i].mission; + mission = iwads[i].mission; break; } } + + return mission; } // @@ -584,7 +562,7 @@ char *D_TryFindWADByName(char *filename) // should be executed (notably loading PWADs). // -char *D_FindIWAD(void) +char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission) { char *result; char *iwadfile; @@ -614,7 +592,7 @@ char *D_FindIWAD(void) I_Error("IWAD file '%s' not found!", iwadfile); } - IdentifyIWADByName(result); + *mission = IdentifyIWADByName(result, iwads); } else { @@ -626,272 +604,18 @@ char *D_FindIWAD(void) for (i=0; result == NULL && i<num_iwad_dirs; ++i) { - result = SearchDirectoryForIWAD(iwad_dirs[i]); + result = SearchDirectoryForIWAD(iwad_dirs[i], iwads, mission); } } return result; } -// -// Get the IWAD name used for savegames. -// - -static char *SaveGameIWADName(void) -{ - size_t i; - - // Chex quest hack - - if (gameversion == exe_chex) - { - return "chex.wad"; - } - - // Find what subdirectory to use for savegames - // - // They should be stored in something like - // ~/.chocolate-doom/savegames/doom.wad/ - // - // The directory depends on the IWAD, so that savegames for - // different IWADs are kept separate. - // - // 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; - } - } - - return NULL; -} -// -// SetSaveGameDir -// -// Chooses the directory used to store saved games. -// - -void D_SetSaveGameDir(void) -{ - char *iwad_name; - - if (!strcmp(configdir, "")) - { - // Use the current directory, just like configdir. - - savegamedir = strdup(""); - } - else - { - // Directory for savegames - - iwad_name = SaveGameIWADName(); - - if (iwad_name == NULL) - { - iwad_name = "unknown.wad"; - } - - savegamedir = Z_Malloc(strlen(configdir) + 30, PU_STATIC, 0); - sprintf(savegamedir, "%ssavegames%c%s%c", configdir, - DIR_SEPARATOR, iwad_name, DIR_SEPARATOR); - - M_MakeDirectory(savegamedir); - } -} - -// Strings for dehacked replacements of the startup banner -// -// These are from the original source: some of them are perhaps -// not used in any dehacked patches - -static char *banners[] = -{ - // doom1.wad - " " - "DOOM Shareware Startup v%i.%i" - " ", - // doom.wad - " " - "DOOM Registered Startup v%i.%i" - " ", - // Registered DOOM uses this - " " - "DOOM System Startup v%i.%i" - " ", - // doom.wad (Ultimate DOOM) - " " - "The Ultimate DOOM Startup v%i.%i" - " ", - // doom2.wad - " " - "DOOM 2: Hell on Earth v%i.%i" - " ", - // tnt.wad - " " - "DOOM 2: TNT - Evilution v%i.%i" - " ", - // plutonia.wad - " " - "DOOM 2: Plutonia Experiment v%i.%i" - " ", -}; - -// -// Get game name: if the startup banner has been replaced, use that. -// Otherwise, use the name given -// - -static char *GetGameName(char *gamename) -{ - size_t i; - char *deh_sub; - - for (i=0; i<arrlen(banners); ++i) - { - // Has the banner been replaced? - - deh_sub = DEH_String(banners[i]); - - if (deh_sub != banners[i]) - { - // Has been replaced - // We need to expand via printf to include the Doom version - // number - // We also need to cut off spaces to get the basic name - - gamename = Z_Malloc(strlen(deh_sub) + 10, PU_STATIC, 0); - sprintf(gamename, deh_sub, DOOM_VERSION / 100, DOOM_VERSION % 100); - - while (gamename[0] != '\0' && isspace(gamename[0])) - strcpy(gamename, gamename+1); - - while (gamename[0] != '\0' && isspace(gamename[strlen(gamename)-1])) - gamename[strlen(gamename) - 1] = '\0'; - - return gamename; - } - } - - return gamename; -} - - -// -// Find out what version of Doom is playing. -// - -void D_IdentifyVersion(void) -{ - // gamemission is set up by the D_FindIWAD function. But if - // we specify '-iwad', we have to identify using - // IdentifyIWADByName. However, if the iwad does not match - // any known IWAD name, we may have a dilemma. Try to - // identify by its contents. - - if (gamemission == none) - { - unsigned int i; - - for (i=0; i<numlumps; ++i) - { - if (!strncasecmp(lumpinfo[i].name, "MAP01", 8)) - { - gamemission = doom2; - break; - } - else if (!strncasecmp(lumpinfo[i].name, "E1M1", 8)) - { - gamemission = doom; - break; - } - } - - if (gamemission == none) - { - // Still no idea. I don't think this is going to work. - - I_Error("Unknown or invalid IWAD file."); - } - } - - // Make sure gamemode is set up correctly - - if (gamemission == doom) - { - // Doom 1. But which version? - - if (W_CheckNumForName("E4M1") > 0) - { - // Ultimate Doom - - gamemode = retail; - } - else if (W_CheckNumForName("E3M1") > 0) - { - gamemode = registered; - } - else - { - gamemode = shareware; - } - } - else - { - // Doom 2 of some kind. - - gamemode = commercial; - } -} - -// Set the gamedescription string - -void D_SetGameDescription(void) -{ - gamedescription = "Unknown"; - - if (gamemission == doom) - { - // Doom 1. But which version? - - if (gamemode == retail) - { - // Ultimate Doom - - gamedescription = GetGameName("The Ultimate DOOM"); - } - else if (gamemode == registered) - { - gamedescription = GetGameName("DOOM Registered"); - } - else if (gamemode == shareware) - { - gamedescription = GetGameName("DOOM Shareware"); - } - } - else - { - // Doom 2 of some kind. But which mission? - - if (gamemission == doom2) - gamedescription = GetGameName("DOOM 2: Hell on Earth"); - else if (gamemission == pack_plut) - gamedescription = GetGameName("DOOM 2: Plutonia Experiment"); - else if (gamemission == pack_tnt) - gamedescription = GetGameName("DOOM 2: TNT - Evilution"); - } -} - // Clever hack: Setup can invoke Doom to determine which IWADs are installed. // Doom searches install paths and exits with the return code being a // bitmask of the installed IWAD files. -void D_FindInstalledIWADs(void) +void D_FindInstalledIWADs(iwad_t *iwads) { unsigned int i; int result; diff --git a/src/doom/d_iwad.h b/src/d_iwad.h index 281d3467..456f52ac 100644 --- a/src/doom/d_iwad.h +++ b/src/d_iwad.h @@ -27,13 +27,18 @@ #ifndef __D_IWAD__ #define __D_IWAD__ +#include "d_mode.h" + +typedef struct +{ + char *name; + GameMission_t mission; +} iwad_t; + char *D_FindWADByName(char *filename); char *D_TryFindWADByName(char *filename); -char *D_FindIWAD(void); -void D_SetSaveGameDir(void); -void D_IdentifyVersion(void); -void D_SetGameDescription(void); -void D_FindInstalledIWADs(void); +char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission); +void D_FindInstalledIWADs(iwad_t *iwads); #endif diff --git a/src/d_mode.h b/src/d_mode.h index b3295ffe..b7214737 100644 --- a/src/d_mode.h +++ b/src/d_mode.h @@ -28,6 +28,8 @@ #ifndef __D_MODE__ #define __D_MODE__ +#include "doomtype.h" + // The "mission" controls what game we are playing. typedef enum diff --git a/src/doom/Makefile.am b/src/doom/Makefile.am index 5982721f..7b7073b6 100644 --- a/src/doom/Makefile.am +++ b/src/doom/Makefile.am @@ -6,7 +6,6 @@ SOURCE_FILES= \ am_map.c am_map.h \ d_englsh.h \ d_items.c d_items.h \ -d_iwad.c d_iwad.h \ d_main.c d_main.h \ d_net.c d_net.h \ doomdata.h \ diff --git a/src/doom/d_main.c b/src/doom/d_main.c index 1a778730..419e871c 100644 --- a/src/doom/d_main.c +++ b/src/doom/d_main.c @@ -586,8 +586,234 @@ void D_StartTitle (void) D_AdvanceDemo (); } +static iwad_t iwads[] = +{ + {"doom2.wad", doom2}, + {"plutonia.wad", pack_plut}, + {"tnt.wad", pack_tnt}, + {"doom.wad", doom}, + {"doom1.wad", doom}, + {"chex.wad", doom}, + {NULL, none}, +}; + +// Strings for dehacked replacements of the startup banner +// +// These are from the original source: some of them are perhaps +// not used in any dehacked patches + +static char *banners[] = +{ + // doom1.wad + " " + "DOOM Shareware Startup v%i.%i" + " ", + // doom.wad + " " + "DOOM Registered Startup v%i.%i" + " ", + // Registered DOOM uses this + " " + "DOOM System Startup v%i.%i" + " ", + // doom.wad (Ultimate DOOM) + " " + "The Ultimate DOOM Startup v%i.%i" + " ", + // doom2.wad + " " + "DOOM 2: Hell on Earth v%i.%i" + " ", + // tnt.wad + " " + "DOOM 2: TNT - Evilution v%i.%i" + " ", + // plutonia.wad + " " + "DOOM 2: Plutonia Experiment v%i.%i" + " ", +}; + +// +// Get game name: if the startup banner has been replaced, use that. +// Otherwise, use the name given +// + +static char *GetGameName(char *gamename) +{ + size_t i; + char *deh_sub; + + for (i=0; i<arrlen(banners); ++i) + { + // Has the banner been replaced? + + deh_sub = DEH_String(banners[i]); + + if (deh_sub != banners[i]) + { + // Has been replaced + // We need to expand via printf to include the Doom version + // number + // We also need to cut off spaces to get the basic name + + gamename = Z_Malloc(strlen(deh_sub) + 10, PU_STATIC, 0); + sprintf(gamename, deh_sub, DOOM_VERSION / 100, DOOM_VERSION % 100); + + while (gamename[0] != '\0' && isspace(gamename[0])) + strcpy(gamename, gamename+1); + + while (gamename[0] != '\0' && isspace(gamename[strlen(gamename)-1])) + gamename[strlen(gamename) - 1] = '\0'; + + return gamename; + } + } + + return gamename; +} + +// +// Find out what version of Doom is playing. +// + +void D_IdentifyVersion(void) +{ + // gamemission is set up by the D_FindIWAD function. But if + // we specify '-iwad', we have to identify using + // IdentifyIWADByName. However, if the iwad does not match + // any known IWAD name, we may have a dilemma. Try to + // identify by its contents. + + if (gamemission == none) + { + unsigned int i; + + for (i=0; i<numlumps; ++i) + { + if (!strncasecmp(lumpinfo[i].name, "MAP01", 8)) + { + gamemission = doom2; + break; + } + else if (!strncasecmp(lumpinfo[i].name, "E1M1", 8)) + { + gamemission = doom; + break; + } + } + + if (gamemission == none) + { + // Still no idea. I don't think this is going to work. + + I_Error("Unknown or invalid IWAD file."); + } + } + + // Make sure gamemode is set up correctly + + if (gamemission == doom) + { + // Doom 1. But which version? + if (W_CheckNumForName("E4M1") > 0) + { + // Ultimate Doom + + gamemode = retail; + } + else if (W_CheckNumForName("E3M1") > 0) + { + gamemode = registered; + } + else + { + gamemode = shareware; + } + } + else + { + // Doom 2 of some kind. + + gamemode = commercial; + } +} + +// Set the gamedescription string + +void D_SetGameDescription(void) +{ + gamedescription = "Unknown"; + + if (gamemission == doom) + { + // Doom 1. But which version? + + if (gamemode == retail) + { + // Ultimate Doom + + gamedescription = GetGameName("The Ultimate DOOM"); + } + else if (gamemode == registered) + { + gamedescription = GetGameName("DOOM Registered"); + } + else if (gamemode == shareware) + { + gamedescription = GetGameName("DOOM Shareware"); + } + } + else + { + // Doom 2 of some kind. But which mission? + + if (gamemission == doom2) + gamedescription = GetGameName("DOOM 2: Hell on Earth"); + else if (gamemission == pack_plut) + gamedescription = GetGameName("DOOM 2: Plutonia Experiment"); + else if (gamemission == pack_tnt) + gamedescription = GetGameName("DOOM 2: TNT - Evilution"); + } +} + +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; + } + + // eg. ~/.chocolate-doom/savegames/doom2.wad/ + + savegamedir = malloc(strlen(configdir) + strlen(basefile) + 10); + sprintf(savegamedir, "%ssavegames%c%s%c", + configdir, DIR_SEPARATOR, basefile, DIR_SEPARATOR); +} + +// Check if the IWAD file is the Chex Quest IWAD. +// Returns true if this is chex.wad. + +static boolean CheckChex(char *iwadname) +{ + char *chex_iwadname = "chex.wad"; + return (strlen(iwadname) > strlen(chex_iwadname) + && !strcasecmp(iwadname + strlen(iwadname) - strlen(chex_iwadname), + chex_iwadname)); +} // print title for every printed line char title[128]; @@ -711,9 +937,11 @@ static void InitGameVersion(void) { // Determine automatically - if (gameversion == exe_chex) + if (CheckChex(iwadfile)) { - // Already determined + // chex.exe - identified by iwad filename + + gameversion = exe_chex; } else if (gamemode == shareware || gamemode == registered) { @@ -833,7 +1061,7 @@ void D_DoomMain (void) if (M_CheckParm("-findiwads") > 0) { - D_FindInstalledIWADs(); + D_FindInstalledIWADs(iwads); } // print banner @@ -890,7 +1118,7 @@ void D_DoomMain (void) DEH_Init(); #endif - iwadfile = D_FindIWAD(); + iwadfile = D_FindIWAD(iwads, &gamemission); // None found? @@ -1259,7 +1487,7 @@ void D_DoomMain (void) InitGameVersion(); LoadChexDeh(); D_SetGameDescription(); - D_SetSaveGameDir(); + SetSaveGameDir(iwadfile); // Check for -file in shareware if (modifiedgame) diff --git a/src/heretic/d_main.c b/src/heretic/d_main.c index 19944c21..669d7b3d 100644 --- a/src/heretic/d_main.c +++ b/src/heretic/d_main.c @@ -29,6 +29,7 @@ #include "config.h" #include "ct_chat.h" #include "doomdef.h" +#include "d_iwad.h" #include "i_system.h" #include "i_video.h" #include "m_argv.h" @@ -434,8 +435,6 @@ void D_CheckRecordFrom(void) =============== */ -#define MAXWADFILES 20 - // MAPDIR should be defined as the directory that holds development maps // for the -wart # # command @@ -443,14 +442,15 @@ void D_CheckRecordFrom(void) #define SHAREWAREWADNAME "heretic1.wad" -char *wadfiles[MAXWADFILES] = { - "heretic.wad", +static iwad_t iwads[] = { + { "heretic.wad", heretic }, + { "heretic1.wad", heretic }, + { NULL, none }, }; -char *basedefault = "heretic.cfg"; +char *iwadfile; -char exrnwads[80]; -char exrnwads2[80]; +char *basedefault = "heretic.cfg"; void wadprintf(void) { @@ -468,41 +468,15 @@ void wadprintf(void) #endif } -void D_AddFile(char *file) +boolean D_AddFile(char *file) { - int numwadfiles; - char *new; -// char text[256]; - - for (numwadfiles = 0; wadfiles[numwadfiles]; numwadfiles++); - new = malloc(strlen(file) + 1); - strcpy(new, file); - if (strlen(exrnwads) + strlen(file) < 78) - { - if (strlen(exrnwads)) - { - strcat(exrnwads, ", "); - } - else - { - strcpy(exrnwads, "External Wadfiles: "); - } - strcat(exrnwads, file); - } - else if (strlen(exrnwads2) + strlen(file) < 79) - { - if (strlen(exrnwads2)) - { - strcat(exrnwads2, ", "); - } - else - { - strcpy(exrnwads2, " "); - strcat(exrnwads, ","); - } - strcat(exrnwads2, file); - } - wadfiles[numwadfiles] = new; + wad_file_t *handle; + + printf(" adding %s\n", file); + + handle = W_AddFile(file); + + return handle != NULL; } //========================================================== @@ -789,13 +763,8 @@ static void D_Endoom(void) void D_DoomMain(void) { - int i; int p; - int e; - int m; char file[256]; - FILE *fp; - boolean devMap; I_PrintBanner(PACKAGE_STRING); @@ -813,17 +782,6 @@ void D_DoomMain(void) startmap = 1; autostart = false; - // wadfiles[0] is a char * to the main wad - fp = fopen(wadfiles[0], "rb"); - if (fp) - { - fclose(fp); - } - else - { // Change to look for shareware wad - wadfiles[0] = SHAREWAREWADNAME; - } - // Check for -CDROM cdrom = false; #ifdef __WATCOMC__ @@ -834,48 +792,6 @@ void D_DoomMain(void) } #endif - // -FILE [filename] [filename] ... - // Add files to the wad list. - p = M_CheckParm("-file"); - if (p) - { // the parms after p are wadfile/lump names, until end of parms - // or another - preceded parm - while (++p != myargc && myargv[p][0] != '-') - { - D_AddFile(myargv[p]); - } - } - - // -DEVMAP <episode> <map> - // Adds a map wad from the development directory to the wad list, - // and sets the start episode and the start map. - devMap = false; - p = M_CheckParm("-devmap"); - if (p && p < myargc - 2) - { - e = myargv[p + 1][0]; - m = myargv[p + 2][0]; - sprintf(file, MAPDIR "E%cM%c.wad", e, m); - D_AddFile(file); - printf("DEVMAP: Episode %c, Map %c.\n", e, m); - startepisode = e - '0'; - startmap = m - '0'; - autostart = true; - devMap = true; - } - - p = M_CheckParm("-playdemo"); - if (!p) - { - p = M_CheckParm("-timedemo"); - } - if (p && p < myargc - 1) - { - sprintf(file, "%s.lmp", myargv[p + 1]); - D_AddFile(file); - printf("Playing demo %s.lmp.\n", myargv[p + 1]); - } - // // get skill / episode / map from parms // @@ -928,9 +844,38 @@ void D_DoomMain(void) printf("W_Init: Init WADfiles.\n"); - for (i=0; wadfiles[i] != NULL; ++i) + iwadfile = D_FindIWAD(iwads, &gamemission); + + if (iwadfile == NULL) { - W_AddFile(wadfiles[i]); + I_Error("Game mode indeterminate. No IWAD was found. Try specifying\n" + "one with the '-iwad' command line parameter."); + } + + D_AddFile(iwadfile); + + // -FILE [filename] [filename] ... + // Add files to the wad list. + p = M_CheckParm("-file"); + if (p) + { // the parms after p are wadfile/lump names, until end of parms + // or another - preceded parm + while (++p != myargc && myargv[p][0] != '-') + { + D_AddFile(myargv[p]); + } + } + + p = M_CheckParm("-playdemo"); + if (!p) + { + p = M_CheckParm("-timedemo"); + } + if (p && p < myargc - 1) + { + sprintf(file, "%s.lmp", myargv[p + 1]); + D_AddFile(file); + printf("Playing demo %s.lmp.\n", myargv[p + 1]); } if (W_CheckNumForName("E2M1") == -1) @@ -1064,7 +1009,7 @@ void D_DoomMain(void) } // Check valid episode and map - if ((autostart || netgame) && (devMap == false)) + if (autostart || netgame) { if (M_ValidEpisodeMap(startepisode, startmap) == false) { |