From 651890d422f56051730f3188fda11bbde66c1998 Mon Sep 17 00:00:00 2001 From: Jeremy Rimpo Date: Thu, 1 Aug 2024 21:08:42 -0500 Subject: [PATCH] Initial migration from original FO4 plugin --- .clang-format | 41 ++++ .gitattributes | 7 + .github/workflows/build.yml | 16 ++ .github/workflows/linting.yml | 16 ++ .gitignore | 5 + CMakeLists.txt | 10 + src/CMakeLists.txt | 7 + src/SConscript | 14 ++ src/fo4london.qrc | 5 + src/fo4londonbsainvalidation.cpp | 68 +++++++ src/fo4londonbsainvalidation.h | 33 +++ src/fo4londondataarchives.cpp | 48 +++++ src/fo4londondataarchives.h | 27 +++ src/fo4londonmoddatachecker.h | 29 +++ src/fo4londonmoddatacontent.h | 44 ++++ src/fo4londonsavegame.cpp | 79 ++++++++ src/fo4londonsavegame.h | 24 +++ src/fo4londonscriptextender.cpp | 18 ++ src/fo4londonscriptextender.h | 17 ++ src/fo4londonunmanagedmods.cpp | 63 ++++++ src/fo4londonunmanagedmods.h | 18 ++ src/game_fo4london_en.ts | 28 +++ src/gamefo4london.cpp | 335 +++++++++++++++++++++++++++++++ src/gamefo4london.h | 73 +++++++ src/gamefo4london.json | 1 + src/gamefo4london.pro | 50 +++++ src/splash.png | Bin 0 -> 52981 bytes 27 files changed, 1076 insertions(+) create mode 100644 .clang-format create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/linting.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/SConscript create mode 100644 src/fo4london.qrc create mode 100644 src/fo4londonbsainvalidation.cpp create mode 100644 src/fo4londonbsainvalidation.h create mode 100644 src/fo4londondataarchives.cpp create mode 100644 src/fo4londondataarchives.h create mode 100644 src/fo4londonmoddatachecker.h create mode 100644 src/fo4londonmoddatacontent.h create mode 100644 src/fo4londonsavegame.cpp create mode 100644 src/fo4londonsavegame.h create mode 100644 src/fo4londonscriptextender.cpp create mode 100644 src/fo4londonscriptextender.h create mode 100644 src/fo4londonunmanagedmods.cpp create mode 100644 src/fo4londonunmanagedmods.h create mode 100644 src/game_fo4london_en.ts create mode 100644 src/gamefo4london.cpp create mode 100644 src/gamefo4london.h create mode 100644 src/gamefo4london.json create mode 100644 src/gamefo4london.pro create mode 100644 src/splash.png diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..6098e1f --- /dev/null +++ b/.clang-format @@ -0,0 +1,41 @@ +--- +# We'll use defaults from the LLVM style, but with 4 columns indentation. +BasedOnStyle: LLVM +IndentWidth: 2 +--- +Language: Cpp +DeriveLineEnding: false +UseCRLF: true +DerivePointerAlignment: false +PointerAlignment: Left +AlignConsecutiveAssignments: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: Empty +AlwaysBreakTemplateDeclarations: Yes +AccessModifierOffset: -2 +AlignTrailingComments: true +SpacesBeforeTrailingComments: 2 +NamespaceIndentation: Inner +MaxEmptyLinesToKeep: 1 +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +ColumnLimit: 88 +ForEachMacros: ['Q_FOREACH', 'foreach'] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f869712 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.cpp text eol=crlf +*.h text eol=crlf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..f84cac7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,16 @@ +name: Build Fallout 4 London Plugin + +on: + push: + branches: master + pull_request: + types: [opened, synchronize, reopened] + +jobs: + build: + runs-on: windows-2022 + steps: + - name: Build Fallout 4 London Plugin + uses: ModOrganizer2/build-with-mob-action@master + with: + mo2-dependencies: cmake_common uibase game_gamebryo diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..dce7309 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,16 @@ +name: Lint Fallout 4 London Plugin + +on: + push: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check format + uses: ModOrganizer2/check-formatting-action@master + with: + check-path: "." diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf71be7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +edit +CMakeLists.txt.user +/msbuild.log +/*std*.log +/*build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..31c1c8d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.16) + +if(DEFINED DEPENDENCIES_DIR) + include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/mo2.cmake) +else() + include(${CMAKE_CURRENT_LIST_DIR}/cmake_common/mo2.cmake) +endif() + +project(game_fallout4london) +add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..6730e1d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.16) + +add_library(game_fallout4london SHARED) +mo2_configure_plugin(game_fallout4london + WARNINGS OFF + PRIVATE_DEPENDS creation) +mo2_install_target(game_fallout4london) diff --git a/src/SConscript b/src/SConscript new file mode 100644 index 0000000..696562d --- /dev/null +++ b/src/SConscript @@ -0,0 +1,14 @@ +Import('qt_env') + +env = qt_env.Clone() + +# Shouldn't this be GAMEFALLOUT3_LIBRARY +env.AppendUnique(CPPDEFINES = [ 'GAMEFALLOUT4_LIBRARY' ]) + +env.RequiresGamebryo() + +lib = env.SharedLibrary('gameFallout4London', env.Glob('*.cpp')) +env.InstallModule(lib) + +res = env['QT_USED_MODULES'] +Return('res') diff --git a/src/fo4london.qrc b/src/fo4london.qrc new file mode 100644 index 0000000..8f7bb2b --- /dev/null +++ b/src/fo4london.qrc @@ -0,0 +1,5 @@ + + + splash.png + + diff --git a/src/fo4londonbsainvalidation.cpp b/src/fo4londonbsainvalidation.cpp new file mode 100644 index 0000000..32e58d5 --- /dev/null +++ b/src/fo4londonbsainvalidation.cpp @@ -0,0 +1,68 @@ +#include "fallout4bsainvalidation.h" + +#include "dummybsa.h" +#include "iplugingame.h" +#include "iprofile.h" +#include "registry.h" +#include +#include + +Fallout4LondonBSAInvalidation::Fallout4LondonBSAInvalidation(MOBase::DataArchives* dataArchives, + MOBase::IPluginGame const* game) + : GamebryoBSAInvalidation(dataArchives, "Fallout4Custom.ini", game) +{ + m_IniFileName = "Fallout4Custom.ini"; + m_Game = game; +} + +bool Fallout4LondonBSAInvalidation::isInvalidationBSA(const QString& bsaName) +{ + return false; +} + +QString Fallout4LondonBSAInvalidation::invalidationBSAName() const +{ + return ""; +} + +unsigned long Fallout4LondonBSAInvalidation::bsaVersion() const +{ + return 0x68; +} + +bool Fallout4LondonBSAInvalidation::prepareProfile(MOBase::IProfile* profile) +{ + bool dirty = false; + QString basePath = profile->localSettingsEnabled() + ? profile->absolutePath() + : m_Game->documentsDirectory().absolutePath(); + QString iniFilePath = basePath + "/" + m_IniFileName; + WCHAR setting[MAX_PATH]; + + if (profile->invalidationActive(nullptr)) { + // write bInvalidateOlderFiles = 1, if needed + if (!::GetPrivateProfileStringW(L"Archive", L"bInvalidateOlderFiles", L"0", setting, + MAX_PATH, iniFilePath.toStdWString().c_str()) || + wcstol(setting, nullptr, 10) != 1) { + dirty = true; + if (!MOBase::WriteRegistryValue(L"Archive", L"bInvalidateOlderFiles", L"1", + iniFilePath.toStdWString().c_str())) { + qWarning("failed to override data directory in \"%s\"", + qUtf8Printable(m_IniFileName)); + } + } + if (!::GetPrivateProfileStringW(L"Archive", L"sResourceDataDirsFinal", L"STRINGS\\", + setting, MAX_PATH, + iniFilePath.toStdWString().c_str()) || + wcscmp(setting, L"") != 0) { + dirty = true; + if (!MOBase::WriteRegistryValue(L"Archive", L"sResourceDataDirsFinal", L"", + iniFilePath.toStdWString().c_str())) { + qWarning("failed to override data directory in \"%s\"", + qUtf8Printable(m_IniFileName)); + } + } + } + + return dirty; +} diff --git a/src/fo4londonbsainvalidation.h b/src/fo4londonbsainvalidation.h new file mode 100644 index 0000000..fc5d319 --- /dev/null +++ b/src/fo4londonbsainvalidation.h @@ -0,0 +1,33 @@ +#ifndef FALLOUT4BSAINVALIDATION_H +#define FALLOUT4BSAINVALIDATION_H + +#include "fallout4dataarchives.h" +#include "gamebryobsainvalidation.h" +#include +#include + +#include + +namespace MOBase +{ +class IPluginGame; +} + +class Fallout4LondonBSAInvalidation : public GamebryoBSAInvalidation +{ +public: + Fallout4LondonBSAInvalidation(MOBase::DataArchives* dataArchives, + MOBase::IPluginGame const* game); + virtual bool isInvalidationBSA(const QString& bsaName) override; + virtual bool prepareProfile(MOBase::IProfile* profile) override; + +private: + virtual QString invalidationBSAName() const override; + virtual unsigned long bsaVersion() const override; + +private: + QString m_IniFileName; + MOBase::IPluginGame const* m_Game; +}; + +#endif // FALLOUT4BSAINVALIDATION_H diff --git a/src/fo4londondataarchives.cpp b/src/fo4londondataarchives.cpp new file mode 100644 index 0000000..9320f26 --- /dev/null +++ b/src/fo4londondataarchives.cpp @@ -0,0 +1,48 @@ +#include "fallout4dataarchives.h" + +#include "iprofile.h" +#include + +QStringList Fallout4LondonDataArchives::vanillaArchives() const +{ + return {"Fallout4 - Textures1.ba2", "Fallout4 - Textures2.ba2", + "Fallout4 - Textures3.ba2", "Fallout4 - Textures4.ba2", + "Fallout4 - Textures5.ba2", "Fallout4 - Textures6.ba2", + "Fallout4 - Textures7.ba2", "Fallout4 - Textures8.ba2", + "Fallout4 - Textures9.ba2", "Fallout4 - Meshes.ba2", + "Fallout4 - MeshesExtra.ba2", "Fallout4 - Voices.ba2", + "Fallout4 - Sounds.ba2", "Fallout4 - Interface.ba2", + "Fallout4 - Animations.ba2", "Fallout4 - Materials.ba2", + "Fallout4 - Shaders.ba2", "Fallout4 - Startup.ba2", + "Fallout4 - Misc.ba2"}; +} + +QStringList Fallout4LondonDataArchives::archives(const MOBase::IProfile* profile) const +{ + QStringList result; + + QString iniFile = profile->localSettingsEnabled() + ? QDir(profile->absolutePath()).absoluteFilePath("fallout4.ini") + : localGameDirectory().absoluteFilePath("fallout4.ini"); + result.append(getArchivesFromKey(iniFile, "SResourceArchiveList")); + result.append(getArchivesFromKey(iniFile, "SResourceArchiveList2")); + + return result; +} + +void Fallout4LondonDataArchives::writeArchiveList(MOBase::IProfile* profile, + const QStringList& before) +{ + QString list = before.join(", "); + + QString iniFile = profile->localSettingsEnabled() + ? QDir(profile->absolutePath()).absoluteFilePath("fallout4.ini") + : localGameDirectory().absoluteFilePath("fallout4.ini"); + if (list.length() > 255) { + int splitIdx = list.lastIndexOf(",", 256); + setArchivesToKey(iniFile, "SResourceArchiveList", list.mid(0, splitIdx)); + setArchivesToKey(iniFile, "SResourceArchiveList2", list.mid(splitIdx + 2)); + } else { + setArchivesToKey(iniFile, "SResourceArchiveList", list); + } +} diff --git a/src/fo4londondataarchives.h b/src/fo4londondataarchives.h new file mode 100644 index 0000000..a9d0ef9 --- /dev/null +++ b/src/fo4londondataarchives.h @@ -0,0 +1,27 @@ +#ifndef FALLOUT4DATAARCHIVES_H +#define FALLOUT4DATAARCHIVES_H + +#include "gamebryodataarchives.h" + +namespace MOBase +{ +class IProfile; +} + +#include +#include + +class Fallout4LondonDataArchives : public GamebryoDataArchives +{ +public: + using GamebryoDataArchives::GamebryoDataArchives; + + virtual QStringList vanillaArchives() const override; + virtual QStringList archives(const MOBase::IProfile* profile) const override; + +private: + virtual void writeArchiveList(MOBase::IProfile* profile, + const QStringList& before) override; +}; + +#endif // FALLOUT4DATAARCHIVES_H diff --git a/src/fo4londonmoddatachecker.h b/src/fo4londonmoddatachecker.h new file mode 100644 index 0000000..4a65789 --- /dev/null +++ b/src/fo4londonmoddatachecker.h @@ -0,0 +1,29 @@ +#ifndef FALLOUT4_MODATACHECKER_H +#define FALLOUT4_MODATACHECKER_H + +#include + +class Fallout4LondonModDataChecker : public GamebryoModDataChecker +{ +public: + using GamebryoModDataChecker::GamebryoModDataChecker; + +protected: + virtual const FileNameSet& possibleFolderNames() const override + { + static FileNameSet result{ + "interface", "meshes", "music", "scripts", "sound", "strings", + "textures", "trees", "video", "materials", "f4se", "distantlod", + "asi", "Tools", "MCM", "distantland", "mits", "dllplugins", + "CalienteTools", "shadersfx", "aaf"}; + return result; + } + virtual const FileNameSet& possibleFileExtensions() const override + { + static FileNameSet result{"esp", "esm", "esl", "ba2", + "modgroups", "ini", "csg", "cdx"}; + return result; + } +}; + +#endif // FALLOUT4_MODATACHECKER_H diff --git a/src/fo4londonmoddatacontent.h b/src/fo4londonmoddatacontent.h new file mode 100644 index 0000000..b1938ba --- /dev/null +++ b/src/fo4londonmoddatacontent.h @@ -0,0 +1,44 @@ +#ifndef FALLOUT4_MODDATACONTENT_H +#define FALLOUT4_MODDATACONTENT_H + +#include +#include + +class Fallout4LondonModDataContent : public GamebryoModDataContent +{ +protected: + enum Fallout4LondonContent + { + CONTENT_MATERIAL = CONTENT_NEXT_VALUE + }; + +public: + Fallout4LondonModDataContent(const MOBase::IGameFeatures* gameFeatures) + : GamebryoModDataContent(gameFeatures) + { + m_Enabled[CONTENT_SKYPROC] = false; + } + + std::vector getAllContents() const override + { + auto contents = GamebryoModDataContent::getAllContents(); + contents.push_back( + Content(CONTENT_MATERIAL, "Materials", ":/MO/gui/content/material")); + return contents; + } + + std::vector + getContentsFor(std::shared_ptr fileTree) const override + { + auto contents = GamebryoModDataContent::getContentsFor(fileTree); + for (auto e : *fileTree) { + if (e->compare("materials") == 0) { + contents.push_back(CONTENT_MATERIAL); + break; // Early break if you have nothing else to check. + } + } + return contents; + } +}; + +#endif // FALLOUT4_MODDATACONTENT_H diff --git a/src/fo4londonsavegame.cpp b/src/fo4londonsavegame.cpp new file mode 100644 index 0000000..bb8d833 --- /dev/null +++ b/src/fo4londonsavegame.cpp @@ -0,0 +1,79 @@ +#include "fallout4savegame.h" + +#include + +#include "gamefallout4.h" + +Fallout4LondonSaveGame::Fallout4LondonSaveGame(QString const& fileName, GameFallout4London const* game) + : GamebryoSaveGame(fileName, game, true) +{ + FileWrapper file(getFilepath(), "FO4_SAVEGAME"); + + FILETIME creationTime; + fetchInformationFields(file, m_SaveNumber, m_PCName, m_PCLevel, m_PCLocation, + creationTime); + + // A file time is a 64-bit value that represents the number of 100-nanosecond + // intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal + // Time (UTC). So we need to convert that to something useful + SYSTEMTIME ctime; + ::FileTimeToSystemTime(&creationTime, &ctime); + + setCreationTime(ctime); +} + +void Fallout4LondonSaveGame::fetchInformationFields( + FileWrapper& file, unsigned long& saveNumber, QString& playerName, + unsigned short& playerLevel, QString& playerLocation, FILETIME& creationTime) const +{ + file.skip(); // header size + file.skip(); // header version + file.read(saveNumber); + + file.read(playerName); + + unsigned long temp; + file.read(temp); + playerLevel = static_cast(temp); + file.read(playerLocation); + + QString ignore; + file.read(ignore); // playtime as ascii hh.mm.ss + file.read(ignore); // race name (i.e. BretonRace) + + file.skip(); // Player gender (0 = male) + file.skip(2); // experience gathered, experience required + + file.read(creationTime); +} + +std::unique_ptr Fallout4LondonSaveGame::fetchDataFields() const +{ + FileWrapper file(getFilepath(), "FO4_SAVEGAME"); // 10bytes + + { + QString dummyName, dummyLocation; + unsigned short dummyLevel; + unsigned long dummySaveNumber; + FILETIME dummyTime; + + fetchInformationFields(file, dummySaveNumber, dummyName, dummyLevel, dummyLocation, + dummyTime); + } + + QString ignore; + std::unique_ptr fields = std::make_unique(); + + fields->Screenshot = file.readImage(384, true); + + uint8_t saveGameVersion = file.readChar(); + file.read(ignore); // game version + file.skip(); // plugin info size + + fields->Plugins = file.readPlugins(); + if (saveGameVersion >= 68) { + fields->LightPlugins = file.readLightPlugins(); + } + + return fields; +} diff --git a/src/fo4londonsavegame.h b/src/fo4londonsavegame.h new file mode 100644 index 0000000..8b00d33 --- /dev/null +++ b/src/fo4londonsavegame.h @@ -0,0 +1,24 @@ +#ifndef FALLOUT4SAVEGAME_H +#define FALLOUT4SAVEGAME_H + +#include "gamebryosavegame.h" + +#include + +class GameFallout4London; + +class Fallout4LondonSaveGame : public GamebryoSaveGame +{ +public: + Fallout4LondonSaveGame(QString const& fileName, GameFallout4London const* game); + +protected: + // Fetch easy-to-access information. + void fetchInformationFields(FileWrapper& file, unsigned long& saveNumber, + QString& playerName, unsigned short& playerLevel, + QString& playerLocation, FILETIME& creationTime) const; + + std::unique_ptr fetchDataFields() const override; +}; + +#endif // FALLOUT4SAVEGAME_H diff --git a/src/fo4londonscriptextender.cpp b/src/fo4londonscriptextender.cpp new file mode 100644 index 0000000..6658d4e --- /dev/null +++ b/src/fo4londonscriptextender.cpp @@ -0,0 +1,18 @@ +#include "fallout4scriptextender.h" + +#include +#include + +Fallout4LondonScriptExtender::Fallout4LondonScriptExtender(GameGamebryo const* game) + : GamebryoScriptExtender(game) +{} + +QString Fallout4LondonScriptExtender::BinaryName() const +{ + return "f4se_loader.exe"; +} + +QString Fallout4LondonScriptExtender::PluginPath() const +{ + return "f4se/plugins"; +} diff --git a/src/fo4londonscriptextender.h b/src/fo4londonscriptextender.h new file mode 100644 index 0000000..c6e462b --- /dev/null +++ b/src/fo4londonscriptextender.h @@ -0,0 +1,17 @@ +#ifndef FALLOUT4SCRIPTEXTENDER_H +#define FALLOUT4SCRIPTEXTENDER_H + +#include "gamebryoscriptextender.h" + +class GameGamebryo; + +class Fallout4LondonScriptExtender : public GamebryoScriptExtender +{ +public: + Fallout4LondonScriptExtender(GameGamebryo const* game); + + virtual QString BinaryName() const override; + virtual QString PluginPath() const override; +}; + +#endif // FALLOUT4SCRIPTEXTENDER_H diff --git a/src/fo4londonunmanagedmods.cpp b/src/fo4londonunmanagedmods.cpp new file mode 100644 index 0000000..42392ab --- /dev/null +++ b/src/fo4londonunmanagedmods.cpp @@ -0,0 +1,63 @@ +#include "fallout4unmanagedmods.h" + +Fallout4LondonUnmangedMods::Fallout4LondonUnmangedMods(const GameGamebryo* game) + : GamebryoUnmangedMods(game) +{} + +Fallout4LondonUnmangedMods::~Fallout4LondonUnmangedMods() {} + +QStringList Fallout4LondonUnmangedMods::mods(bool onlyOfficial) const +{ + QStringList result; + + QStringList pluginList = game()->primaryPlugins(); + QStringList otherPlugins = game()->DLCPlugins(); + otherPlugins.append(game()->CCPlugins()); + for (QString plugin : otherPlugins) { + pluginList.removeAll(plugin); + } + QDir dataDir(game()->dataDirectory()); + for (const QString& fileName : dataDir.entryList({"*.esp", "*.esl", "*.esm"})) { + if (!pluginList.contains(fileName, Qt::CaseInsensitive)) { + if (!onlyOfficial || pluginList.contains(fileName, Qt::CaseInsensitive)) { + result.append(fileName.chopped(4)); // trims the extension off + } + } + } + + return result; +} + +QStringList Fallout4LondonUnmangedMods::secondaryFiles(const QString& modName) const +{ + // file extension in FO4 is .ba2 instead of bsa + QStringList archives; + QDir dataDir = game()->dataDirectory(); + for (const QString& archiveName : dataDir.entryList({modName + "*.ba2"})) { + archives.append(dataDir.absoluteFilePath(archiveName)); + } + return archives; +} + +QString Fallout4LondonUnmangedMods::displayName(const QString& modName) const +{ + // unlike in earlier games, in fallout 4 the file name doesn't correspond to + // the public name + if (modName.compare("dlcrobot", Qt::CaseInsensitive) == 0) { + return "Automatron"; + } else if (modName.compare("dlcworkshop01", Qt::CaseInsensitive) == 0) { + return "Wasteland Workshop"; + } else if (modName.compare("dlccoast", Qt::CaseInsensitive) == 0) { + return "Far Harbor"; + } else if (modName.compare("dlcworkshop02", Qt::CaseInsensitive) == 0) { + return "Contraptions Workshop"; + } else if (modName.compare("dlcworkshop03", Qt::CaseInsensitive) == 0) { + return "Vault-Tec Workshop"; + } else if (modName.compare("dlcnukaworld", Qt::CaseInsensitive) == 0) { + return "Nuka-World"; + } else if (modName.compare("dlcultrahighresolution", Qt::CaseInsensitive) == 0) { + return "Ultra High Resolution Texture Pack"; + } else { + return modName; + } +} diff --git a/src/fo4londonunmanagedmods.h b/src/fo4londonunmanagedmods.h new file mode 100644 index 0000000..55568c9 --- /dev/null +++ b/src/fo4londonunmanagedmods.h @@ -0,0 +1,18 @@ +#ifndef FALLOUT4UNMANAGEDMODS_H +#define FALLOUT4UNMANAGEDMODS_H + +#include "gamebryounmanagedmods.h" +#include + +class Fallout4LondonUnmangedMods : public GamebryoUnmangedMods +{ +public: + Fallout4LondonUnmangedMods(const GameGamebryo* game); + ~Fallout4LondonUnmangedMods(); + + virtual QStringList mods(bool onlyOfficial) const override; + virtual QStringList secondaryFiles(const QString& modName) const override; + virtual QString displayName(const QString& modName) const override; +}; + +#endif // FALLOUT4UNMANAGEDMODS_H diff --git a/src/game_fo4london_en.ts b/src/game_fo4london_en.ts new file mode 100644 index 0000000..51ac151 --- /dev/null +++ b/src/game_fo4london_en.ts @@ -0,0 +1,28 @@ + + + + + GameFallout4London + + + Fallout 4 Support Plugin + + + + + Adds support for the game Fallout 4. +Splash by %1 + + + + + sTestFile entries are present + + + + + <p>You have sTestFile settings in your Fallout4Custom.ini. These must be removed or the game will not read the plugins.txt file. Management is disabled.</p> + + + + diff --git a/src/gamefo4london.cpp b/src/gamefo4london.cpp new file mode 100644 index 0000000..c50a40c --- /dev/null +++ b/src/gamefo4london.cpp @@ -0,0 +1,335 @@ +#include "gameFallout4London.h" + +#include "fallout4bsainvalidation.h" +#include "fallout4dataarchives.h" +#include "fallout4moddatachecker.h" +#include "fallout4moddatacontent.h" +#include "fallout4savegame.h" +#include "fallout4scriptextender.h" +#include "fallout4unmanagedmods.h" + +#include "versioninfo.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "scopeguard.h" + +using namespace MOBase; + +GameFallout4London::GameFallout4London() {} + +bool GameFallout4London::init(IOrganizer* moInfo) +{ + if (!GameGamebryo::init(moInfo)) { + return false; + } + + auto dataArchives = std::make_shared(this); + + registerFeature(std::make_shared(this)); + registerFeature(dataArchives); + registerFeature(std::make_shared(this, "fallout4custom.ini")); + registerFeature(std::make_shared(this)); + registerFeature( + std::make_shared(m_Organizer->gameFeatures())); + registerFeature(std::make_shared(this)); + registerFeature(std::make_shared(moInfo)); + registerFeature(std::make_shared(this)); + registerFeature(std::make_shared(dataArchives.get(), this)); + + return true; +} + +QString GameFallout4London::gameName() const +{ + return "Fallout 4"; +} + +void GameFallout4London::detectGame() +{ + m_GamePath = identifyGamePath(); + m_MyGamesPath = determineMyGamesPath("Fallout4London"); +} + +QList GameFallout4London::executables() const +{ + return QList() + << ExecutableInfo("F4SE", + findInGameFolder(m_Organizer->gameFeatures() + ->gameFeature() + ->loaderName())) + << ExecutableInfo("Fallout 4", findInGameFolder(binaryName())) + << ExecutableInfo("Fallout Launcher", findInGameFolder(getLauncherName())) + << ExecutableInfo("Creation Kit", findInGameFolder("CreationKit.exe")) + .withSteamAppId("1946160") + << ExecutableInfo("LOOT", QFileInfo(getLootPath())) + .withArgument("--game=\"Fallout4\""); +} + +QList GameFallout4London::executableForcedLoads() const +{ + return QList(); +} + +QString GameFallout4London::name() const +{ + return "Fallout 4 Support Plugin"; +} + +QString GameFallout4London::localizedName() const +{ + return tr("Fallout 4 Support Plugin"); +} + +QString GameFallout4London::author() const +{ + return "Tannin & MO2 Team"; +} + +QString GameFallout4London::description() const +{ + return tr("Adds support for the game Fallout 4.\n" + "Splash by %1") + .arg("nekoyoubi"); +} + +MOBase::VersionInfo GameFallout4London::version() const +{ + return VersionInfo(1, 8, 0, VersionInfo::RELEASE_FINAL); +} + +QList GameFallout4London::settings() const +{ + return QList(); +} + +MappingType GameFallout4London::mappings() const +{ + MappingType result; + if (testFilePlugins().isEmpty()) { + for (const QString& profileFile : {"plugins.txt", "loadorder.txt"}) { + result.push_back({m_Organizer->profilePath() + "/" + profileFile, + localAppFolder() + "/" + gameShortName() + "/" + profileFile, + false}); + } + } + return result; +} + +void GameFallout4London::initializeProfile(const QDir& path, ProfileSettings settings) const +{ + if (settings.testFlag(IPluginGame::MODS)) { + copyToProfile(localAppFolder() + "/Fallout4", path, "plugins.txt"); + } + + if (settings.testFlag(IPluginGame::CONFIGURATION)) { + if (settings.testFlag(IPluginGame::PREFER_DEFAULTS) || + !QFileInfo(myGamesPath() + "/fallout4.ini").exists()) { + copyToProfile(gameDirectory().absolutePath(), path, "fallout4_default.ini", + "fallout4.ini"); + } else { + copyToProfile(myGamesPath(), path, "fallout4.ini"); + } + + copyToProfile(myGamesPath(), path, "fallout4prefs.ini"); + copyToProfile(myGamesPath(), path, "fallout4custom.ini"); + } +} + +QString GameFallout4London::savegameExtension() const +{ + return "fos"; +} + +QString GameFallout4London::savegameSEExtension() const +{ + return "f4se"; +} + +std::shared_ptr +GameFallout4London::makeSaveGame(QString filePath) const +{ + return std::make_shared(filePath, this); +} + +QString GameFallout4London::steamAPPId() const +{ + return "377160"; +} + +QStringList GameFallout4::testFilePlugins() const +{ + QStringList plugins; + if (m_Organizer != nullptr && m_Organizer->profile() != nullptr) { + QString customIni( + m_Organizer->profile()->absoluteIniFilePath("Fallout4Custom.ini")); + if (QFile(customIni).exists()) { + for (int i = 1; i <= 10; ++i) { + QString setting("sTestFile"); + setting += std::to_string(i); + WCHAR value[MAX_PATH]; + DWORD length = ::GetPrivateProfileStringW( + L"General", setting.toStdWString().c_str(), L"", value, MAX_PATH, + customIni.toStdWString().c_str()); + if (length && wcscmp(value, L"") != 0) { + QString plugin = QString::fromWCharArray(value, length); + if (!plugin.isEmpty() && !plugins.contains(plugin)) + plugins.append(plugin); + } + } + } + } + return plugins; +} + +QStringList GameFallout4::primaryPlugins() const +{ + QStringList plugins = {"fallout4.esm", "dlcrobot.esm", + "dlcworkshop01.esm", "dlccoast.esm", + "dlcworkshop02.esm", "dlcworkshop03.esm", + "dlcnukaworld.esm", "dlcultrahighresolution.esm"}; + + auto testPlugins = testFilePlugins(); + if (loadOrderMechanism() == LoadOrderMechanism::None) { + plugins << testPlugins; + } else { + plugins << CCPlugins(); + } + + return plugins; +} + +QStringList GameFallout4::gameVariants() const +{ + return {"Regular"}; +} + +QString GameFallout4::gameShortName() const +{ + return "Fallout4"; +} + +QString GameFallout4::gameNexusName() const +{ + return "fallout4"; +} + +QStringList GameFallout4::iniFiles() const +{ + return {"fallout4.ini", "fallout4prefs.ini", "fallout4custom.ini"}; +} + +QStringList GameFallout4::DLCPlugins() const +{ + return {"dlcrobot.esm", + "dlcworkshop01.esm", + "dlccoast.esm", + "dlcworkshop02.esm", + "dlcworkshop03.esm", + "dlcnukaworld.esm", + "dlcultrahighresolution.esm"}; +} + +QStringList GameFallout4::CCPlugins() const +{ + QStringList plugins = {}; + QFile file(gameDirectory().absoluteFilePath("Fallout4.ccc")); + if (file.open(QIODevice::ReadOnly)) { + ON_BLOCK_EXIT([&file]() { + file.close(); + }); + + if (file.size() == 0) { + return plugins; + } + while (!file.atEnd()) { + QByteArray line = file.readLine().trimmed(); + QString modName; + if ((line.size() > 0) && (line.at(0) != '#')) { + modName = QString::fromUtf8(line.constData()).toLower(); + } + + if (modName.size() > 0) { + if (!plugins.contains(modName, Qt::CaseInsensitive)) { + plugins.append(modName); + } + } + } + } + return plugins; +} + +IPluginGame::SortMechanism GameFallout4::sortMechanism() const +{ + if (!testFilePresent()) + return IPluginGame::SortMechanism::LOOT; + return IPluginGame::SortMechanism::NONE; +} + +IPluginGame::LoadOrderMechanism GameFallout4::loadOrderMechanism() const +{ + if (!testFilePresent()) + return IPluginGame::LoadOrderMechanism::PluginsTxt; + return IPluginGame::LoadOrderMechanism::None; +} + +int GameFallout4::nexusModOrganizerID() const +{ + return 28715; +} + +int GameFallout4::nexusGameID() const +{ + return 1151; +} + +// Start Diagnose +std::vector GameFallout4::activeProblems() const +{ + std::vector result; + if (m_Organizer->managedGame() == this) { + if (testFilePresent()) + result.push_back(PROBLEM_TEST_FILE); + } + return result; +} + +bool GameFallout4::testFilePresent() const +{ + if (!testFilePlugins().isEmpty()) + return true; + return false; +} + +QString GameFallout4::shortDescription(unsigned int key) const +{ + switch (key) { + case PROBLEM_TEST_FILE: + return tr("sTestFile entries are present"); + } +} + +QString GameFallout4::fullDescription(unsigned int key) const +{ + switch (key) { + case PROBLEM_TEST_FILE: { + return tr("

