From 9013cb2c815d6d0d29696df867b3cdc2739b64d8 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Thu, 27 Oct 2016 12:40:44 +0100 Subject: [PATCH] Add support for Skyrim Special Edition --- CMakeLists.txt | 2 +- README.md | 2 +- docs/app/introduction.rst | 2 +- include/loot/enum/game_type.h | 4 +++- src/backend/app/loot_settings.cpp | 4 ++++ src/backend/game/game.cpp | 4 ---- src/backend/game/game_settings.cpp | 8 +++++++- src/backend/game/game_settings.h | 2 ++ src/backend/game/load_order_handler.cpp | 10 ++-------- src/gui/html/css/style.css | 1 + src/gui/html/elements/loot-dropdown-menu.html | 2 ++ src/gui/html/index.html | 2 +- src/gui/query/get_game_types_query.h | 1 + src/gui/query/sort_plugins_query.h | 4 +++- src/tests/api/create_database_test.h | 3 ++- src/tests/api/database_interface_test.h | 3 ++- src/tests/backend/app/loot_settings_test.h | 2 ++ src/tests/backend/game/game_test.h | 3 ++- src/tests/backend/game/load_order_handler_test.h | 5 +++-- src/tests/backend/masterlist_test.h | 3 ++- src/tests/backend/metadata/condition_grammar_test.h | 3 ++- src/tests/backend/metadata/conditional_metadata_test.h | 3 ++- src/tests/backend/plugin/plugin_test.h | 3 ++- src/tests/common_game_test_fixture.h | 9 +++++---- 24 files changed, 53 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ba6dace..b2edaef5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ set(LIBGIT2_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_ ExternalProject_Add(libloadorder PREFIX "external" DEPENDS libespm - URL "https://github.com/WrinklyNinja/libloadorder/archive/9.4.1.tar.gz" + URL "https://github.com/WrinklyNinja/libloadorder/archive/9.5.0.tar.gz" CMAKE_ARGS -DBOOST_INCLUDEDIR=${Boost_INCLUDE_DIR} -DMSVC_STATIC_RUNTIME=${MSVC_STATIC_RUNTIME} BUILD_COMMAND ${CMAKE_COMMAND} --build . --target loadorder --config $(CONFIGURATION) INSTALL_COMMAND "") diff --git a/README.md b/README.md index b93b913b..7ea0d132 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## Introduction -LOOT is a plugin load order optimisation tool for TES IV: Oblivion, TES V: Skyrim, Fallout 3, Fallout: New Vegas and Fallout 4. It is designed to assist mod users in avoiding detrimental conflicts, by automatically calculating a load order that satisfies all plugin dependencies and maximises each plugin's impact on the user's game. +LOOT is a plugin load order optimisation tool for TES IV: Oblivion, TES V: Skyrim, TES V: Skyrim Special Edition, Fallout 3, Fallout: New Vegas and Fallout 4. It is designed to assist mod users in avoiding detrimental conflicts, by automatically calculating a load order that satisfies all plugin dependencies and maximises each plugin's impact on the user's game. LOOT also provides some load order error checking, including checks for requirements, incompatibilities and cyclic dependencies. In addition, it provides a large number of plugin-specific usage notes, bug warnings and Bash Tag suggestions. diff --git a/docs/app/introduction.rst b/docs/app/introduction.rst index 79165380..1b146a68 100644 --- a/docs/app/introduction.rst +++ b/docs/app/introduction.rst @@ -2,7 +2,7 @@ Introduction ************ -LOOT is a plugin load order optimiser for TES IV: Oblivion, TES V: Skyrim, Fallout 3, Fallout: New Vegas and Fallout 4. It is designed to assist mod users in avoiding detrimental conflicts, by automatically calculating a load order that satisfies all plugin dependencies and maximises each plugin's impact on the user's game. +LOOT is a plugin load order optimiser for TES IV: Oblivion, TES V: Skyrim, TES V: Skyrim Special Edition, Fallout 3, Fallout: New Vegas and Fallout 4. It is designed to assist mod users in avoiding detrimental conflicts, by automatically calculating a load order that satisfies all plugin dependencies and maximises each plugin's impact on the user's game. LOOT also provides some load order error checking, including checks for requirements, incompatibilities and cyclic dependencies. In addition, it provides a large number of plugin-specific usage notes, bug warnings and Bash Tag suggestions for Wrye Bash. diff --git a/include/loot/enum/game_type.h b/include/loot/enum/game_type.h index cb456679..d90953d7 100644 --- a/include/loot/enum/game_type.h +++ b/include/loot/enum/game_type.h @@ -34,7 +34,7 @@ namespace loot { enum struct GameType : unsigned int { /** The Elder Scrolls IV: Oblivion */ tes4, - /** The Elder Scrolls IV: Skyrim */ + /** The Elder Scrolls V: Skyrim */ tes5, /** Fallout 3 */ fo3, @@ -42,6 +42,8 @@ enum struct GameType : unsigned int { fonv, /** Fallout 4 */ fo4, + /** The Elder Scrolls V: Skyrim Special Edition */ + tes5se, }; } diff --git a/src/backend/app/loot_settings.cpp b/src/backend/app/loot_settings.cpp index 77a17f3e..817dc583 100644 --- a/src/backend/app/loot_settings.cpp +++ b/src/backend/app/loot_settings.cpp @@ -41,6 +41,7 @@ LootSettings::LootSettings() : gameSettings_({ GameSettings(GameType::tes4), GameSettings(GameType::tes5), + GameSettings(GameType::tes5se), GameSettings(GameType::fo3), GameSettings(GameType::fonv), GameSettings(GameType::fo4), @@ -92,6 +93,9 @@ void LootSettings::load(YAML::Node& settings) { if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::tes5)) == end(gameSettings_)) gameSettings_.push_back(GameSettings(GameType::tes5)); + if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::tes5se)) == end(gameSettings_)) + gameSettings_.push_back(GameSettings(GameType::tes5se)); + if (find(begin(gameSettings_), end(gameSettings_), GameSettings(GameType::fo3)) == end(gameSettings_)) gameSettings_.push_back(GameSettings(GameType::fo3)); diff --git a/src/backend/game/game.cpp b/src/backend/game/game.cpp index 1355d7ee..4ffbda0e 100644 --- a/src/backend/game/game.cpp +++ b/src/backend/game/game.cpp @@ -57,10 +57,6 @@ Game::Game(const GameSettings& gameSettings) : GameSettings(gameSettings), plugi Game::Game(const GameType gameType, const std::string& folder) : GameSettings(gameType, folder), pluginsFullyLoaded_(false) {} void Game::Init(bool createFolder, const boost::filesystem::path& gameLocalAppData) { - if (Type() != GameType::tes4 && Type() != GameType::tes5 && Type() != GameType::fo3 && Type() != GameType::fonv && Type() != GameType::fo4) { - throw std::invalid_argument(translate("Invalid game ID supplied.").str()); - } - BOOST_LOG_TRIVIAL(info) << "Initialising filesystem-related data for game: " << Name(); if (!this->IsInstalled()) { diff --git a/src/backend/game/game_settings.cpp b/src/backend/game/game_settings.cpp index d65bdfc5..d8fa5e8e 100644 --- a/src/backend/game/game_settings.cpp +++ b/src/backend/game/game_settings.cpp @@ -55,6 +55,12 @@ GameSettings::GameSettings(const GameType gameCode, const std::string& folder) : lootFolderName_ = "Skyrim"; masterFile_ = "Skyrim.esm"; repositoryURL_ = "https://github.com/loot/skyrim.git"; + } else if (Type() == GameType::tes5se) { + name_ = "TES V: Skyrim Special Edition"; + registryKey_ = "Software\\Bethesda Softworks\\Skyrim Special Edition\\Installed Path"; + lootFolderName_ = "SkyrimSE"; + masterFile_ = "Skyrim.esm"; + repositoryURL_ = "https://github.com/loot/skyrimse.git"; } else if (Type() == GameType::fo3) { name_ = "Fallout 3"; registryKey_ = "Software\\Bethesda Softworks\\Fallout3\\Installed Path"; @@ -122,7 +128,7 @@ GameType GameSettings::Type() const { libespm::GameId GameSettings::LibespmId() const { if (type_ == GameType::tes4) return libespm::GameId::OBLIVION; - else if (type_ == GameType::tes5) + else if (type_ == GameType::tes5 || type_ == GameType::tes5se) return libespm::GameId::SKYRIM; else if (type_ == GameType::fo3) return libespm::GameId::FALLOUT3; diff --git a/src/backend/game/game_settings.h b/src/backend/game/game_settings.h index 87ccd5f0..b52eb928 100644 --- a/src/backend/game/game_settings.h +++ b/src/backend/game/game_settings.h @@ -118,6 +118,8 @@ struct convert { rhs = GameSettings(GameType::tes4, node["folder"].as()); else if (node["type"].as() == GameSettings(GameType::tes5).FolderName()) rhs = GameSettings(GameType::tes5, node["folder"].as()); + else if (node["type"].as() == GameSettings(GameType::tes5se).FolderName()) + rhs = GameSettings(GameType::tes5se, node["folder"].as()); else if (node["type"].as() == GameSettings(GameType::fo3).FolderName()) rhs = GameSettings(GameType::fo3, node["folder"].as()); else if (node["type"].as() == GameSettings(GameType::fonv).FolderName()) diff --git a/src/backend/game/load_order_handler.cpp b/src/backend/game/load_order_handler.cpp index 8b1a5931..2def80ed 100644 --- a/src/backend/game/load_order_handler.cpp +++ b/src/backend/game/load_order_handler.cpp @@ -41,14 +41,6 @@ LoadOrderHandler::~LoadOrderHandler() { } void LoadOrderHandler::Init(const GameSettings& game, const boost::filesystem::path& gameLocalAppData) { - if (game.Type() != GameType::tes4 - && game.Type() != GameType::tes5 - && game.Type() != GameType::fo3 - && game.Type() != GameType::fonv - && game.Type() != GameType::fo4) { - throw std::invalid_argument(translate("Unsupported game ID supplied.").str()); - } - if (game.GamePath().empty()) { BOOST_LOG_TRIVIAL(error) << "Game path is not initialised."; throw std::invalid_argument(translate("Game path is not initialised.").str()); @@ -70,6 +62,8 @@ void LoadOrderHandler::Init(const GameSettings& game, const boost::filesystem::p ret = lo_create_handle(&gh_, LIBLO_GAME_TES4, game.GamePath().string().c_str(), gameLocalDataPath); else if (game.Type() == GameType::tes5) ret = lo_create_handle(&gh_, LIBLO_GAME_TES5, game.GamePath().string().c_str(), gameLocalDataPath); + else if (game.Type() == GameType::tes5se) + ret = lo_create_handle(&gh_, LIBLO_GAME_TES5SE, game.GamePath().string().c_str(), gameLocalDataPath); else if (game.Type() == GameType::fo3) ret = lo_create_handle(&gh_, LIBLO_GAME_FO3, game.GamePath().string().c_str(), gameLocalDataPath); else if (game.Type() == GameType::fonv) diff --git a/src/gui/html/css/style.css b/src/gui/html/css/style.css index d64cd3f5..f105447d 100644 --- a/src/gui/html/css/style.css +++ b/src/gui/html/css/style.css @@ -72,6 +72,7 @@ tt, code, kbd, samp { } #gameMenu { margin: 0 8px; + width: 250px; } #applySortButton { color: var(--dark-accent-color); diff --git a/src/gui/html/elements/loot-dropdown-menu.html b/src/gui/html/elements/loot-dropdown-menu.html index 9047f6f6..3f665e03 100644 --- a/src/gui/html/elements/loot-dropdown-menu.html +++ b/src/gui/html/elements/loot-dropdown-menu.html @@ -16,6 +16,8 @@ it a