From a4b69c9ed8ba44aab26ff567e0f0eaf390e29cee Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 19 Nov 2015 19:05:50 +0100 Subject: added fallout 4 support --- src/shared/fallout4info.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++ src/shared/fallout4info.h | 80 ++++++++++++++++++++++++++++++ src/shared/gameinfo.cpp | 3 ++ src/shared/gameinfo.h | 1 + 4 files changed, 201 insertions(+) create mode 100644 src/shared/fallout4info.cpp create mode 100644 src/shared/fallout4info.h (limited to 'src/shared') diff --git a/src/shared/fallout4info.cpp b/src/shared/fallout4info.cpp new file mode 100644 index 00000000..81143731 --- /dev/null +++ b/src/shared/fallout4info.cpp @@ -0,0 +1,117 @@ +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer 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 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 Mod Organizer. If not, see . +*/ + +#include "fallout4info.h" +#include "util.h" +#include +#include +#include +#include "windows_error.h" +#include "error_report.h" +#define WIN32_LEAN_AND_MEAN +#include +#include + +namespace MOShared { + +Fallout4Info::Fallout4Info(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) + : GameInfo(moDirectory, moDataDirectory, gameDirectory) +{ + identifyMyGamesDirectory(L"fallout4"); +} + +bool Fallout4Info::identifyGame(const std::wstring &searchPath) +{ + return FileExists(searchPath, L"Fallout4.exe") && + FileExists(searchPath, L"Fallout4Launcher.exe"); +} + +std::wstring Fallout4Info::getRegPathStatic() +{ + HKEY key; + LONG errorcode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Bethesda Softworks\\Fallout4", + 0, KEY_QUERY_VALUE, &key); + + if (errorcode != ERROR_SUCCESS) { + return std::wstring(); + } + + WCHAR temp[MAX_PATH]; + DWORD bufferSize = MAX_PATH; + + if (::RegQueryValueExW(key, L"Installed Path", nullptr, nullptr, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + return std::wstring(temp); + } else { + return std::wstring(); + } +} + + +std::vector Fallout4Info::getDLCPlugins() +{ + return std::vector(); +} + +std::vector Fallout4Info::getSavegameAttachmentExtensions() +{ + return std::vector(); +} + +std::vector Fallout4Info::getIniFileNames() +{ + return boost::assign::list_of(L"fallout4.ini")(L"fallout4prefs.ini"); +} + +std::wstring Fallout4Info::getReferenceDataFile() +{ + return L"Fallout - Meshes.bsa"; +} + +std::wstring Fallout4Info::getNexusPage(bool nmmScheme) +{ + if (nmmScheme) { + return L"http://nmm.nexusmods.com/fallout4"; + } else { + return L"http://www.nexusmods.com/fallout4"; + } +} + +std::wstring Fallout4Info::getNexusInfoUrlStatic() +{ + return L"http://nmm.nexusmods.com/fallout4"; +} + +int Fallout4Info::getNexusModIDStatic() +{ + return 377160; +} + +bool Fallout4Info::rerouteToProfile(const wchar_t *fileName, const wchar_t*) +{ + static LPCWSTR profileFiles[] = { L"fallout4.ini", L"fallout4prefs.ini", L"plugins.txt", nullptr }; + + for (int i = 0; profileFiles[i] != nullptr; ++i) { + if (_wcsicmp(fileName, profileFiles[i]) == 0) { + return true; + } + } + return false; +} + +} // namespace MOShared diff --git a/src/shared/fallout4info.h b/src/shared/fallout4info.h new file mode 100644 index 00000000..98ce4092 --- /dev/null +++ b/src/shared/fallout4info.h @@ -0,0 +1,80 @@ +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer 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 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 Mod Organizer. If not, see . +*/ + +#ifndef FALLOUT4INFO_H +#define FALLOUT4INFO_H + + +#include "gameinfo.h" + +namespace MOShared { + + +class Fallout4Info : public GameInfo +{ + + friend class GameInfo; + +public: + + virtual ~Fallout4Info() {} + + static std::wstring getRegPathStatic(); + virtual std::wstring getRegPath() { return getRegPathStatic(); } + virtual std::wstring getBinaryName() { return L"Fallout4.exe"; } + + virtual GameInfo::Type getType() { return TYPE_FALLOUT4; } + + virtual std::wstring getGameName() const { return L"Fallout 4"; } + virtual std::wstring getGameShortName() const { return L"Fallout4"; } + + virtual std::vector getDLCPlugins(); + virtual std::vector getSavegameAttachmentExtensions(); + + // file name of this games ini (no path) + virtual std::vector getIniFileNames(); + + virtual std::wstring getReferenceDataFile(); + + virtual std::wstring getNexusPage(bool nmmScheme = true); + static std::wstring getNexusInfoUrlStatic(); + virtual std::wstring getNexusInfoUrl() { return getNexusInfoUrlStatic(); } + static int getNexusModIDStatic(); + virtual int getNexusModID() { return getNexusModIDStatic(); } + virtual int getNexusGameID() { return 1151; } + + virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath); + + // get a list of executables (game binary and known-to-work 3rd party tools). All of these are relative to + // the game directory + //virtual std::vector getExecutables(); + + virtual std::wstring archiveListKey() { return L"SArchiveList"; } + +private: + + Fallout4Info(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + + static bool identifyGame(const std::wstring &searchPath); + +}; + +} // namespace MOShared + +#endif // FALLOUT3INFO_H diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 1f25cec1..db72653e 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "oblivioninfo.h" #include "fallout3info.h" +#include "fallout4info.h" #include "falloutnvinfo.h" #include "skyriminfo.h" #include "util.h" @@ -97,6 +98,8 @@ bool GameInfo::identifyGame(const std::wstring &moDirectory, const std::wstring s_Instance = new FalloutNVInfo(moDirectory, moDataDirectory, searchPath); } else if (SkyrimInfo::identifyGame(searchPath)) { s_Instance = new SkyrimInfo(moDirectory, moDataDirectory, searchPath); + } else if (Fallout4Info::identifyGame(searchPath)) { + s_Instance = new Fallout4Info(moDirectory, moDataDirectory, searchPath); } return s_Instance != nullptr; diff --git a/src/shared/gameinfo.h b/src/shared/gameinfo.h index a32b6b82..8ee8a8de 100644 --- a/src/shared/gameinfo.h +++ b/src/shared/gameinfo.h @@ -43,6 +43,7 @@ public: enum Type { TYPE_OBLIVION, TYPE_FALLOUT3, + TYPE_FALLOUT4, TYPE_FALLOUTNV, TYPE_SKYRIM }; -- cgit v1.3.1