TArray<FString> I_GetSteamPath() { TArray<FString> result; 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", "DOOM 3 BFG Edition/base/wads", "Strife" }; FString path; if (!QueryPathKey(HKEY_CURRENT_USER, "Software\\Valve\\Steam", "SteamPath", path)) { if (!QueryPathKey(HKEY_LOCAL_MACHINE, "Software\\Valve\\Steam", "InstallPath", path)) return result; } path += "/SteamApps/common/"; for(unsigned int i = 0; i < countof(steam_dirs); ++i) { result.Push(path + steam_dirs[i]); } return result; }
FString I_GetSteamPath() { FString path; if (QueryPathKey(HKEY_CURRENT_USER, "Software\\Valve\\Steam", "SteamPath", path)) { return path; } if (QueryPathKey(HKEY_LOCAL_MACHINE, "Software\\Valve\\Steam", "InstallPath", path)) { return path; } path = ""; return path; }
TArray<FString> I_GetGogPaths() { TArray<FString> result; FString path; FString gamepath; #ifdef _WIN64 FString gogregistrypath = "Software\\Wow6432Node\\GOG.com\\Games"; #else // If a 32-bit ZDoom runs on a 64-bit Windows, this will be transparently and // automatically redirected to the Wow6432Node address instead, so this address // should be safe to use in all cases. FString gogregistrypath = "Software\\GOG.com\\Games"; #endif // Look for Ultimate Doom gamepath = gogregistrypath + "\\1435827232"; if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) { result.Push(path); // directly in install folder } // Look for Doom II gamepath = gogregistrypath + "\\1435848814"; if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) { result.Push(path + "/doom2"); // in a subdirectory // If direct support for the Master Levels is ever added, they are in path + /master/wads } // Look for Final Doom gamepath = gogregistrypath + "\\1435848742"; if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) { // in subdirectories result.Push(path + "/TNT"); result.Push(path + "/Plutonia"); } // Look for Strife: Veteran Edition gamepath = gogregistrypath + "\\1432899949"; if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.GetChars(), "Path", path)) { result.Push(path); // directly in install folder } return result; }
/* BaseResourceArchivesPanel::autodetect * Automatically seek IWADs to populate the list *******************************************************************/ void BaseResourceArchivesPanel::autodetect() { // List of known IWADs and common aliases ArchiveEntry * iwadlist = theArchiveManager->programResourceArchive()->entryAtPath("config/iwads.cfg"); if (!iwadlist) return; Parser p; p.parseText(iwadlist->getMCData(), "slade.pk3:config/iwads.cfg"); // Find IWADs from DOOMWADDIR and DOOMWADPATH // See http://doomwiki.org/wiki/Environment_variables string doomwaddir, doomwadpath, envvar; envvar = "DOOMWADDIR"; wxGetEnv(envvar, &doomwaddir); envvar = "DOOMWADPATH"; wxGetEnv(envvar, &doomwadpath); if (doomwaddir.length() || doomwadpath.length()) { #ifdef WIN32 char separator = ';'; doomwadpath.Replace("\\", "/", true); doomwaddir.Replace("\\", "/", true); #else char separator = ':'; #endif wxArrayString paths = wxSplit(doomwadpath, separator); paths.Add(doomwaddir); wxArrayString iwadnames; ParseTreeNode* list = (ParseTreeNode*)p.parseTreeRoot()->getChild("iwads"); for (size_t i = 0; i < list->nChildren(); ++i) iwadnames.Add(list->getChild(i)->getName()); // Look for every known IWAD in every known IWAD directory for (size_t i = 0; i < paths.size(); ++i) { string folder = paths[i]; if (folder.Last() != '/') folder += '/'; for (size_t j = 0; j < iwadnames.size(); ++j) { string iwad = folder + iwadnames[j]; #ifndef WIN32 // Try a couple variants before throwing the towel about a name if (!wxFileExists(iwad)) iwad = folder + iwadnames[j].Capitalize(); if (!wxFileExists(iwad)) iwad = folder + iwadnames[j].Upper(); #endif // If a valid combo is found, add it to the list unless already present if (wxFileExists(iwad)) { // Verify existence before adding it to the list if (list_base_archive_paths->FindString(iwad) == wxNOT_FOUND) { theArchiveManager->addBaseResourcePath(iwad); list_base_archive_paths->Append(iwad); } } } } } // Let's take a look at the registry wxArrayString paths; string path; string gamepath; // Now query GOG.com paths -- Windows only for now #ifdef __WXMSW__ #ifdef _WIN64 string gogregistrypath = "Software\\Wow6432Node\\GOG.com"; #else // If a 32-bit ZDoom runs on a 64-bit Windows, this will be transparently and // automatically redirected to the Wow6432Node address instead, so this address // should be safe to use in all cases. string gogregistrypath = "Software\\GOG.com"; #endif if (QueryPathKey(wxRegKey::HKLM, gogregistrypath, "DefaultPackPath", path)) { ParseTreeNode* list = (ParseTreeNode*)p.parseTreeRoot()->getChild("gog"); for (size_t i = 0; i < list->nChildren(); ++i) { ParseTreeNode* child = (ParseTreeNode*)list->getChild(i); gamepath = gogregistrypath + ((ParseTreeNode*)child->getChild("id"))->getStringValue(); if (QueryPathKey(wxRegKey::HKLM, gamepath, "Path", path)) paths.Add(path + ((ParseTreeNode*)child->getChild("path"))->getStringValue()); } } #endif // Now query Steam paths -- Windows only for now as well #ifdef __WXMSW__ if (QueryPathKey(wxRegKey::HKCU, "Software\\Valve\\Steam", "SteamPath", gamepath) || QueryPathKey(wxRegKey::HKLM, "Software\\Valve\\Steam", "InstallPath", gamepath)) { gamepath += "/SteamApps/common/"; ParseTreeNode* list = (ParseTreeNode*)p.parseTreeRoot()->getChild("steam"); for (size_t i = 0; i < list->nChildren(); ++i) paths.Add(gamepath + ((ParseTreeNode*)list->getChild(i))->getStringValue()); } #else // TODO: Querying Steam registry on Linux and OSX. This involves parsing Steam's config.vdf file, which is found in // FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &folder) + "/Steam/config/config.vdf" on OSX // and in ~home/.local/share/Steam/config/config.vdf on Linux/BSD systems. There's also default install dirs in // appSupportPath + "/Steam/SteamApps/common" for OSX, ~home/.local/share/Steam/SteamApps/common for Linux/BSD. #endif // Add GOG & Steam paths for (size_t i = 0; i < paths.size(); ++i) { string iwad = paths[i]; iwad.Replace("\\", "/", true); if (wxFileExists(iwad)) { // Verify existence before adding it to the list if (list_base_archive_paths->FindString(iwad) == wxNOT_FOUND) { theArchiveManager->addBaseResourcePath(iwad); list_base_archive_paths->Append(iwad); } } } }