From d2fd11294b21bbfbfd54a67fd40ef1ec542e4c8c Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Sat, 25 Nov 2023 22:20:28 -0800 Subject: [PATCH] Make this a proper ME2 extension and use its logging infrastructure --- .gitmodules | 13 ++ archipelago-client/ArchipelagoInterface.cpp | 36 ++-- archipelago-client/AutoEquip.cpp | 1 - archipelago-client/Core.cpp | 171 ++++++++---------- archipelago-client/Core.def | 2 +- archipelago-client/Core.h | 26 ++- archipelago-client/GameHook.cpp | 20 +- archipelago-client/ItemRandomiser.cpp | 8 +- archipelago-client/archipelago-client.vcxproj | 7 +- archipelago-client/subprojects/MINT | 1 + archipelago-client/subprojects/ModEngine2 | 1 + archipelago-client/subprojects/spdlog | 1 + archipelago-client/vcpkg.json | 4 +- 13 files changed, 138 insertions(+), 153 deletions(-) create mode 160000 archipelago-client/subprojects/MINT create mode 160000 archipelago-client/subprojects/ModEngine2 create mode 160000 archipelago-client/subprojects/spdlog diff --git a/.gitmodules b/.gitmodules index 360dc53..0a75645 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,3 +12,16 @@ [submodule "archipelago-client/subprojects/mem"] path = archipelago-client/subprojects/mem url = https://github.com/0x1F9F1/mem.git +[submodule "archipelago-client/subprojects/ModEngine2"] + path = archipelago-client/subprojects/ModEngine2 + url = https://github.com/soulsmods/ModEngine2 +[submodule "archipelago-client/subprojects/MINT"] + path = archipelago-client/subprojects/MINT + url = https://github.com/Chuyu-Team/MINT.git + +# This has to be a submodule and not a vcpkg dependency because we only want its headers. If we link +# the library statically, it will conflict with ModEngine2's own linking and cause the mod not to +# load. +[submodule "archipelago-client/subprojects/spdlog"] + path = archipelago-client/subprojects/spdlog + url = https://github.com/gabime/spdlog diff --git a/archipelago-client/ArchipelagoInterface.cpp b/archipelago-client/ArchipelagoInterface.cpp index 1643353..14b7c74 100644 --- a/archipelago-client/ArchipelagoInterface.cpp +++ b/archipelago-client/ArchipelagoInterface.cpp @@ -1,4 +1,5 @@ #include +#include #include "ArchipelagoInterface.h" @@ -19,7 +20,7 @@ APClient* ap; BOOL CArchipelago::Initialise(std::string URI) { - Core->Logger("CArchipelago::Initialise", true, false); + spdlog::debug("CArchipelago::Initialise"); // read or generate uuid, required by AP std::string uuid = ap_get_uuid(UUID_FILE); @@ -35,7 +36,7 @@ BOOL CArchipelago::Initialise(std::string URI) { ap->set_socket_disconnected_handler([]() { }); ap->set_slot_connected_handler([](const json& data) { - Core->Logger("Slot connected successfully, reading slot data ... "); + spdlog::info("Slot connected successfully, reading slot data ... "); // read the archipelago slot data //Mandatory values @@ -73,14 +74,13 @@ BOOL CArchipelago::Initialise(std::string URI) { }); ap->set_slot_disconnected_handler([]() { - Core->Logger("Slot disconnected"); - + spdlog::info("Slot disconnected"); GameHook->showMessage(L"Archipelago disconnected! Don't pick up any items until it reconnects"); }); ap->set_slot_refused_handler([](const std::list& errors){ for (const auto& error : errors) { - Core->Logger("Connection refused : " + error); + spdlog::warn("Connection refused: {}", error); } GameHook->showMessage(L"Archipelago connection refused!"); }); @@ -110,18 +110,12 @@ BOOL CArchipelago::Initialise(std::string URI) { continue; } - std::ostringstream stringStream; - stringStream << "#" << item.index << ": " << itemname.c_str() << " from " << sender.c_str() << " - " << location.c_str(); - std::string itemDesc = stringStream.str(); - - //Add the item to the list of already received items, only for logging purpose - Core->pReceivedItems.push_back(itemDesc); - Core->Logger(itemDesc); + spdlog::info("#{}: {} from {} - {}", item.index, itemname, sender, location); //Determine the item address auto ds3IdSearch = ItemRandomiser->pApItemsToItemIds.find(item.item); if (ds3IdSearch == ItemRandomiser->pApItemsToItemIds.end()) { - Core->Logger("The following item has not been found in the item pool. Please check your seed options : " + itemname); + spdlog::warn("Item '{}' was not found in the item pool. Please check your seed options.", itemname); continue; } @@ -136,17 +130,17 @@ BOOL CArchipelago::Initialise(std::string URI) { //TODO : * you can still use `set_data_package` or `set_data_package_from_file` during migration to make use of the old cache ap->set_print_handler([](const std::string& msg) { - Core->Logger(msg); + spdlog::info(msg); GameHook->showMessage(msg); }); ap->set_print_json_handler([](const std::list& msg) { - Core->Logger(ap->render_json(msg, APClient::RenderFormat::TEXT)); + spdlog::info(ap->render_json(msg, APClient::RenderFormat::TEXT)); }); ap->set_bounced_handler([](const json& cmd) { if (GameHook->dIsDeathLink) { - Core->Logger("Received DeathLink", true, false); + spdlog::debug("Received DeathLink"); auto tagsIt = cmd.find("tags"); auto dataIt = cmd.find("data"); if (tagsIt != cmd.end() && tagsIt->is_array() @@ -159,14 +153,14 @@ BOOL CArchipelago::Initialise(std::string URI) { std::string source = data["source"].is_string() ? data["source"].get().c_str() : "???"; std::string cause = data["cause"].is_string() ? data["cause"].get().c_str() : "???"; std::string message = "Died by the hands of " + source + " : " + cause; - Core->Logger(message); + spdlog::info(message); GameHook->showMessage(message); GameHook->deathLinkData = true; } } else { - Core->Logger("Bad deathlink packet!", true, false); + spdlog::debug("Bad deathlink packet!"); } } } @@ -194,11 +188,11 @@ VOID CArchipelago::update() { int size = ItemRandomiser->checkedLocationsList.size(); if (ap && size > 0) { if (ap->LocationChecks(ItemRandomiser->checkedLocationsList)) { - Core->Logger(size + " checks sent successfully", true, false); + spdlog::debug("{} checks sent successfully", size); ItemRandomiser->checkedLocationsList.clear(); } else { - Core->Logger(size + " checks has not been sent and will be kept in queue"); + spdlog::debug("{} checks have not been sent and will be kept in queue", size); } } } @@ -210,7 +204,7 @@ VOID CArchipelago::gameFinished() { VOID CArchipelago::sendDeathLink() { if (!ap || !GameHook->dIsDeathLink) return; - Core->Logger("Sending deathlink"); + spdlog::info("Sending deathlink"); json data{ {"time", ap->get_server_time()}, diff --git a/archipelago-client/AutoEquip.cpp b/archipelago-client/AutoEquip.cpp index 93fb3cb..8b03aed 100644 --- a/archipelago-client/AutoEquip.cpp +++ b/archipelago-client/AutoEquip.cpp @@ -2,7 +2,6 @@ extern CCore* Core; extern CAutoEquip* AutoEquip; -extern SCore* CoreStruct; extern CGameHook* GameHook; EquipSlot dRingSlotSelect = EquipSlot::ring1; diff --git a/archipelago-client/Core.cpp b/archipelago-client/Core.cpp index be0f7a0..7037923 100644 --- a/archipelago-client/Core.cpp +++ b/archipelago-client/Core.cpp @@ -1,3 +1,6 @@ +#include +#include + #include "Core.h" #include "GameHook.h" @@ -5,66 +8,73 @@ CCore* Core; CGameHook* GameHook; CItemRandomiser* ItemRandomiser; CAutoEquip* AutoEquip; -SCore* CoreStruct; CArchipelago* ArchipelagoInterface; using nlohmann::json; -VOID CCore::Start() { - Core = new CCore(); +CCore::CCore(modengine::ModEngineExtensionConnector* connector) + : modengine::ModEngineExtension(connector) { + + Core = this; GameHook = new CGameHook(); ItemRandomiser = new CItemRandomiser(); AutoEquip = new CAutoEquip(); +} - if (!Core->Initialise()) { - Core->Panic("Failed to initialise", "...\\Randomiser\\Core\\Core.cpp", FE_InitFailed, 1); - int3 - }; - - while (true) { - Core->Run(); - Sleep(RUN_SLEEP); - }; - - delete CoreStruct; - delete Core; - delete GameHook; - delete ItemRandomiser; - delete AutoEquip; - - return; -}; - -BOOL CCore::Initialise() { - - //Setup the client console - FILE* fp; - AllocConsole(); +void CCore::on_attach() { + // Set up the client console + modEngineDebug = !AllocConsole(); SetConsoleTitleA("Dark Souls III - Archipelago Console"); + FILE* fp; freopen_s(&fp, "CONOUT$", "w", stdout); freopen_s(&fp, "CONIN$", "r", stdin); - Core->Logger(std::string("Archipelago client v") + VERSION); - Core->Logger("A new version may or may not be available, please check this link for updates : https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client/releases", false); - Core->Logger("Type '/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}]' to connect to the room", false); - Core->Logger("Type '/help for more information", false); - Core->Logger("-----------------------------------------------------", false); + + // If ModEngine is running in debug mode, all our logs will automatically get printed to the + // console. If not, we only want to print info or higher logs to the console, and we want to do + // it without any additional prefixes. + if (!modEngineDebug) { + auto consoleSink = std::make_shared(spdlog::color_mode::always); + consoleSink->set_pattern("%v"); + consoleSink->set_level(spdlog::level::info); + spdlog::default_logger()->sinks().push_back(consoleSink); + } + + spdlog::info( + "Archipelago client v" VERSION "\n" + "A new version may or may not be available, please check this link for updates: " + "https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client/releases\n" + "Type '/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}]' to connect to the room\n" + "Type '/help' for more information\n" + "-----------------------------------------------------"); if (!GameHook->initialize()) { Core->Panic("Check if the game version is 1.15 and not 1.15.1, you must use the provided DarkSoulsIII.exe", "Cannot hook the game", FE_InitFailed, 1); - return false; + return; } if (CheckOldApFile()) { - Core->Logger("The AP.json file is not supported in this version, make sure to finish your previous seed on version 1.2 or use this version on the new Archipelago server"); + spdlog::warn("The AP.json file is not supported in this version, make sure to finish your previous seed on version 1.2 or use this version on the new Archipelago server"); } - //Start command prompt + // Start command prompt CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Core->InputCommand, NULL, NULL, NULL); - return true; + CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CCore::Start, 0, 0, 0); +} + +void CCore::on_detach() { + // Do nothing; this function is never called. } +VOID CCore::Start() { + + while (true) { + Core->Run(); + Sleep(RUN_SLEEP); + }; +}; + BOOL CCore::CheckOldApFile() { // read the archipelago json file @@ -92,7 +102,7 @@ VOID CCore::Run() { Core->Panic("Failed to apply settings", "...\\Randomiser\\Core\\Core.cpp", FE_ApplySettings, 1); int3 } - printf("Mod initialized successfully\n"); + spdlog::info("Mod initialized successfully"); GameHook->showMessage(L"Archipelago connected"); isInit = true; } @@ -111,7 +121,7 @@ VOID CCore::Run() { } } else if (initProtectionDelay > 0) { int secondsRemaining = (RUN_SLEEP / 1000) * initProtectionDelay; - printf("The mod will be initialized in %d seconds\n", secondsRemaining); + spdlog::info("The mod will be initialized in {} seconds\n", secondsRemaining); initProtectionDelay--; } } @@ -127,7 +137,7 @@ VOID CCore::Run() { */ VOID CCore::CleanReceivedItemsList() { if (!ItemRandomiser->receivedItemsQueue.empty()) { - Core->Logger(std::format("Removing {0} items according to the last_received_index", pLastReceivedIndex), true, false); + spdlog::debug("Removing {0} items according to the last_received_index", pLastReceivedIndex); for (int i = 0; i < pLastReceivedIndex; i++) { if (!ItemRandomiser->receivedItemsQueue.empty()) { ItemRandomiser->receivedItemsQueue.pop_back(); @@ -144,7 +154,7 @@ VOID CCore::Panic(const char* pMessage, const char* pSort, DWORD dError, DWORD d sprintf_s(pOutput, "\n%s (%i)\n", pMessage, dError); - Core->Logger(pOutput); + spdlog::critical(pOutput); if (dIsFatalError) { sprintf_s(pTitle, "[Archipelago client - Fatal Error]"); @@ -167,11 +177,12 @@ VOID CCore::InputCommand() { std::getline(std::cin, line); if (line == "/help") { - printf("List of available commands : \n"); - printf("/help : Prints this help message.\n"); - printf("!help : Prints the help message related to Archipelago.\n"); - printf("/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}] : Connect to the specified server.\n"); - printf("/debug on|off : Prints additional debug info \n"); + spdlog::info( + "List of available commands : \n" + "/help : Prints this help message.\n" + "!help : Prints the help message related to Archipelago.\n" + "/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}] : Connect to the specified server.\n" + "/debug on|off : Prints additional debug info"); } #ifdef DEBUG @@ -198,12 +209,13 @@ VOID CCore::InputCommand() { std::string param = line.substr(7); BOOL res = (param.find("on") == 0); if (res) { - Core->Logger("Debug logs activated", true, true); - Core->debugLogs = true; + spdlog::info("Debug logs activated"); + spdlog::default_logger()->set_level(spdlog::level::trace); } else { - Core->Logger("Debug logs deactivated", true, true); - Core->debugLogs = false; + spdlog::info("Debug logs deactivated"); + spdlog::default_logger()->set_level( + Core->modEngineDebug ? spdlog::level::debug : spdlog::level::info); } @@ -212,7 +224,7 @@ VOID CCore::InputCommand() { std::string param = line.substr(9); int spaceIndex = param.find(" "); if (spaceIndex == std::string::npos) { - Core->Logger("Missing parameter : Make sure to type '/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}]'"); + spdlog::warn("Missing parameter: make sure to type '/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME} [password:{PASSWORD}]'"); } else { int passwordIndex = param.find("password:"); std::string address = param.substr(0, spaceIndex); @@ -249,13 +261,13 @@ VOID CCore::ReadConfigFiles() { std::ifstream gameFile(filename); if (!gameFile.good()) { //Missing session file, that's probably a new game - Logger("No save found, starting a new game", true, false); + spdlog::debug("No save found, starting a new game"); return; } } //Read the game file - Logger("Reading " + outputFolder + "/" + filename, true, false); + spdlog::debug("Reading {}/{}", outputFolder, filename); json k; try { @@ -280,7 +292,7 @@ VOID CCore::SaveConfigFiles() { std::string outputFolder = "archipelago"; std::string filename = Core->pSeed + "_" + Core->pSlotName + ".json"; - Logger("Writing to " + outputFolder + "/" + filename, true, false); + spdlog::debug("Writing to {}/{}", outputFolder, filename); json j; j["last_received_index"] = pLastReceivedIndex; @@ -298,56 +310,15 @@ VOID CCore::SaveConfigFiles() { } } catch (const std::exception&) { - Logger("Failed writing " + outputFolder + "/" + filename, true, true); + spdlog::warn("Failed writing {}/{}", outputFolder, filename); } } -inline std::string getCurrentDateTime(std::string s) { - time_t now = time(0); - struct tm tstruct; - char buf[80]; - tstruct = *localtime(&now); - if (s == "now") - strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); - else if (s == "date") - strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct); - return std::string(buf); -}; - -VOID CCore::Logger(std::string logMessage, BOOL inFile, BOOL inConsole) { - - if(inConsole) - std::cout << logMessage << std::endl; - - if (inFile) { - try { - std::string outputFolder = "archipelago"; - std::string filename = "log_" + getCurrentDateTime("date") + ".txt"; - std::ofstream logFile(outputFolder + "\\" + filename, std::ios_base::out | std::ios_base::app); - - std::string now = getCurrentDateTime("now"); - logFile << now << '\t' << logMessage << '\n'; - logFile.close(); - } catch (const std::exception&) { - //Logging is optional and should not crash the mod - } - } -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { - - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - - DisableThreadLibraryCalls(hinstDLL); - CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CCore::Start, 0, 0, 0); - - break; - } - - return TRUE; - +// Entrypoint called by ModEngine2 to initialize this extension. +bool modengine_ext_init(modengine::ModEngineExtensionConnector* connector, + modengine::ModEngineExtension** extension) { + *extension = new CCore(connector); + return true; } diff --git a/archipelago-client/Core.def b/archipelago-client/Core.def index 2123fdd..6fa2a87 100644 --- a/archipelago-client/Core.def +++ b/archipelago-client/Core.def @@ -1,4 +1,4 @@ LIBRARY archipelago.dll EXPORTS - + modengine_ext_init @1 diff --git a/archipelago-client/Core.h b/archipelago-client/Core.h index 9ca5485..700220a 100644 --- a/archipelago-client/Core.h +++ b/archipelago-client/Core.h @@ -4,6 +4,7 @@ #define _CRT_SECURE_NO_WARNINGS //#define WSWRAP_NO_SSL +#include #include "subprojects/apclientpp/apclient.hpp" #include #include @@ -39,32 +40,41 @@ #define FE_ApplySettings 14 #define FE_PatternFailed 15 -#define VERSION "2.2.0" +#define VERSION "2.3.0" -struct SCore; - -class CCore { +class CCore: public modengine::ModEngineExtension { public: + CCore(modengine::ModEngineExtensionConnector* connector); + static VOID Start(); static VOID InputCommand(); virtual VOID Run(); - virtual BOOL Initialise(); virtual VOID Panic(const char* pMessage, const char* pSort, DWORD dError, DWORD dIsFatalError); virtual VOID ReadConfigFiles(); virtual VOID SaveConfigFiles(); virtual VOID CleanReceivedItemsList(); virtual BOOL CheckOldApFile(); - virtual VOID Logger(std::string logMessage, BOOL inFile = true, BOOL inConsole = true); std::string pSlotName; std::string pPassword; std::string pSeed; BOOL saveConfigFiles = false; BOOL sendGoalStatus = true; - std::list pReceivedItems = { }; int pLastReceivedIndex = 0; - BOOL debugLogs = true; static const int RUN_SLEEP = 2000; + +private: + // Whether ModEngine is running in debug mode (in which case we're sharing the console with + // its debug output). + BOOL modEngineDebug = false; + + const char* id() override { + return "archipelago"; + } + + void on_attach() override; + void on_detach() override; + }; \ No newline at end of file diff --git a/archipelago-client/GameHook.cpp b/archipelago-client/GameHook.cpp index 8bcebe1..edf2e76 100644 --- a/archipelago-client/GameHook.cpp +++ b/archipelago-client/GameHook.cpp @@ -1,3 +1,5 @@ +#include + #include "GameHook.h" #include "mem/module.h" @@ -92,12 +94,12 @@ GameDataMan* GameDataMan::instance() { // Hook the functions necessary to customize game behavior. BOOL CGameHook::initialize() { - Core->Logger("CGameHook::preInitialize", true, false); + spdlog::debug("CGameHook::preInitialize"); try { if (MH_Initialize() != MH_OK) return false; } catch (const std::exception&) { - Core->Logger("Cannot initialize MinHook"); + spdlog::error("Cannot initialize MinHook"); return false; } @@ -125,7 +127,7 @@ BOOL CGameHook::initialize() { && SimpleHook(onWorldLoadedAddress.as(), (LPVOID)&HookedOnWorldLoaded, (LPVOID*)&OnWorldLoadedOriginal) && SimpleHook(onWorldUnloadedAddress.as(), (LPVOID)&HookedOnWorldUnloaded, (LPVOID*)&OnWorldUnloadedOriginal); } catch (const std::exception&) { - Core->Logger("Cannot hook the game"); + spdlog::error("Cannot hook the game"); } return false; } @@ -165,7 +167,7 @@ VOID CGameHook::manageDeathLink() { killThePlayer(); } else if(lastHealthPoint != 0 && healthPoint == 0) { //The player just died, ignore the deathLink if received if (deathLinkData) { - Core->Logger("The player just died, a death link has been ignored", true, false); + spdlog::debug("The player just died, a death link has been ignored"); deathLinkData = false; return; } @@ -174,16 +176,10 @@ VOID CGameHook::manageDeathLink() { } VOID CGameHook::killThePlayer() { - Core->Logger("Kill the player", true, false); + spdlog::debug("Kill the player"); WorldChrMan::instance()->mainCharacter->container->dataModule->hp = 0; } -VOID debugPrint(const char* prefix, void* data) { - std::ostringstream stream; - stream << prefix << std::hex << (ULONGLONG)data; - Core->Logger(stream.str()); -} - VOID CGameHook::updateRuntimeValues() { lastHealthPoint = healthPoint; healthPoint = WorldChrMan::instance()->mainCharacter->container->dataModule->hp; @@ -194,7 +190,7 @@ VOID CGameHook::giveItems() { if (ItemRandomiser->receivedItemsQueue.empty()) return; //Send the next item in the list - Core->Logger("Send an item from the list of items", true, false); + spdlog::debug("Send an item from the list of items"); SReceivedItem item = ItemRandomiser->receivedItemsQueue.back(); ItemRandomiser->receivedItemsQueue.pop_back(); if (item.address == 0x40002346) { diff --git a/archipelago-client/ItemRandomiser.cpp b/archipelago-client/ItemRandomiser.cpp index cc6c798..b3bf28a 100644 --- a/archipelago-client/ItemRandomiser.cpp +++ b/archipelago-client/ItemRandomiser.cpp @@ -32,9 +32,7 @@ VOID CItemRandomiser::RandomiseItem(WorldChrMan* qWorldChrMan, SItemBuffer* pIte SItemBufferEntry* dItem = &pItemBuffer->items[i]; - if (Core->debugLogs) { - printf("IN itemID : %d\n", dItem->id); - } + spdlog::trace("IN itemID: {}", dItem->id); if (dItem->id > (0x40000000 + 3780000)) { // If we receive a synthetic item generated by the offline randomizer, it may be a @@ -60,9 +58,7 @@ VOID CItemRandomiser::RandomiseItem(WorldChrMan* qWorldChrMan, SItemBuffer* pIte //Nothing to do, this is a vanilla item so we will let it go to the player's inventory } - if (Core->debugLogs) { - printf("OUT itemID : %d\n", dItem->id); - } + spdlog::trace("OUT itemID: {}\n", dItem->id); }; if (indexToRemove != -1) diff --git a/archipelago-client/archipelago-client.vcxproj b/archipelago-client/archipelago-client.vcxproj index ee8babd..ff74ccc 100644 --- a/archipelago-client/archipelago-client.vcxproj +++ b/archipelago-client/archipelago-client.vcxproj @@ -98,7 +98,7 @@ true WIN32;_WINDOWS;_USRDLL;DINPUT8_EXPORTS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) true - subprojects;dep;subprojects\wswrap\include;subprojects\apclientpp;subprojects\minhook\include;subprojects\mem\include;subprojects\fd4_singleton;%(AdditionalIncludeDirectories) + subprojects;dep;subprojects\wswrap\include;subprojects\apclientpp;subprojects\minhook\include;subprojects\mem\include;subprojects\fd4_singleton;subprojects\ModEngine2\include;subprojects\MINT;subprojects\spdlog\include;%(AdditionalIncludeDirectories) /Zc:__cplusplus %(AdditionalOptions) stdcpp20 @@ -113,13 +113,13 @@ - _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;MODENGINE_EXTERNAL;%(PreprocessorDefinitions) /bigobj %(AdditionalOptions) - NDEBUG;%(PreprocessorDefinitions) + NDEBUG;MODENGINE_EXTERNAL;%(PreprocessorDefinitions) @@ -137,6 +137,7 @@ + diff --git a/archipelago-client/subprojects/MINT b/archipelago-client/subprojects/MINT new file mode 160000 index 0000000..8c8f9e6 --- /dev/null +++ b/archipelago-client/subprojects/MINT @@ -0,0 +1 @@ +Subproject commit 8c8f9e6e9598341dc2091023b0223287dbe002a4 diff --git a/archipelago-client/subprojects/ModEngine2 b/archipelago-client/subprojects/ModEngine2 new file mode 160000 index 0000000..0924ab3 --- /dev/null +++ b/archipelago-client/subprojects/ModEngine2 @@ -0,0 +1 @@ +Subproject commit 0924ab36f1311bf84e7e626740b4bf2c0d54909a diff --git a/archipelago-client/subprojects/spdlog b/archipelago-client/subprojects/spdlog new file mode 160000 index 0000000..ac55e60 --- /dev/null +++ b/archipelago-client/subprojects/spdlog @@ -0,0 +1 @@ +Subproject commit ac55e60488032b9acde8940a5de099541c4515da diff --git a/archipelago-client/vcpkg.json b/archipelago-client/vcpkg.json index c484199..3b1debb 100644 --- a/archipelago-client/vcpkg.json +++ b/archipelago-client/vcpkg.json @@ -1,9 +1,11 @@ { "name": "dark-souls-iii-archipelago-client", - "version-string": "2.0.0", + "version-string": "2.3.0", "dependencies": [ "asio", "nlohmann-json", + "sol2", + "tomlplusplus", "valijson", "websocketpp" ],