// Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // // Copyright(C) 2006 Simon Howard // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. // // DESCRIPTION: // Search for and locate an IWAD file, and initialise according // to the IWAD type. // //----------------------------------------------------------------------------- #include #include #include #include #include "deh_main.h" #include "doomdef.h" #include "doomstat.h" #include "i_system.h" #include "m_argv.h" #include "m_misc.h" #include "w_wad.h" #include "z_zone.h" // Array of locations to search for IWAD files #define MAX_IWAD_DIRS 32 static char *iwad_dirs[MAX_IWAD_DIRS]; static int num_iwad_dirs = 0; static void AddIWADDir(char *dir) { iwad_dirs[num_iwad_dirs] = dir; ++num_iwad_dirs; } // This is Windows-specific code that automatically finds the location // of installed IWAD files. The registry is inspected to find special // keys installed by the Windows installers for various CD versions // of Doom. From these keys we can deduce where to find an IWAD. #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include typedef struct { HKEY root; char *path; char *value; } registry_value_t; #define UNINSTALLER_STRING "\\uninstl.exe /S " // Keys installed by the various CD editions. These are actually the // commands to invoke the uninstaller and look like this: // // C:\Program Files\Path\uninstl.exe /S C:\Program Files\Path // // With some munging we can find where Doom was installed. static registry_value_t uninstall_values[] = { // Ultimate Doom, CD version (Depths of Doom trilogy) { HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\" "Uninstall\\Ultimate Doom for Windows 95", "UninstallString", }, // Doom II, CD version (Depths of Doom trilogy) { HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\" "Uninstall\\Doom II for Windows 95", "UninstallString", }, // Final Doom { HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\" "Uninstall\\Final Doom for Windows 95", "UninstallString", }, // Shareware version { HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\" "Uninstall\\Doom Shareware for Windows 95", "UninstallString", }, }; // Value installed by the Collector's Edition when it is installed static registry_value_t collectors_edition_value = { HKEY_LOCAL_MACHINE, "Software\\Activision\\DOOM Collector's Edition\\v1.0", "INSTALLPATH", }; // Subdirectories of the above install path, where IWADs are installed. static char *collectors_edition_subdirs[] = { "Doom2", "Final Doom", "Ultimate Doom", }; static char *GetRegistryString(registry_value_t *reg_val) { HKEY key; DWORD len; DWORD valtype; char *result; // Open the key (directory where the value is stored) if (RegOpenKeyEx(reg_val->root, reg_val->path, 0, KEY_READ, &key) != ERROR_SUCCESS) { return NULL; } // Find the type and length of the string if (RegQueryValueEx(key, reg_val->value, NULL, &valtype, NULL, &len) != ERROR_SUCCESS) { return NULL; } // Only accept strings if (valtype != REG_SZ) { return NULL; } // Allocate a buffer for the value and read the value result = Z_Malloc(len, PU_STATIC, 0); if (RegQueryValueEx(key, reg_val->value, NULL, &valtype, (unsigned char *) result, &len) != ERROR_SUCCESS) { Z_Free(result); return NULL; } // Close the key RegCloseKey(key); return result; } // Check for the uninstall strings from the CD versions static void CheckUninstallStrings(void) { int i; for (i=0; i 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"); } }