You have sTestFile settings in your " + "Fallout4Custom.ini. These must be removed or " + "the game will not read the plugins.txt file. " + "Management is disabled.

"); + } + } +} diff --git a/src/gamefo4london.h b/src/gamefo4london.h new file mode 100644 index 0000000..1c0856b --- /dev/null +++ b/src/gamefo4london.h @@ -0,0 +1,73 @@ +#ifndef GAMEFALLOUT4_H +#define GAMEFALLOUT4_H + +#include "gamegamebryo.h" +#include "iplugindiagnose.h" + +#include +#include + +class GameFallout4London : public GameGamebryo, public MOBase::IPluginDiagnose +{ + Q_OBJECT + Q_INTERFACES(MOBase::IPlugin MOBase::IPluginGame MOBase::IPluginDiagnose) + Q_PLUGIN_METADATA(IID "org.tannin.GameFallout4London" FILE "gamefallout4.json") + +public: + GameFallout4London(); + + virtual bool init(MOBase::IOrganizer* moInfo) override; + +public: + QStringList testFilePlugins() const; + +public: // IPluginGame interface + virtual QString gameName() const override; + virtual void detectGame() override; + virtual QList executables() const override; + virtual QList + executableForcedLoads() const override; + virtual void initializeProfile(const QDir& path, + ProfileSettings settings) const override; + virtual QString steamAPPId() const override; + virtual QStringList primaryPlugins() const override; + virtual QStringList gameVariants() const override; + virtual QString gameShortName() const override; + virtual QString gameNexusName() const override; + virtual QStringList iniFiles() const override; + virtual QStringList DLCPlugins() const override; + virtual QStringList CCPlugins() const override; + virtual SortMechanism sortMechanism() const override; + virtual LoadOrderMechanism loadOrderMechanism() const override; + virtual int nexusModOrganizerID() const override; + virtual int nexusGameID() const override; + +public: // IPluginDiagnose interface + virtual std::vector activeProblems() const override; + virtual QString shortDescription(unsigned int key) const override; + virtual QString fullDescription(unsigned int key) const override; + virtual bool hasGuidedFix(unsigned int key) const override { return false; } + virtual void startGuidedFix(unsigned int key) const override {} + +public: // IPlugin interface + virtual QString name() const override; + virtual QString localizedName() const override; + virtual QString author() const override; + virtual QString description() const override; + virtual MOBase::VersionInfo version() const override; + virtual QList settings() const override; + virtual MappingType mappings() const override; + +protected: + std::shared_ptr makeSaveGame(QString filePath) const override; + QString savegameExtension() const override; + QString savegameSEExtension() const override; + +private: + bool testFilePresent() const; + +private: + static const unsigned int PROBLEM_TEST_FILE = 1; +}; + +#endif // GAMEFallout4London_H diff --git a/src/gamefo4london.json b/src/gamefo4london.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/gamefo4london.json @@ -0,0 +1 @@ +{} diff --git a/src/gamefo4london.pro b/src/gamefo4london.pro new file mode 100644 index 0000000..f78bc45 --- /dev/null +++ b/src/gamefo4london.pro @@ -0,0 +1,50 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2014-11-15T15:36:33 +# +#------------------------------------------------- + + +TARGET = gameFallout3 +TEMPLATE = lib + +CONFIG += plugins +CONFIG += dll + +DEFINES += GAMEFALLOUT4_LIBRARY + +SOURCES += gamefallout4.cpp \ + fallout4bsainvalidation.cpp \ + fallout4scriptextender.cpp \ + fallout4dataarchives.cpp \ + fallout4savegame.cpp \ + fallout4savegameinfo.cpp + +HEADERS += gamefallout4.h \ + fallout4bsainvalidation.h \ + fallout4scriptextender.h \ + fallout4dataarchives.h \ + fallout4savegame.h \ + fallout4savegameinfo.h + +CONFIG(debug, debug|release) { + LIBS += -L"$${OUT_PWD}/../gameGamebryo/debug" + PRE_TARGETDEPS += \ + $$OUT_PWD/../gameGamebryo/debug/gameGamebryo.lib +} else { + LIBS += -L"$${OUT_PWD}/../gameGamebryo/release" + PRE_TARGETDEPS += \ + $$OUT_PWD/../gameGamebryo/release/gameGamebryo.lib +} + +include(../plugin_template.pri) + +INCLUDEPATH += "$${BOOSTPATH}" "$${PWD}/../gamefeatures" "$${PWD}/../gamegamebryo" + +LIBS += -ladvapi32 -lole32 -lgameGamebryo + +OTHER_FILES += \ + gamefallout4.json\ + SConscript \ + CMakeLists.txt + diff --git a/src/splash.png b/src/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..d612e7b86367b35b49a4d682bb8e7abd086f3f5e GIT binary patch literal 52981 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 Ad;kCd literal 0 HcmV?d00001