diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 393ae6ace..532eb14ab 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,15 @@ -March 19, 2009 +March 22, 2009 (Changes by Graf Zahl) +- removed gamemode variable. All it was used for were some checks that + really should depend on GI_MAPxx. +- Externalized all internal gameinfo definitions. +- added include to MAPINFO parser. +- split IWAD detection code off from d_main.cpp into its own file. +- disabled gamemission based switch filtering because it is not useful. +- added GAMEINFO submission by Blzut3 with significant modifications. There + is no GAMEINFO lump. Instead all information is placed in MAPINFO, except + the data that is needed to decide which WADs to autoload. + +March 19, 2009 - Added the current value of the string buffer to the state saved when making a function call in ACS. Now you can print inside functions and also return values from them for the caller to plug directly into diff --git a/src/d_main.cpp b/src/d_main.cpp index 28cf6435b..ce821adbc 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -117,6 +117,7 @@ extern void R_ExecuteSetViewSize (); extern void G_NewInit (); extern void SetupPlayerClasses (); extern bool CheckCheatmode (); +extern const IWADInfo *D_FindIWAD(const char *basewad); // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -124,7 +125,6 @@ void D_CheckNetGame (); void D_ProcessEvents (); void G_BuildTiccmd (ticcmd_t* cmd); void D_DoAdvanceDemo (); -void D_AddFile (const char *file); void D_AddWildFile (const char *pattern); // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- @@ -145,22 +145,6 @@ EXTERN_CVAR (Int, screenblocks) EXTERN_CVAR (Bool, sv_cheats) EXTERN_CVAR (Bool, sv_unlimited_pickup) -extern gameinfo_t SharewareGameInfo; -extern gameinfo_t RegisteredGameInfo; -extern gameinfo_t RetailGameInfo; -extern gameinfo_t CommercialGameInfo; -extern gameinfo_t HereticGameInfo; -extern gameinfo_t HereticSWGameInfo; -extern gameinfo_t HexenGameInfo; -extern gameinfo_t HexenDKGameInfo; -extern gameinfo_t StrifeGameInfo; -extern gameinfo_t StrifeTeaserGameInfo; -extern gameinfo_t StrifeTeaser2GameInfo; -extern gameinfo_t ChexGameInfo; -extern gameinfo_t Chex3GameInfo; -extern gameinfo_t PlutoniaGameInfo; -extern gameinfo_t TNTGameInfo; - extern int testingmode; extern bool setmodeneeded; extern bool netdemo; @@ -194,8 +178,6 @@ CUSTOM_CVAR (Int, fraglimit, 0, CVAR_SERVERINFO) } CVAR (Float, timelimit, 0.f, CVAR_SERVERINFO); -CVAR (Bool, queryiwad, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG); -CVAR (String, defaultiwad, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG); CVAR (Int, wipetype, 1, CVAR_ARCHIVE); CVAR (Int, snd_drawoutput, 0, 0); @@ -219,84 +201,12 @@ FTexture *Advisory; cycle_t FrameCycles; -// If autoname is NULL, that's either because that game doesn't allow -// loading of external wads or because it's already caught by the -// general game-specific wads section. -const IWADInfo IWADInfos[NUM_IWAD_TYPES] = -{ - // banner text, autoname, fg color, bg color - { "Final Doom: TNT - Evilution", "TNT", MAKERGB(168,0,0), MAKERGB(168,168,168) }, - { "Final Doom: Plutonia Experiment", "Plutonia", MAKERGB(168,0,0), MAKERGB(168,168,168) }, - { "Hexen: Beyond Heretic", NULL, MAKERGB(240,240,240), MAKERGB(107,44,24) }, - { "Hexen: Deathkings of the Dark Citadel", "HexenDK", MAKERGB(240,240,240), MAKERGB(139,68,9) }, - { "Hexen: Demo Version", "HexenDemo",MAKERGB(240,240,240), MAKERGB(107,44,24) }, - { "DOOM 2: Hell on Earth", "Doom2", MAKERGB(168,0,0), MAKERGB(168,168,168) }, - { "Heretic Shareware", NULL, MAKERGB(252,252,0), MAKERGB(168,0,0) }, - { "Heretic: Shadow of the Serpent Riders", NULL, MAKERGB(252,252,0), MAKERGB(168,0,0) }, - { "Heretic", NULL, MAKERGB(252,252,0), MAKERGB(168,0,0) }, - { "DOOM Shareware", NULL, MAKERGB(168,0,0), MAKERGB(168,168,168) }, - { "The Ultimate DOOM", "Doom1", MAKERGB(84,84,84), MAKERGB(168,168,168) }, - { "DOOM Registered", "Doom1", MAKERGB(84,84,84), MAKERGB(168,168,168) }, - { "Strife: Quest for the Sigil", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) }, - { "Strife: Teaser (Old Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) }, - { "Strife: Teaser (New Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) }, - { "Freedoom", "Freedoom", MAKERGB(50,84,67), MAKERGB(198,220,209) }, - { "Freedoom \"Demo\"", "Freedoom1",MAKERGB(50,84,67), MAKERGB(198,220,209) }, - { "FreeDM", "FreeDM", MAKERGB(50,84,67), MAKERGB(198,220,209) }, - { "Chex(R) Quest", "Chex", MAKERGB(255,255,0), MAKERGB(0,192,0) }, - { "Chex(R) Quest 3", "Chex3", MAKERGB(255,255,0), MAKERGB(0,192,0) }, -}; // PRIVATE DATA DEFINITIONS ------------------------------------------------ static wadlist_t **wadtail = &wadfiles; static int demosequence; static int pagetic; -static const char *IWADNames[] = -{ - NULL, - "doom2f.wad", - "doom2.wad", - "plutonia.wad", - "tnt.wad", - "doomu.wad", // Hack from original Linux version. Not necessary, but I threw it in anyway. - "doom.wad", - "doom1.wad", - "heretic.wad", - "heretic1.wad", - "hexen.wad", - "hexdd.wad", - "hexendemo.wad", - "hexdemo.wad", - "strife1.wad", - "strife0.wad", - "freedoom.wad", // Freedoom.wad is distributed as Doom2.wad, but this allows to have both in the same directory. - "freedoom1.wad", - "freedm.wad", - "chex.wad", - "chex3.wad", -#ifdef unix - "DOOM2.WAD", // Also look for all-uppercase names - "PLUTONIA.WAD", - "TNT.WAD", - "DOOM.WAD", - "DOOM1.WAD", - "HERETIC.WAD", - "HERETIC1.WAD", - "HEXEN.WAD", - "HEXDD.WAD", - "HEXENDEMO.WAD", - "HEXDEMO.WAD", - "STRIFE1.WAD", - "STRIFE0.WAD", - "FREEDOOM.WAD", - "FREEDOOM1.WAD", - "FREEDM.WAD", - "CHEX.WAD", - "CHEX3.WAD", -#endif - NULL -}; // CODE -------------------------------------------------------------------- @@ -1215,11 +1125,8 @@ void D_DoAdvanceDemo (void) case 2: pagetic = (int)(gameinfo.pageTime * TICRATE); gamestate = GS_DEMOSCREEN; - if (pagecount == 0) - pagename = gameinfo.creditPage1; - else - pagename = gameinfo.creditPage2; - pagecount ^= 1; + pagename = gameinfo.creditPages[pagecount]; + pagecount = (pagecount+1) % gameinfo.creditPages.Size(); demosequence = 1; break; } @@ -1429,555 +1336,6 @@ static void D_AddDirectory (const char *dir) } } -//========================================================================== -// -// SetIWAD -// -// Sets parameters for the game using the specified IWAD. -//========================================================================== - -static void SetIWAD (const char *iwadpath, EIWADType type) -{ - static const struct - { - GameMode_t Mode; - const gameinfo_t *Info; - GameMission_t Mission; - } Datas[NUM_IWAD_TYPES] = { - { commercial, &TNTGameInfo, pack_tnt }, // Doom2TNT - { commercial, &PlutoniaGameInfo, pack_plut }, // Doom2Plutonia - { commercial, &HexenGameInfo, doom2 }, // Hexen - { commercial, &HexenDKGameInfo, doom2 }, // HexenDK - { commercial, &HexenGameInfo, doom2 }, // Hexen Demo - { commercial, &CommercialGameInfo, doom2 }, // Doom2 - { shareware, &HereticSWGameInfo, doom }, // HereticShareware - { retail, &HereticGameInfo, doom }, // HereticExtended - { retail, &HereticGameInfo, doom }, // Heretic - { shareware, &SharewareGameInfo, doom }, // DoomShareware - { retail, &RetailGameInfo, doom }, // UltimateDoom - { registered, &RegisteredGameInfo, doom }, // DoomRegistered - { commercial, &StrifeGameInfo, doom2 }, // Strife - { commercial, &StrifeTeaserGameInfo, doom2 }, // StrifeTeaser - { commercial, &StrifeTeaser2GameInfo, doom2 }, // StrifeTeaser2 - { commercial, &CommercialGameInfo, doom2 }, // FreeDoom - { shareware, &SharewareGameInfo, doom }, // FreeDoom1 - { commercial, &CommercialGameInfo, doom2 }, // FreeDM - { registered, &ChexGameInfo, doom }, // Chex Quest - { registered, &Chex3GameInfo, doom }, // Chex Quest 3 - }; - - D_AddFile (iwadpath); - - if ((unsigned)type < NUM_IWAD_TYPES) - { - gamemode = Datas[type].Mode; - gameinfo = *Datas[type].Info; - gamemission = Datas[type].Mission; - if (type == IWAD_HereticExtended) - { - gameinfo.flags |= GI_MENUHACK_EXTENDED; - } - } - else - { - gamemode = undetermined; - } -} - -//========================================================================== -// -// ScanIWAD -// -// Scan the contents of an IWAD to determine which one it is -//========================================================================== - -static EIWADType ScanIWAD (const char *iwad) -{ - static const char checklumps[][8] = - { - "E1M1", - "E4M2", - "MAP01", - "MAP40", - "MAP60", - "TITLE", - "REDTNT2", - "CAMO1", - { 'E','X','T','E','N','D','E','D'}, - "ENDSTRF", - "MAP33", - "INVCURS", - { 'F','R','E','E','D','O','O','M' }, - "W94_1", - { 'P','O','S','S','H','0','M','0' }, - "CYCLA1", - "FLMBA1", - "MAPINFO", - "E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", - "E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9", - "DPHOOF","BFGGA0","HEADA1","CYBRA1", - { 'S','P','I','D','A','1','D','1' }, - - }; -#define NUM_CHECKLUMPS (sizeof(checklumps)/8) - enum - { - Check_e1m1, - Check_e4m1, - Check_map01, - Check_map40, - Check_map60, - Check_title, - Check_redtnt2, - Check_cam01, - Check_Extended, - Check_endstrf, - Check_map33, - Check_invcurs, - Check_FreeDoom, - Check_W94_1, - Check_POSSH0M0, - Check_Cycla1, - Check_Flmba1, - Check_Mapinfo, - Check_e2m1 - }; - int lumpsfound[NUM_CHECKLUMPS]; - size_t i; - wadinfo_t header; - FILE *f; - - memset (lumpsfound, 0, sizeof(lumpsfound)); - if ( (f = fopen (iwad, "rb")) ) - { - fread (&header, sizeof(header), 1, f); - if (header.Magic == IWAD_ID || header.Magic == PWAD_ID) - { - header.NumLumps = LittleLong(header.NumLumps); - if (0 == fseek (f, LittleLong(header.InfoTableOfs), SEEK_SET)) - { - for (i = 0; i < (size_t)header.NumLumps; i++) - { - wadlump_t lump; - size_t j; - - if (0 == fread (&lump, sizeof(lump), 1, f)) - break; - for (j = 0; j < NUM_CHECKLUMPS; j++) - if (strnicmp (lump.Name, checklumps[j], 8) == 0) - lumpsfound[j]++; - } - } - } - fclose (f); - } - - if (lumpsfound[Check_title] && lumpsfound[Check_map60]) - { - return IWAD_HexenDK; - } - else if (lumpsfound[Check_map33] && lumpsfound[Check_endstrf]) - { - if (lumpsfound[Check_map01]) - { - return IWAD_Strife; - } - else if (lumpsfound[Check_invcurs]) - { - return IWAD_StrifeTeaser2; - } - else - { - return IWAD_StrifeTeaser; - } - } - else if (lumpsfound[Check_map01]) - { - if (lumpsfound[Check_FreeDoom]) - { - // Is there a 100% reliable way to tell FreeDoom and FreeDM - // apart based solely on the lump names? - if (strstr(iwad, "freedm.wad") || strstr(iwad, "FREEDM.WAD")) - { - return IWAD_FreeDM; - } - else - { - return IWAD_FreeDoom; - } - } - else if (lumpsfound[Check_redtnt2]) - { - return IWAD_Doom2TNT; - } - else if (lumpsfound[Check_cam01]) - { - return IWAD_Doom2Plutonia; - } - else - { - if (lumpsfound[Check_title]) - { - if (lumpsfound[Check_map40]) - { - return IWAD_Hexen; - } - else - { - return IWAD_HexenDemo; - } - } - else - { - return IWAD_Doom2; - } - } - } - else if (lumpsfound[Check_e1m1]) - { - if (lumpsfound[Check_title]) - { - if (!lumpsfound[Check_e2m1]) - { - return IWAD_HereticShareware; - } - else - { - if (lumpsfound[Check_Extended]) - { - return IWAD_HereticExtended; - } - else - { - return IWAD_Heretic; - } - } - } - else if (lumpsfound[Check_Cycla1] && lumpsfound[Check_Flmba1]) - { - if (!lumpsfound[Check_Mapinfo]) - { - // The original release won't work without its hacked custom EXE. - //I_FatalError("Found an incompatible version of Chex Quest 3"); - return NUM_IWAD_TYPES; // Can't use it. - } - return IWAD_ChexQuest3; - } - else - { - if (lumpsfound[Check_FreeDoom]) - { - return IWAD_FreeDoom1; - } - for (i = Check_e2m1; i < NUM_CHECKLUMPS; i++) - { - if (!lumpsfound[i]) - { - return IWAD_DoomShareware; - } - } - if (i == NUM_CHECKLUMPS) - { - if (lumpsfound[Check_e4m1]) - { - if (lumpsfound[Check_W94_1] && lumpsfound[Check_POSSH0M0]) - { - return IWAD_ChexQuest; - } - else - { - return IWAD_UltimateDoom; - } - } - else - { - return IWAD_DoomRegistered; - } - } - } - } - return NUM_IWAD_TYPES; // Don't know -} - -//========================================================================== -// -// CheckIWAD -// -// Tries to find an IWAD from a set of known IWAD names, and checks the -// contents of each one found to determine which game it belongs to. -// Returns the number of new wads found in this pass (does not count wads -// found from a previous call). -// -//========================================================================== - -static int CheckIWAD (const char *doomwaddir, WadStuff *wads) -{ - const char *slash; - int i; - int numfound; - - numfound = 0; - - slash = (doomwaddir[0] && doomwaddir[strlen (doomwaddir)-1] != '/') ? "/" : ""; - - // Search for a pre-defined IWAD - for (i = IWADNames[0] ? 0 : 1; IWADNames[i]; i++) - { - if (wads[i].Path.IsEmpty()) - { - FString iwad; - - iwad.Format ("%s%s%s", doomwaddir, slash, IWADNames[i]); - FixPathSeperator (iwad.LockBuffer()); - iwad.UnlockBuffer(); - if (FileExists (iwad)) - { - wads[i].Type = ScanIWAD (iwad); - if (wads[i].Type != NUM_IWAD_TYPES) - { - wads[i].Path = iwad; - numfound++; - } - } - } - } - - return numfound; -} - -//========================================================================== -// -// CheckIWADinEnvDir -// -// Checks for an IWAD in a path that contains one or more environment -// variables. -// -//========================================================================== - -static int CheckIWADinEnvDir (const char *str, WadStuff *wads) -{ - FString expanded = ExpandEnvVars (str); - - if (!expanded.IsEmpty()) - { - char *dir = expanded.LockBuffer (); - FixPathSeperator (dir); - expanded.UnlockBuffer (); - if (expanded[expanded.Len() - 1] != '/') - { - expanded += '/'; - } - return CheckIWAD (expanded, wads); - } - return false; -} - -//========================================================================== -// -// IdentifyVersion -// -// Tries to find an IWAD in one of four directories under DOS or Win32: -// 1. Current directory -// 2. Executable directory -// 3. $DOOMWADDIR -// 4. $HOME -// -// Under UNIX OSes, the search path is: -// 1. Current directory -// 2. $DOOMWADDIR -// 3. $HOME/.zdoom -// 4. The share directory defined at compile time (/usr/local/share/zdoom) -// -// The search path can be altered by editing the IWADSearch.Directories -// section of the config file. -// -//========================================================================== - -static EIWADType IdentifyVersion (const char *zdoom_wad) -{ - WadStuff wads[countof(IWADNames)]; - size_t foundwads[NUM_IWAD_TYPES] = { 0 }; - const char *iwadparm = Args->CheckValue ("-iwad"); - size_t numwads; - int pickwad; - size_t i; - bool iwadparmfound = false; - FString custwad; - - if (iwadparm) - { - custwad = iwadparm; - FixPathSeperator (custwad.LockBuffer()); - if (CheckIWAD (custwad, wads)) - { // -iwad parameter was a directory - iwadparm = NULL; - } - else - { - DefaultExtension (custwad, ".wad"); - iwadparm = custwad; - IWADNames[0] = iwadparm; - CheckIWAD ("", wads); - } - } - - if (iwadparm == NULL || wads[0].Path.IsEmpty()) - { - if (GameConfig->SetSection ("IWADSearch.Directories")) - { - const char *key; - const char *value; - - while (GameConfig->NextInSection (key, value)) - { - if (stricmp (key, "Path") == 0) - { - if (strchr (value, '$') != NULL) - { - CheckIWADinEnvDir (value, wads); - } -#ifdef unix - else if (*value == '~' && (*(value + 1) == 0 || *(value + 1) == '/')) - { - FString homepath = GetUserFile (*(value + 1) ? value + 2 : value + 1, true); - CheckIWAD (homepath, wads); - } -#endif - else - { - CheckIWAD (value, wads); - } - } - } - } -#ifdef _WIN32 - FString steam_path = I_GetSteamPath(); - if (steam_path.IsNotEmpty()) - { - static const char *const steam_dirs[] = - { - "doom 2/base", - "final doom/base", - "heretic shadow of the serpent riders/base", - "hexen/base", - "hexen deathkings of the dark citadel/base", - "ultimate doom/base" - }; - steam_path += "/SteamApps/common/"; - for (i = 0; i < countof(steam_dirs); ++i) - { - CheckIWAD (steam_path + steam_dirs[i], wads); - } - } -#endif - } - - if (iwadparm != NULL && !wads[0].Path.IsEmpty()) - { - iwadparmfound = true; - } - - for (i = numwads = 0; i < countof(IWADNames); i++) - { - if (!wads[i].Path.IsEmpty()) - { - if (i != numwads) - { - wads[numwads] = wads[i]; - } - foundwads[wads[numwads].Type] = numwads + 1; - numwads++; - } - } - - if (foundwads[IWAD_HexenDK] && !foundwads[IWAD_Hexen]) - { // Cannot play Hexen DK without Hexen - size_t kill = foundwads[IWAD_HexenDK]; - for (i = kill; i < numwads; ++i) - { - wads[i - 1] = wads[i]; - } - numwads--; - foundwads[IWAD_HexenDK] = 0; - for (i = 0; i < NUM_IWAD_TYPES; ++i) - { - if (foundwads[i] > kill) - { - foundwads[i]--; - } - } - } - - if (numwads == 0) - { - I_FatalError ("Cannot find a game IWAD (doom.wad, doom2.wad, heretic.wad, etc.).\n" - "Did you install ZDoom properly? You can do either of the following:\n" - "\n" - "1. Place one or more of these wads in the same directory as ZDoom.\n" - "2. Edit your zdoom-username.ini and add the directories of your iwads\n" - "to the list beneath [IWADSearch.Directories]"); - } - - pickwad = 0; - - if (!iwadparmfound && numwads > 1) - { - int defiwad = 0; - - // Locate the user's prefered IWAD, if it was found. - if (defaultiwad[0] != '\0') - { - for (i = 0; i < numwads; ++i) - { - FString basename = ExtractFileBase (wads[i].Path); - if (stricmp (basename, defaultiwad) == 0) - { - defiwad = (int)i; - break; - } - } - } - pickwad = I_PickIWad (wads, (int)numwads, queryiwad, defiwad); - if (pickwad >= 0) - { - // The newly selected IWAD becomes the new default - FString basename = ExtractFileBase (wads[pickwad].Path); - defaultiwad = basename; - } - } - - if (pickwad < 0) - exit (0); - - // zdoom.pk3 must always be the first file loaded and the IWAD second. - D_AddFile (zdoom_wad); - - if (wads[pickwad].Type == IWAD_HexenDK) - { // load hexen.wad before loading hexdd.wad - D_AddFile (wads[foundwads[IWAD_Hexen]-1].Path); - } - - SetIWAD (wads[pickwad].Path, wads[pickwad].Type); - - if (wads[pickwad].Type == IWAD_Strife) - { // Try to load voices.wad along with strife1.wad - long lastslash = wads[pickwad].Path.LastIndexOf ('/'); - FString path; - - if (lastslash == -1) - { - path = "";// wads[pickwad].Path; - } - else - { - path = FString (wads[pickwad].Path.GetChars(), lastslash + 1); - } - path += "voices.wad"; - D_AddFile (path); - } - - return wads[pickwad].Type; -} //========================================================================== // @@ -2195,7 +1553,6 @@ void D_DoomMain (void) char *v; const char *wad; DArgs *execFiles; - const IWADInfo *iwad_info; srand(I_MSTime()); @@ -2241,13 +1598,11 @@ void D_DoomMain (void) // Load zdoom.pk3 alone so that we can get access to the internal gameinfos before // the IWAD is known. - wadlist_t *basewad = (wadlist_t*)M_Malloc(sizeof(wadlist_t) + strlen(wad)); - strcpy(basewad->name, wad); - basewad->next = NULL; - Wads.InitMultipleFiles(&basewad); - iwad_info = &IWADInfos[IdentifyVersion(wad)]; - I_SetIWADInfo(iwad_info); + const IWADInfo *iwad_info = D_FindIWAD(wad); + gameinfo.gametype = iwad_info->gametype; + gameinfo.flags = iwad_info->flags; + GameConfig->DoGameSetup (GameNames[gameinfo.gametype]); if (!(gameinfo.flags & GI_SHAREWARE)) @@ -2515,7 +1870,7 @@ void D_DoomMain (void) // [RH] Parse through all loaded mapinfo lumps Printf ("G_ParseMapInfo: Load map definitions.\n"); - G_ParseMapInfo (); + G_ParseMapInfo (iwad_info->MapInfo); // [RH] Parse any SNDINFO lumps Printf ("S_InitData: Load sound definitions.\n"); diff --git a/src/d_main.h b/src/d_main.h index a743d5ab6..6255c4a87 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -26,6 +26,7 @@ #define __D_MAIN__ #include "doomtype.h" +#include "gametype.h" struct event_t; @@ -50,6 +51,7 @@ void D_PageTicker (void); void D_PageDrawer (void); void D_AdvanceDemo (void); void D_StartTitle (void); +void D_AddFile (const char *file); // [RH] Set this to something to draw an icon during the next screen refresh. @@ -78,6 +80,7 @@ enum EIWADType IWAD_FreeDM, IWAD_ChexQuest, IWAD_ChexQuest3, + IWAD_Custom, NUM_IWAD_TYPES }; @@ -96,6 +99,9 @@ struct IWADInfo const char *Autoname; // Name of autoload ini section for this IWAD DWORD FgColor; // Foreground color for title banner DWORD BkColor; // Background color for title banner + EGameType gametype; // which game are we playing? + const char *MapInfo; // Base mapinfo to load + int flags; }; extern const IWADInfo IWADInfos[NUM_IWAD_TYPES]; diff --git a/src/doomdef.h b/src/doomdef.h index 718724cc1..5b368884e 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -44,18 +44,6 @@ typedef enum } GameMode_t; -// Mission packs - might be useful for TC stuff? -typedef enum -{ - doom, // DOOM 1 - doom2, // DOOM 2 - pack_tnt, // TNT mission pack - pack_plut, // Plutonia pack - none - -} GameMission_t; - - // If rangecheck is undefined, most parameter validation debugging code // will not be compiled #ifndef NORANGECHECKING diff --git a/src/doomstat.cpp b/src/doomstat.cpp index 6fe88955e..cd93ac18f 100644 --- a/src/doomstat.cpp +++ b/src/doomstat.cpp @@ -38,10 +38,6 @@ FStringTable GStrings; // Game speed EGameSpeed GameSpeed = SPEED_Normal; -// Game Mode - identify IWAD as shareware, retail etc. -int gamemode = undetermined; -int gamemission = doom; - // Show developer messages if true. CVAR (Bool, developer, false, 0) diff --git a/src/doomstat.h b/src/doomstat.h index 00e775b4b..0b5d6aba9 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -51,9 +51,6 @@ extern bool devparm; // DEBUG: launched with -devparm // ----------------------------------------------------- // Game Mode - identify IWAD as shareware, retail etc. // -extern int gamemode; -extern int gamemission; - // ------------------------------------------- // Selected skill type, map etc. // diff --git a/src/f_finale.cpp b/src/f_finale.cpp index 95aef603d..b452f0cf8 100644 --- a/src/f_finale.cpp +++ b/src/f_finale.cpp @@ -89,7 +89,7 @@ void F_AdvanceSlideshow (); void F_StartFinale (const char *music, int musicorder, int cdtrack, unsigned int cdid, const char *flat, const char *text, INTBOOL textInLump, INTBOOL finalePic, INTBOOL lookupText, bool ending) { - bool loopmusic = ending ? !(gameinfo.flags & GI_NOLOOPFINALEMUSIC) : true; + bool loopmusic = ending ? !gameinfo.noloopfinalemusic : true; gameaction = ga_nothing; gamestate = GS_FINALE; viewactive = false; @@ -229,7 +229,7 @@ void F_Ticker () if (FinaleStage == 0) { if (interrupt || - ((gamemode != commercial || gameinfo.flags & GI_SHAREWARE) + ((!(gameinfo.flags & GI_MAPxx) || gameinfo.flags & GI_SHAREWARE) && FinaleCount > FinaleTextLen*TEXTSPEED+TEXTWAIT)) { if (FinaleCount < FinaleTextLen*TEXTSPEED+10) @@ -308,7 +308,7 @@ void F_Ticker () case 12: // Pic 2, Text 2 GetFinaleText ("win2msg"); FinaleEndCount = FinaleTextLen*TEXTSPEED+TEXTWAIT; - S_ChangeMusic ("orb", 0, !(gameinfo.flags & GI_NOLOOPFINALEMUSIC)); + S_ChangeMusic ("orb", 0, !gameinfo.noloopfinalemusic); break; case 13: // Pic 2 -- Fade out @@ -319,7 +319,7 @@ void F_Ticker () case 14: // Pic 3 -- Fade in FinaleEndCount = 71; FadeDir = -1; - S_ChangeMusic ("chess", 0, !(gameinfo.flags & GI_NOLOOPFINALEMUSIC)); + S_ChangeMusic ("chess", 0, !gameinfo.noloopfinalemusic); break; case 15: // Pic 3, Text 3 @@ -1247,19 +1247,19 @@ void F_Drawer (void) { default: case END_Pic1: - picname = gameinfo.finalePage1; + picname = gameinfo.GetFinalePage(1); screen->DrawTexture (TexMan[picname], 0, 0, DTA_DestWidth, screen->GetWidth(), DTA_DestHeight, screen->GetHeight(), TAG_DONE); break; case END_Pic2: - picname = gameinfo.finalePage2; + picname = gameinfo.GetFinalePage(2); screen->DrawTexture (TexMan[picname], 0, 0, DTA_DestWidth, screen->GetWidth(), DTA_DestHeight, screen->GetHeight(), TAG_DONE); break; case END_Pic3: - picname = gameinfo.finalePage3; + picname = gameinfo.GetFinalePage(3); screen->DrawTexture (TexMan[picname], 0, 0, DTA_DestWidth, screen->GetWidth(), DTA_DestHeight, screen->GetHeight(), TAG_DONE); diff --git a/src/g_level.cpp b/src/g_level.cpp index 2f83495ad..93f67a821 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -189,7 +189,7 @@ void G_SetForEndGame (char *nextmap) { SetEndSequence (nextmap, END_Chess); } - else if (gamemode == commercial) + else if (gameinfo.gametype == GAME_Doom && (gameinfo.flags & GI_MAPxx)) { SetEndSequence (nextmap, END_Cast); } diff --git a/src/g_level.h b/src/g_level.h index 8fa288629..8e475719a 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -82,9 +82,10 @@ struct FMapInfoParser void ParseNextMap(char *mapname); level_info_t *ParseMapHeader(level_info_t &defaultinfo); void ParseMapDefinition(level_info_t &leveldef); + void ParseGameInfo(); void ParseEpisodeInfo (); void ParseSkill (); - void ParseMapInfo (int lump, level_info_t &gamedefaults); + void ParseMapInfo (int lump, level_info_t &gamedefaults, level_info_t &defaultinfo); void ParseOpenBrace(); bool ParseCloseBrace(); @@ -500,7 +501,7 @@ level_info_t *CheckLevelRedirect (level_info_t *info); FString CalcMapName (int episode, int level); -void G_ParseMapInfo (void); +void G_ParseMapInfo (const char *basemapinfo); void G_ClearSnapshots (void); void P_RemoveDefereds (); diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index 13fe03b09..3bfee73fd 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -1763,10 +1763,8 @@ static void SetLevelNum (level_info_t *info, int num) // //========================================================================== -void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults) +void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults, level_info_t &defaultinfo) { - level_info_t defaultinfo; - sc.OpenLumpNum(lump); defaultinfo = gamedefaults; @@ -1774,7 +1772,19 @@ void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults) while (sc.GetString ()) { - if (sc.Compare("gamedefaults")) + if (sc.Compare("include")) + { + sc.MustGetString(); + int inclump = Wads.CheckNumForFullName(sc.String, true); + if (inclump < 0) + { + sc.ScriptError("include file '%s' not found", sc.String); + } + FScanner saved_sc = sc; + ParseMapInfo(inclump, gamedefaults, defaultinfo); + sc = saved_sc; + } + else if (sc.Compare("gamedefaults")) { gamedefaults.Reset(); ParseMapDefinition(gamedefaults); @@ -1825,6 +1835,18 @@ void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults) { AllSkills.Clear(); } + else if (sc.Compare("gameinfo")) + { + if (format_type != FMT_Old) + { + format_type = FMT_New; + ParseGameInfo(); + } + else + { + sc.ScriptError("gameinfo definitions not supported with old MAPINFO syntax"); + } + } else { sc.ScriptError("%s: Unknown top level keyword", sc.String); @@ -1841,7 +1863,7 @@ void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults) // //========================================================================== -void G_ParseMapInfo () +void G_ParseMapInfo (const char *basemapinfo) { int lump, lastlump = 0; level_info_t gamedefaults; @@ -1849,20 +1871,19 @@ void G_ParseMapInfo () atterm(ClearEpisodes); // Parse the default MAPINFO for the current game. - for(int i=0; i<2; i++) + if (basemapinfo != NULL) { - if (gameinfo.mapinfo[i] != NULL) - { - FMapInfoParser parse; - parse.ParseMapInfo(Wads.GetNumForFullName(gameinfo.mapinfo[i]), gamedefaults); - } + FMapInfoParser parse; + level_info_t defaultinfo; + parse.ParseMapInfo(Wads.GetNumForFullName(basemapinfo), gamedefaults, defaultinfo); } // Parse any extra MAPINFOs. while ((lump = Wads.FindLump ("MAPINFO", &lastlump)) != -1) { FMapInfoParser parse; - parse.ParseMapInfo(lump, gamedefaults); + level_info_t defaultinfo; + parse.ParseMapInfo(lump, gamedefaults, defaultinfo); } EndSequences.ShrinkToFit (); diff --git a/src/gi.cpp b/src/gi.cpp index 2eba1dabf..18c0554e1 100644 --- a/src/gi.cpp +++ b/src/gi.cpp @@ -37,6 +37,11 @@ #include "gi.h" #include "m_fixed.h" #include "v_palette.h" +#include "sc_man.h" +#include "w_wad.h" +#include "i_system.h" +#include "v_video.h" +#include "g_level.h" gameinfo_t gameinfo; @@ -70,512 +75,184 @@ static gameborder_t StrifeBorder = "brdr_bl", "brdr_b", "brdr_br" }; -gameinfo_t HexenGameInfo = +// Custom GAMEINFO ------------------------------------------------------------ + +const char* GameInfoBoarders[] = { - GI_PAGESARERAW | GI_MAPxx | GI_NOLOOPFINALEMUSIC | GI_INFOINDEXED | GI_ALWAYSFALLINGDAMAGE, - "TITLE", - "CREDIT", - "CREDIT", - "HEXEN", - 280/35, - 210/35, - 200/35, - "Chat", - "hub", - "-NOFLAT", - "CREDIT", - "CREDIT", - "CREDIT", - { { "TITLE", {4} } }, - NULL, - 33, - "F_022", - &HereticBorder, - 32*FRACUNIT, - GAME_Hexen, - 150, - "F_SKY", - 24*FRACUNIT, - "xlat/heretic.txt", // not really correct but this was used before. - { "mapinfo/hexen.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "BagOfHolding", // Hexen doesn't have a backpack so use Heretic's. - NULL, + "DoomBorder", + "HereticBorder", + "StrifeBorder", + NULL }; -gameinfo_t HexenDKGameInfo = -{ - GI_PAGESARERAW | GI_MAPxx | GI_NOLOOPFINALEMUSIC | GI_INFOINDEXED | GI_ALWAYSFALLINGDAMAGE, - "TITLE", - "CREDIT", - "CREDIT", - "HEXEN", - 280/35, - 210/35, - 200/35, - "Chat", - "hub", - "-NOFLAT-", - "CREDIT", - "CREDIT", - "CREDIT", - { { "TITLE", {4} } }, - NULL, - 33, - "F_022", - &HereticBorder, - 32*FRACUNIT, - GAME_Hexen, - 150, - "F_SKY", - 24*FRACUNIT, - "xlat/heretic.txt", // not really correct but this was used before. - { "mapinfo/hexen.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "BagOfHolding", - NULL, -}; +#define GAMEINFOKEY_CSTRING(key, variable, length) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetToken(TK_StringConst); \ + if(strlen(sc.String) > length) \ + { \ + sc.ScriptError("Value for '%s' can not be longer than %d characters.", #key, length); \ + } \ + strcpy(gameinfo.key, sc.String); \ + } -gameinfo_t HereticGameInfo = -{ - GI_PAGESARERAW | GI_INFOINDEXED, - "TITLE", - "CREDIT", - "CREDIT", - "MUS_TITL", - 280/35, - 210/35, - 200/35, - "misc/chat", - "MUS_CPTD", - "FLOOR25", - "CREDIT", - "CREDIT", - "CREDIT", - { { "TITLE", {4} } }, - NULL, - 17, - "FLAT513", - &HereticBorder, - 32*FRACUNIT, - GAME_Heretic, - 150, - "F_SKY1", - 24*FRACUNIT, - "xlat/heretic.txt", - { "mapinfo/heretic.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "BagOfHolding", - NULL, -}; +#define GAMEINFOKEY_STRINGARRAY(key, variable, length) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + gameinfo.key.Clear(); \ + do \ + { \ + sc.MustGetToken(TK_StringConst); \ + if(strlen(sc.String) > length) \ + { \ + sc.ScriptError("Value for '%s' can not be longer than %d characters.", #key, length); \ + } \ + FName val = sc.String; \ + gameinfo.key.Push(val); \ + } \ + while (sc.CheckToken(',')); \ + } -gameinfo_t HereticSWGameInfo = -{ - GI_PAGESARERAW | GI_SHAREWARE | GI_INFOINDEXED, - "TITLE", - "CREDIT", - "ORDER", - "MUS_TITL", - 280/35, - 210/35, - 200/35, - "misc/chat", - "MUS_CPTD", - "FLOOR25", - "ORDER", - "CREDIT", - "CREDIT", - { { "TITLE", {5} } }, - NULL, - 17, - "FLOOR04", - &HereticBorder, - 32*FRACUNIT, - GAME_Heretic, - 150, - "F_SKY1", - 24*FRACUNIT, - "xlat/heretic.txt", - { "mapinfo/heretic.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "BagOfHolding", - NULL, -}; +#define GAMEINFOKEY_STRING(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetToken(TK_StringConst); \ + gameinfo.key = sc.String; \ + } -gameinfo_t SharewareGameInfo = -{ - GI_SHAREWARE, - "TITLEPIC", - "CREDIT", - "HELP2", - "$MUSIC_INTRO", - 5, - 0, - 200/35, - "misc/chat2", - "$MUSIC_VICTOR", - "FLOOR4_8", - "HELP2", - "VICTORY2", - "HELP2", - { { "HELP1", "HELP2" } }, - "menu/quit1", - 1, - "FLOOR7_2", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; +#define GAMEINFOKEY_INT(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetNumber(); \ + gameinfo.key = sc.Number; \ + } -gameinfo_t RegisteredGameInfo = -{ - 0, - "TITLEPIC", - "CREDIT", - "HELP2", - "$MUSIC_INTRO", - 5, - 0, - 200/35, - "misc/chat2", - "$MUSIC_VICTOR", - "FLOOR4_8", - "HELP2", - "VICTORY2", - "ENDPIC", - { { "HELP1", "HELP2" } }, - "menu/quit1", - 2, - "FLOOR7_2", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; +#define GAMEINFOKEY_FLOAT(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetFloat(); \ + gameinfo.key = static_cast (sc.Float); \ + } -gameinfo_t ChexGameInfo = -{ - GI_CHEX_QUEST, - "TITLEPIC", - "CREDIT", - "HELP1", - "$MUSIC_INTRO", - 5, - 0, - 200/35, - "misc/chat2", - "$MUSIC_VICTOR", - "FLOOR4_8", - "HELP2", - "VICTORY2", - "ENDPIC", - { { "HELP1", "CREDIT" } }, - "menu/quit1", - 2, - "FLOOR7_2", - &DoomBorder, - 0, - GAME_Chex, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/chex.txt", NULL }, - MAKERGB(63,125,57), - MAKERGB(95,175,87), - "ZorchPack", - "sbarinfo/doom.txt", -}; +#define GAMEINFOKEY_FIXED(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetFloat(); \ + gameinfo.key = static_cast (sc.Float*FRACUNIT); \ + } -gameinfo_t Chex3GameInfo = -{ - GI_CHEX_QUEST, - "TITLEPIC", - "ENDPIC", - "VICTORY2", - "$MUSIC_INTRO", - 5, - 0, - 200/35, - "misc/chat2", - "$MUSIC_VICTOR", - "ENDPIC01", - "CREDIT", - "CREDIT", - "ENDPIC", - { { "HELP1", "CREDIT" } }, - "menu/quit1", - 2, - "FLOOR7_2", - &DoomBorder, - 0, - GAME_Chex, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/chex.txt", NULL }, - MAKERGB(63,125,57), - MAKERGB(95,175,87), - "ZorchPack", - "sbarinfo/doom.txt", -}; +#define GAMEINFOKEY_COLOR(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + sc.MustGetToken(TK_StringConst); \ + FString color = sc.String; \ + FString colorName = V_GetColorStringByName(color); \ + if(!colorName.IsEmpty()) \ + color = colorName; \ + gameinfo.key = V_GetColorFromString(NULL, color); \ + } -gameinfo_t RetailGameInfo = -{ - GI_MENUHACK_RETAIL, - "TITLEPIC", - "CREDIT", - "CREDIT", - "$MUSIC_INTRO", - 5, - 0, - 200/35, - "misc/chat2", - "$MUSIC_VICTOR", - "FLOOR4_8", - "CREDIT", - "VICTORY2", - "ENDPIC", - { { "HELP1", "CREDIT" } }, - "menu/quit1", - 2, - "FLOOR7_2", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; +#define GAMEINFOKEY_BOOL(key, variable) \ + else if(nextKey.CompareNoCase(variable) == 0) \ + { \ + if(sc.CheckToken(TK_False)) \ + gameinfo.key = false; \ + else \ + { \ + sc.MustGetToken(TK_True); \ + gameinfo.key = true; \ + } \ + } -gameinfo_t CommercialGameInfo = +void FMapInfoParser::ParseGameInfo() { - GI_MAPxx | GI_MENUHACK_COMMERCIAL, - "TITLEPIC", - "CREDIT", - "CREDIT", - "$MUSIC_DM2TTL", - 11, - 0, - 200/35, - "misc/chat", - "$MUSIC_READ_M", - "SLIME16", - "CREDIT", - "CREDIT", - "CREDIT", - { { "HELP", "CREDIT" } }, - "menu/quit2", - 3, - "GRNROCK", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/doom2.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; + sc.MustGetToken('{'); + while(sc.GetToken()) + { + if (sc.TokenType == '}') return; -gameinfo_t PlutoniaGameInfo = -{ - GI_MAPxx | GI_MENUHACK_COMMERCIAL, - "TITLEPIC", - "CREDIT", - "CREDIT", - "$MUSIC_DM2TTL", - 11, - 0, - 200/35, - "misc/chat", - "$MUSIC_READ_M", - "SLIME16", - "CREDIT", - "CREDIT", - "CREDIT", - { { "HELP", "CREDIT" } }, - "menu/quit2", - 3, - "GRNROCK", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/plutonia.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; + sc.TokenMustBe(TK_Identifier); + FString nextKey = sc.String; + sc.MustGetToken('='); -gameinfo_t TNTGameInfo = -{ - GI_MAPxx | GI_MENUHACK_COMMERCIAL, - "TITLEPIC", - "CREDIT", - "CREDIT", - "$MUSIC_DM2TTL", - 11, - 0, - 200/35, - "misc/chat", - "$MUSIC_READ_M", - "SLIME16", - "CREDIT", - "CREDIT", - "CREDIT", - { { "HELP", "CREDIT" } }, - "menu/quit2", - 3, - "GRNROCK", - &DoomBorder, - 0, - GAME_Doom, - 100, - "F_SKY1", - 24*FRACUNIT, - "xlat/doom.txt", - { "mapinfo/doomcommon.txt", "mapinfo/tnt.txt" }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "Backpack", - "sbarinfo/doom.txt", -}; + if(nextKey.CompareNoCase("border") == 0) + { + if(sc.CheckToken(TK_Identifier)) + { + switch(sc.MustMatchString(GameInfoBoarders)) + { + default: + gameinfo.border = &DoomBorder; + break; + case 1: + gameinfo.border = &HereticBorder; + break; + case 2: + gameinfo.border = &StrifeBorder; + break; + } + } + else + { + // border = {size, offset, tr, t, tl, r, l ,br, b, bl}; + char *graphics[8] = {DoomBorder.tr, DoomBorder.t, DoomBorder.tl, DoomBorder.r, DoomBorder.l, DoomBorder.br, DoomBorder.b, DoomBorder.bl}; + sc.MustGetToken('{'); + sc.MustGetToken(TK_IntConst); + DoomBorder.offset = sc.Number; + sc.MustGetToken(','); + sc.MustGetToken(TK_IntConst); + DoomBorder.size = sc.Number; + for(int i = 0;i < 8;i++) + { + sc.MustGetToken(','); + sc.MustGetToken(TK_StringConst); + int len = int(strlen(sc.String)); + if(len > 8) + sc.ScriptError("Border graphic can not be more than 8 characters long.\n"); + memcpy(graphics[i], sc.String, len); + if(len < 8) // end with a null byte if the string is less than 8 chars. + graphics[i][len] = 0; + } + sc.MustGetToken('}'); + } + } + // Insert valid keys here. + GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8) + GAMEINFOKEY_STRINGARRAY(creditPages, "creditPage", 8) + GAMEINFOKEY_STRING(titleMusic, "titleMusic") + GAMEINFOKEY_FLOAT(titleTime, "titleTime") + GAMEINFOKEY_FLOAT(advisoryTime, "advisoryTime") + GAMEINFOKEY_FLOAT(pageTime, "pageTime") + GAMEINFOKEY_STRING(chatSound, "chatSound") + GAMEINFOKEY_STRING(finaleMusic, "finaleMusic") + GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8) + GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8) + GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8) + GAMEINFOKEY_STRING(quitSound, "quitSound") + GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8) + GAMEINFOKEY_FIXED(telefogheight, "telefogheight") + GAMEINFOKEY_INT(defKickback, "defKickback") + GAMEINFOKEY_CSTRING(SkyFlatName, "SkyFlatName", 8) + GAMEINFOKEY_STRING(translator, "translator") + GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor") + GAMEINFOKEY_COLOR(defaultbloodparticlecolor, "defaultbloodparticlecolor") + GAMEINFOKEY_STRING(backpacktype, "backpacktype") + GAMEINFOKEY_STRING(statusbar, "statusbar") + GAMEINFOKEY_STRING(intermissionMusic, "intermissionMusic") + GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic") + GAMEINFOKEY_BOOL(drawreadthis, "drawreadthis") + else + { + // ignore unkown keys. + sc.UnGet(); + SkipToNext(); + } + } +} -gameinfo_t StrifeGameInfo = +const char *gameinfo_t::GetFinalePage(unsigned int num) const { - GI_MAPxx | GI_INFOINDEXED | GI_ALWAYSFALLINGDAMAGE, - "TITLEPIC", - "CREDIT", - "CREDIT", - "D_LOGO", - 280/35, - 0, - 200/35, - "misc/chat", - "d_intro", - "-NOFLAT", - "CREDIT", - "CREDIT", - "CREDIT", - { { "CREDIT", {4} } }, - NULL, - 49, - "F_PAVE01", - &StrifeBorder, - 0, - GAME_Strife, - 150, - "F_SKY001", - 16*FRACUNIT, - "xlat/strife.txt", - { "mapinfo/strife.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "AmmoSatchel", - NULL, -}; - -gameinfo_t StrifeTeaserGameInfo = -{ - GI_MAPxx | GI_INFOINDEXED | GI_ALWAYSFALLINGDAMAGE | GI_SHAREWARE, - "TITLEPIC", - "CREDIT", - "CREDIT", - "D_LOGO", - 280/35, - 0, - 200/35, - "misc/chat", - "d_intro", - "-NOFLAT", - "CREDIT", - "CREDIT", - "CREDIT", - { { "CREDIT", {4} } }, - NULL, - 49, - "F_PAVE01", - &StrifeBorder, - 0, - GAME_Strife, - 150, - "F_SKY001", - 16*FRACUNIT, - "xlat/strife.txt", - { "mapinfo/strife.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "AmmoSatchel", - NULL, -}; - -gameinfo_t StrifeTeaser2GameInfo = -{ - GI_MAPxx | GI_INFOINDEXED | GI_ALWAYSFALLINGDAMAGE | GI_SHAREWARE | GI_TEASER2, - "TITLEPIC", - "CREDIT", - "CREDIT", - "D_LOGO", - 280/35, - 0, - 200/35, - "misc/chat", - "d_intro", - "-NOFLAT", - "CREDIT", - "CREDIT", - "CREDIT", - { { "CREDIT", {4} } }, - NULL, - 49, - "F_PAVE01", - &StrifeBorder, - 0, - GAME_Strife, - 150, - "F_SKY001", - 16*FRACUNIT, - "xlat/strife.txt", - { "mapinfo/strife.txt", NULL }, - MAKERGB(104,0,0), - MAKERGB(255,0,0), - "AmmoSatchel", - NULL, -}; + if (finalePages.Size() == 0) return "-NOFLAT-"; + else if (num < 1 || num > finalePages.Size()) return finalePages[0]; + else return finalePages[num-1]; +} diff --git a/src/gi.h b/src/gi.h index beaf558e4..73a7d946f 100644 --- a/src/gi.h +++ b/src/gi.h @@ -35,37 +35,15 @@ #define __GI_H__ #include "basictypes.h" +#include "zstring.h" +// Flags are not user configurable and only depend on the standard IWADs #define GI_MAPxx 0x00000001 -#define GI_PAGESARERAW 0x00000002 -#define GI_SHAREWARE 0x00000004 -#define GI_NOLOOPFINALEMUSIC 0x00000008 -#define GI_INFOINDEXED 0x00000010 -#define GI_MENUHACK 0x00000060 -#define GI_MENUHACK_RETAIL 0x00000020 -#define GI_MENUHACK_EXTENDED 0x00000040 // (Heretic) -#define GI_MENUHACK_COMMERCIAL 0x00000060 -#define GI_ALWAYSFALLINGDAMAGE 0x00000080 -#define GI_TEASER2 0x00000100 // Alternate version of the Strife Teaser -#define GI_CHEX_QUEST 0x00000200 +#define GI_SHAREWARE 0x00000002 +#define GI_MENUHACK_EXTENDED 0x00000004 // (Heretic) +#define GI_TEASER2 0x00000008 // Alternate version of the Strife Teaser -#ifndef EGAMETYPE -#define EGAMETYPE -enum EGameType -{ - GAME_Any = 0, - GAME_Doom = 1, - GAME_Heretic = 2, - GAME_Hexen = 4, - GAME_Strife = 8, - GAME_Chex = 16, //Chex is basically Doom, but we need to have a different set of actors. - - GAME_Raven = GAME_Heretic|GAME_Hexen, - GAME_DoomStrife = GAME_Doom|GAME_Strife, - GAME_DoomChex = GAME_Doom|GAME_Chex, - GAME_DoomStrifeChex = GAME_Doom|GAME_Strife|GAME_Chex -}; -#endif +#include "gametype.h" extern const char *GameNames[17]; @@ -86,45 +64,39 @@ typedef struct typedef struct { int flags; + EGameType gametype; + char titlePage[9]; - char creditPage1[9]; - char creditPage2[9]; - char titleMusic[16]; + bool drawreadthis; + bool noloopfinalemusic; + TArray creditPages; + TArray finalePages; + TArray infoPages; + + FString titleMusic; float titleTime; float advisoryTime; float pageTime; - char chatSound[16]; - char finaleMusic[16]; + FString chatSound; + FString finaleMusic; char finaleFlat[9]; - char finalePage1[9]; - char finalePage2[9]; - char finalePage3[9]; - union - { - char infoPage[2][9]; - struct - { - char basePage[9]; - char numPages; - } indexed; - } info; - const char *quitSound; - int maxSwitch; + FString quitSound; char borderFlat[9]; gameborder_t *border; int telefogheight; - EGameType gametype; int defKickback; char SkyFlatName[9]; - fixed_t StepHeight; - const char *translator; - const char *mapinfo[2]; + FString translator; DWORD defaultbloodcolor; DWORD defaultbloodparticlecolor; - const char *backpacktype; - const char *statusbar; + FString backpacktype; + FString statusbar; + FString intermissionMusic; + + const char *GetFinalePage(unsigned int num) const; } gameinfo_t; + extern gameinfo_t gameinfo; #endif //__GI_H__ diff --git a/src/info.h b/src/info.h index 194546e48..9bc97b89b 100644 --- a/src/info.h +++ b/src/info.h @@ -142,23 +142,7 @@ struct FStateLabels FArchive &operator<< (FArchive &arc, FState *&state); -#ifndef EGAMETYPE -#define EGAMETYPE -enum EGameType -{ - GAME_Any = 0, - GAME_Doom = 1, - GAME_Heretic = 2, - GAME_Hexen = 4, - GAME_Strife = 8, - GAME_Chex = 16, - - GAME_Raven = GAME_Heretic|GAME_Hexen, - GAME_DoomStrife = GAME_Doom|GAME_Strife, - GAME_DoomChex = GAME_Doom|GAME_Chex, - GAME_DoomStrifeChex = GAME_Doom|GAME_Strife|GAME_Chex -}; -#endif +#include "gametype.h" typedef TMap DmgFactors; typedef TMap PainChanceList; diff --git a/src/m_menu.cpp b/src/m_menu.cpp index 45f82a1a1..257678e28 100644 --- a/src/m_menu.cpp +++ b/src/m_menu.cpp @@ -1460,36 +1460,23 @@ void M_DrawReadThis () FTexture *tex = NULL, *prevpic = NULL; fixed_t alpha; - if (gameinfo.flags & GI_INFOINDEXED) + // Did the mapper choose a custom help page via MAPINFO? + if ((level.info != NULL) && level.info->f1[0] != 0) { - char name[9]; - name[8] = 0; - Wads.GetLumpName (name, Wads.GetNumForName (gameinfo.info.indexed.basePage, ns_graphics) + InfoType); - tex = TexMan[name]; - if (InfoType > 1) - { - Wads.GetLumpName (name, Wads.GetNumForName (gameinfo.info.indexed.basePage, ns_graphics) + InfoType - 1); - prevpic = TexMan[name]; - } + tex = TexMan.FindTexture(level.info->f1); + InfoType = 1; } - else + + if (tex == NULL) { - // Did the mapper choose a custom help page via MAPINFO? - if ((level.info != NULL) && level.info->f1[0] != 0) - { - tex = TexMan.FindTexture(level.info->f1); - } - - if (tex == NULL) - { - tex = TexMan[gameinfo.info.infoPage[InfoType-1]]; - } - - if (InfoType > 1) - { - prevpic = TexMan[gameinfo.info.infoPage[InfoType-2]]; - } + tex = TexMan[gameinfo.infoPages[InfoType-1].GetChars()]; } + + if (InfoType > 1) + { + prevpic = TexMan[gameinfo.infoPages[InfoType-2].GetChars()]; + } + alpha = MIN (Scale (gametic - InfoTic, OPAQUE, TICRATE/3), OPAQUE); if (alpha < OPAQUE && prevpic != NULL) { @@ -1975,14 +1962,7 @@ void M_ReadThisMore (int choice) { InfoType++; InfoTic = gametic; - if (gameinfo.flags & GI_INFOINDEXED) - { - if (InfoType >= gameinfo.info.indexed.numPages) - { - M_FinishReadThis (0); - } - } - else if (InfoType > 2) + if ((level.info != NULL && level.info->f1[0] != 0) || InfoType > int(gameinfo.infoPages.Size())) { M_FinishReadThis (0); } @@ -3504,19 +3484,15 @@ void M_Init (void) LINEHEIGHT = 20; } - switch (gameinfo.flags & GI_MENUHACK) + if (!gameinfo.drawreadthis) { - case GI_MENUHACK_COMMERCIAL: MainMenu[MainDef.numitems-2] = MainMenu[MainDef.numitems-1]; MainDef.numitems--; MainDef.y += 8; ReadDef.routine = M_DrawReadThis; ReadDef.x = 330; ReadDef.y = 165; - ReadMenu[0].routine = M_FinishReadThis; - break; - default: - break; + //ReadMenu[0].routine = M_FinishReadThis; } M_OptInit (); diff --git a/src/p_map.cpp b/src/p_map.cpp index 1a48bf4d3..09a8336ae 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -162,16 +162,21 @@ static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPos } -void P_GetFloorCeilingZ(FCheckPosition &tmf) +void P_GetFloorCeilingZ(FCheckPosition &tmf, bool get) { - sector_t *sec = P_PointInSector (tmf.x, tmf.y); - tmf.floorsector = sec; - tmf.ceilingsector = sec; + sector_t *sec; + if (get) + { + sec = P_PointInSector (tmf.x, tmf.y); + tmf.floorsector = sec; + tmf.ceilingsector = sec; - tmf.floorz = tmf.dropoffz = sec->floorplane.ZatPoint (tmf.x, tmf.y); - tmf.ceilingz = sec->ceilingplane.ZatPoint (tmf.x, tmf.y); - tmf.floorpic = sec->GetTexture(sector_t::floor); - tmf.ceilingpic = sec->GetTexture(sector_t::ceiling); + tmf.floorz = tmf.dropoffz = sec->floorplane.ZatPoint (tmf.x, tmf.y); + tmf.ceilingz = sec->ceilingplane.ZatPoint (tmf.x, tmf.y); + tmf.floorpic = sec->GetTexture(sector_t::floor); + tmf.ceilingpic = sec->GetTexture(sector_t::ceiling); + } + else sec = tmf.thing->Sector; #ifdef _3DFLOORS for(unsigned int i=0;ie->XFloor.ffloors.Size();i++) @@ -217,14 +222,7 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos) if (!onlyspawnpos) { - P_GetFloorCeilingZ(tmf); - actor->floorz = tmf.floorz; - actor->dropoffz = tmf.dropoffz; - actor->ceilingz = tmf.ceilingz; - actor->floorpic = tmf.floorpic; - actor->floorsector = tmf.floorsector; - actor->ceilingpic = tmf.ceilingpic; - actor->ceilingsector = tmf.ceilingsector; + P_GetFloorCeilingZ(tmf, true); } else { @@ -234,7 +232,15 @@ void P_FindFloorCeiling (AActor *actor, bool onlyspawnpos) tmf.ceilingz = actor->ceilingz; tmf.floorpic = actor->floorpic; tmf.ceilingpic = actor->ceilingpic; + P_GetFloorCeilingZ(tmf, false); } + actor->floorz = tmf.floorz; + actor->dropoffz = tmf.dropoffz; + actor->ceilingz = tmf.ceilingz; + actor->floorpic = tmf.floorpic; + actor->floorsector = tmf.floorsector; + actor->ceilingpic = tmf.ceilingpic; + actor->ceilingsector = tmf.ceilingsector; FBoundingBox box(tmf.x, tmf.y, actor->radius); @@ -293,7 +299,7 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr tmf.x = x; tmf.y = y; tmf.z = z; - P_GetFloorCeilingZ(tmf); + P_GetFloorCeilingZ(tmf, true); spechit.Clear (); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 6a79c7bc7..95833f398 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3370,7 +3370,7 @@ void P_SetupLevel (char *lumpname, int position) { // We need translators only for Doom format maps. // If none has been defined in a map use the game's default. - P_LoadTranslator(!level.info->Translator.IsEmpty()? level.info->Translator.GetChars() : gameinfo.translator); + P_LoadTranslator(!level.info->Translator.IsEmpty()? level.info->Translator.GetChars() : gameinfo.translator.GetChars()); } CheckCompatibility(map); diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 14e200f65..9eb0ec6a2 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -143,10 +143,9 @@ void P_InitSwitchList () Printf ("Switch %s in SWITCHES has the same 'on' state\n", list_p); continue; } - // [RH] Skip this switch if its texture can't be found. - if (((gameinfo.maxSwitch & 15) >= (list_p[18] & 15)) && - ((gameinfo.maxSwitch & ~15) == (list_p[18] & ~15)) && - TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags).Exists()) + // [RH] Skip this switch if its textures can't be found. + if (TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags).Exists() && + TexMan.CheckForTexture (list_p + 9 /* .name2 */, FTexture::TEX_Wall, texflags).Exists()) { def1 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); @@ -204,42 +203,40 @@ void P_ProcessSwitchDef (FScanner &sc) FString picname; FSwitchDef *def1, *def2; FTextureID picnum; - BYTE max; + int gametype; bool quest = false; def1 = def2 = NULL; sc.MustGetString (); if (sc.Compare ("doom")) { - max = 0; + gametype = GAME_DoomChex; + sc.CheckNumber(); // skip the gamemission filter } else if (sc.Compare ("heretic")) { - max = 17; + gametype = GAME_Heretic; } else if (sc.Compare ("hexen")) { - max = 33; + gametype = GAME_Hexen; } else if (sc.Compare ("strife")) { - max = 49; + gametype = GAME_Strife; } else if (sc.Compare ("any")) { - max = 240; + gametype = GAME_Any; } else { // There is no game specified; just treat as any - max = 240; + //max = 240; + gametype = GAME_Any; sc.UnGet (); } - if (max == 0) - { - sc.MustGetNumber (); - max |= sc.Number & 15; - } + sc.MustGetString (); picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags); picname = sc.String; @@ -271,16 +268,9 @@ void P_ProcessSwitchDef (FScanner &sc) break; } } -/* - if (def1 == NULL) - { - sc.ScriptError ("Switch must have an on state"); - } -*/ + if (def1 == NULL || !picnum.Exists() || - ((max & 240) != 240 && - ((gameinfo.maxSwitch & 240) != (max & 240) || - (gameinfo.maxSwitch & 15) < (max & 15)))) + (gametype != GAME_Any && !(gametype & gameinfo.gametype))) { if (def2 != NULL) { diff --git a/src/w_wad.cpp b/src/w_wad.cpp index 22939085f..02f433dcb 100644 --- a/src/w_wad.cpp +++ b/src/w_wad.cpp @@ -302,7 +302,7 @@ int FWadCollection::AddExternalFile(const char *filename) // //----------------------------------------------------------------------- -static DWORD Zip_FindCentralDir(FileReader * fin) +DWORD Zip_FindCentralDir(FileReader * fin) { unsigned char buf[BUFREADCOMMENT + 4]; DWORD FileSize; diff --git a/src/w_wad.h b/src/w_wad.h index e72d58d02..31ee6315a 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -103,6 +103,9 @@ void uppercopy (char *to, const char *from); // Perform Blood encryption/decryption. void BloodCrypt (void *data, int key, int len); +// Locate central directory in a zip file. +DWORD Zip_FindCentralDir(FileReader * fin); + // A very loose reference to a lump on disk. This is really just a wrapper // around the main wad's FILE object with a different length recorded. Since // two lumps from the same wad share the same FILE, you cannot read from diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 718eeeace..e45ee665d 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -312,7 +312,7 @@ void WI_LoadBackground(bool isenterpic) { case GAME_Chex: case GAME_Doom: - if (gamemode != commercial) + if (!(gameinfo.flags & GI_MAPxx)) { const char *level = isenterpic ? wbs->next : wbs->current; if (IsExMy(level)) @@ -332,7 +332,7 @@ void WI_LoadBackground(bool isenterpic) if (level.info->ExitPic.IsNotEmpty()) return; // E1-E3 need special treatment when playing Doom 1. - if (gamemode!=commercial) + if (!(gameinfo.flags & GI_MAPxx)) { // not if the last level is not from the first 3 episodes if (!IsExMy(wbs->current)) return; @@ -1881,16 +1881,8 @@ void WI_Ticker(void) // intermission music - use the defaults if none specified if (level.info->InterMusic.IsNotEmpty()) S_ChangeMusic(level.info->InterMusic, level.info->intermusicorder); - else if (gameinfo.gametype == GAME_Heretic) - S_ChangeMusic ("mus_intr"); - else if (gameinfo.gametype == GAME_Hexen) - S_ChangeMusic ("hub"); - else if (gameinfo.gametype == GAME_Strife) // Strife also needs a default - S_ChangeMusic ("d_slide"); - else if (gamemode == commercial) - S_ChangeMusic ("$MUSIC_DM2INT"); else - S_ChangeMusic ("$MUSIC_INTER"); + S_ChangeMusic (gameinfo.intermissionMusic.GetChars()); } diff --git a/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 52347257b..7c00dd8bb 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -1,5 +1,32 @@ // MAPINFO for Chex Quest +gameinfo +{ + titlepage = "TITLEPIC" + creditpage = "CREDIT", "HELP1" + titlemusic = "$MUSIC_INTRO" + titletime = 5 + advisorytime = 0 + pagetime = 5 + chatsound = "misc/chat2" + finalemusic = "$MUSIC_VICTOR" + finaleflat = "FLOOR4_8" + finalepage = "HELP2", "VICTORY2", "ENDPIC" + infopage = "HELP1", "CREDIT" + quitsound = "menu/quit1" + borderflat = "FLOOR7_2" + border = DoomBorder + telefogheight = 0 + defkickback = 100 + skyflatname = "F_SKY1" + translator = "xlat/doom.txt" + defaultbloodcolor = "3f 7d 39" + defaultbloodparticlecolor = "5f af 57" + backpacktype = "ZorchPack" + statusbar = "sbarinfo/doom.txt" + intermissionmusic = "$MUSIC_INTER" +} + skill baby { AutoUseHealth diff --git a/wadsrc/static/mapinfo/chex3.txt b/wadsrc/static/mapinfo/chex3.txt new file mode 100644 index 000000000..1f5fa4487 --- /dev/null +++ b/wadsrc/static/mapinfo/chex3.txt @@ -0,0 +1,10 @@ +include "mapinfo/chex.txt" + +// Chex Quest 3 gameinfo + +gameinfo +{ + creditpage = "ENDPIC", "VICTORY2" + finaleflat = "ENDPIC01" + finalepage = "CREDIT", "CREDIT", "ENDPIC" +} \ No newline at end of file diff --git a/wadsrc/static/mapinfo/doom1.txt b/wadsrc/static/mapinfo/doom1.txt index 6ffc2777a..52facad4b 100644 --- a/wadsrc/static/mapinfo/doom1.txt +++ b/wadsrc/static/mapinfo/doom1.txt @@ -1,4 +1,19 @@ // MAPINFO for Doom 1 (Shareware, Registered, and Retail) +include "mapinfo/doomcommon.txt" + +gameinfo +{ + creditpage = "CREDIT", "HELP2" + titlemusic = "$MUSIC_INTRO" + titletime = 5 + finalemusic = "$MUSIC_VICTOR" + finaleflat = "FLOOR4_8" + finalepage = "HELP2", "VICTORY2", "ENDPIC" + infopage = "HELP1", "HELP2" + quitsound = "menu/quit1" + borderflat = "FLOOR7_2" + drawreadthis = true +} clearepisodes episode e1m1 diff --git a/wadsrc/static/mapinfo/doom2.txt b/wadsrc/static/mapinfo/doom2.txt index 4d8a8c193..50bae7d9d 100644 --- a/wadsrc/static/mapinfo/doom2.txt +++ b/wadsrc/static/mapinfo/doom2.txt @@ -1,4 +1,5 @@ // MAPINFO for Doom 2 +include "mapinfo/doomcommon.txt" clearepisodes episode map01 diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index 82cf91115..770417607 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -1,3 +1,32 @@ + +gameinfo +{ + titlepage = "TITLEPIC" + creditpage = "CREDIT" + titlemusic = "$MUSIC_DM2TTL" + titletime = 11 + advisorytime = 0 + pagetime = 5 + chatsound = "misc/chat" + finalemusic = "$MUSIC_READ_M" + finaleflat = "SLIME16" + finalepage = "CREDIT" + infopage = "HELP", "CREDIT" + quitsound = "menu/quit2" + borderflat = "GRNROCK" + border = DoomBorder + telefogheight = 0 + defkickback = 100 + skyflatname = "F_SKY1" + translator = "xlat/doom.txt" + mapinfo = "mapinfo/doom2.txt" + defaultbloodcolor = "68 00 00" + defaultbloodparticlecolor = "ff 00 00" + backpacktype = "Backpack" + statusbar = "sbarinfo/doom.txt" + intermissionmusic = "$MUSIC_INTER" +} + skill baby { AutoUseHealth diff --git a/wadsrc/static/mapinfo/heretic.txt b/wadsrc/static/mapinfo/heretic.txt index ccc6ea12b..a56c90fc1 100644 --- a/wadsrc/static/mapinfo/heretic.txt +++ b/wadsrc/static/mapinfo/heretic.txt @@ -1,5 +1,32 @@ // MAPINFO for Heretic (Shareware and Retail) +gameinfo +{ + titlepage = "TITLE" + creditpage = "CREDIT" + titlemusic = "MUS_TITL" + titletime = 8 + advisorytime = 6 + pagetime = 5 + chatsound = "misc/chat" + finalemusic = "MUS_CPTD" + finaleflat = "FLOOR25" + finalepage = "CREDIT" + infopage = "HELP1", "HELP2", "CREDIT" + quitsound = "" + borderflat = "FLAT513" + border = HereticBorder + telefogheight = 32 + defkickback = 150 + skyflatname = "F_SKY1" + translator = "xlat/heretic.txt" + defaultbloodcolor = "68 00 00" + defaultbloodparticlecolor = "ff 00 00" + backpacktype = "BagOfHolding" + statusbar = "" + intermissionmusic = "mus_intr" +} + skill baby { AutoUseHealth diff --git a/wadsrc/static/mapinfo/hereticsw.txt b/wadsrc/static/mapinfo/hereticsw.txt new file mode 100644 index 000000000..89b6c0762 --- /dev/null +++ b/wadsrc/static/mapinfo/hereticsw.txt @@ -0,0 +1,8 @@ +include "mapinfo/heretic.txt" + +gameinfo +{ + finalepage = "ORDER" + infopage = "ORDER", "HELP1", "HELP2", "CREDIT" +} + diff --git a/wadsrc/static/mapinfo/hexen.txt b/wadsrc/static/mapinfo/hexen.txt index fb6238fc5..7cf50f892 100644 --- a/wadsrc/static/mapinfo/hexen.txt +++ b/wadsrc/static/mapinfo/hexen.txt @@ -2,6 +2,34 @@ // Most of the MAPINFO is still in hexen.wad. +gameinfo +{ + noloopfinalemusic = true + titlepage = "TITLE" + creditpage = "CREDIT" + titlemusic = "HEXEN" + titletime = 8 + advisorytime = 6 + pagetime = 5 + chatsound = "Chat" + finalemusic = "hub" + finaleflat = "-NOFLAT-" + finalepage = "CREDIT" + infopage = "HELP1", "HELP2", "CREDIT" + quitsound = "" + borderflat = "F_022" + border = HereticBorder + telefogheight = 32 + defkickback = 150 + skyflatname = "F_SKY" + translator = "xlat/heretic.txt" // not really correct but this was used before. + defaultbloodcolor = "68 00 00" + defaultbloodparticlecolor = "ff 00 00" + backpacktype = "BagOfHolding" // Hexen doesn't have a backpack so use Heretic's. + statusbar = "" + intermissionmusic = "hub" +} + skill baby { AutoUseHealth diff --git a/wadsrc/static/mapinfo/plutonia.txt b/wadsrc/static/mapinfo/plutonia.txt index 2fe625b08..612aaf264 100644 --- a/wadsrc/static/mapinfo/plutonia.txt +++ b/wadsrc/static/mapinfo/plutonia.txt @@ -1,7 +1,8 @@ // MAPINFO for Plutonia. Exactly the same as Doom 2, except it - // has different map names and cluster messages. +include "mapinfo/doomcommon.txt" + clearepisodes episode map01 { diff --git a/wadsrc/static/mapinfo/strife.txt b/wadsrc/static/mapinfo/strife.txt index cd8ea34a2..03341496c 100644 --- a/wadsrc/static/mapinfo/strife.txt +++ b/wadsrc/static/mapinfo/strife.txt @@ -1,5 +1,32 @@ // MAPINFO for Strife (full version and teaser) +gameinfo +{ + titlepage = "TITLEPIC" + creditpage = "CREDIT" + titlemusic = "D_LOGO" + titletime = 8 + advisorytime = 0 + pagetime = 5 + chatsound = "misc/chat" + finalemusic = "d_intro" + finaleflat = "-NOFLAT-" + finalepage = "CREDIT" + infopage = "HELP1", "HELP2", "HELP3" + quitsound = "" + borderflat = "F_PAVE01" + border = StrifeBorder + telefogheight = 0 + defkickback = 150 + skyflatname = "F_SKY001" + translator = "xlat/strife.txt" + defaultbloodcolor = "68 00 00" + defaultbloodparticlecolor = "ff 00 00" + backpacktype = "AmmoSatchel" + statusbar = "" + intermissionmusic = "d_slide" +} + skill baby { AutoUseHealth diff --git a/wadsrc/static/mapinfo/tnt.txt b/wadsrc/static/mapinfo/tnt.txt index 9cd3488af..438b61ff1 100644 --- a/wadsrc/static/mapinfo/tnt.txt +++ b/wadsrc/static/mapinfo/tnt.txt @@ -1,7 +1,8 @@ // MAPINFO for TNT. Exactly the same as Doom 2, except it - // has different map names and cluster messages. +include "mapinfo/doomcommon.txt" + clearepisodes episode map01 { diff --git a/wadsrc/static/mapinfo/ultdoom.txt b/wadsrc/static/mapinfo/ultdoom.txt new file mode 100644 index 000000000..059433cda --- /dev/null +++ b/wadsrc/static/mapinfo/ultdoom.txt @@ -0,0 +1,10 @@ +include "mapinfo/doom1.txt" + +gameinfo +{ + creditpage = "CREDIT" + chatsound = "misc/chat2" + finalepage = "CREDIT", "VICTORY2", "ENDPIC" + infopage = "HELP1", "CREDIT" +} + diff --git a/zdoom.vcproj b/zdoom.vcproj index dc8e6e653..9cd643f17 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + @@ -954,7 +958,7 @@ /> + + @@ -1602,6 +1610,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + @@ -1844,14 +1860,6 @@ Outputs="$(IntDir)/$(InputName).obj" /> - - - @@ -2017,14 +2025,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -2035,6 +2035,14 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - + + + - - - @@ -5343,6 +5343,14 @@ AdditionalIncludeDirectories="src\win32;$(NoInherit)" /> + + + @@ -5621,7 +5629,7 @@ />