From ab307fa3e9eaaad4ea05bb7e792f0e01affd12df Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 25 May 2025 11:29:13 +0200 Subject: [PATCH] Beginning of retrieving slot data (deathlink), various fixes --- soh/include/z64save.h | 2 -- soh/soh/Enhancements/randomizer/context.cpp | 27 ++++++++++---------- soh/soh/Network/Archipelago/Archipelago.cpp | 28 ++++++--------------- soh/soh/Network/Archipelago/Archipelago.h | 5 ++-- 4 files changed, 24 insertions(+), 38 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index ffd413455..dc11b6da8 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -170,9 +170,7 @@ typedef struct ShipBossRushSaveContextData { } ShipBossRushSaveContextData; typedef struct ArchipelagoLocationData { - s8 itemType; char itemName[100]; - char locationName[100]; char playerName[17]; } ArchipelagoLocationData; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index a6adc7b9b..6442b16dc 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -484,6 +484,8 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) { void Context::ParseArchipelagoOptions(const std::map& slot_data) { // Set options to what Archipelago expects. Need to slowly convert these to options in apworld and // load those in instead. + + nlohmann::json slotData = ArchipelagoClient::GetInstance().GetSlotData(); mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_OFF); mOptions[RSK_KAK_GATE].Set(RO_KAK_GATE_OPEN); mOptions[RSK_DOOR_OF_TIME].Set(RO_DOOROFTIME_OPEN); @@ -587,7 +589,7 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_FISHING_POLE_HINT].Set(RO_GENERIC_NO); mOptions[RSK_HINT_CLARITY].Set(0); mOptions[RSK_HINT_DISTRIBUTION].Set(0); - mOptions[RSK_SHUFFLE_MAPANDCOMPASS].Set(0); + mOptions[RSK_SHUFFLE_MAPANDCOMPASS].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); mOptions[RSK_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); mOptions[RSK_GERUDO_KEYS].Set(RO_GERUDO_KEYS_ANYWHERE); mOptions[RSK_BOSS_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE); @@ -669,7 +671,7 @@ void Context::ParseArchipelagoOptions(const std::map& slot_dat mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(0); mOptions[RSK_DECOUPLED_ENTRANCES].Set(0); mOptions[RSK_STARTING_SKULLTULA_TOKEN].Set(0); - mOptions[RSK_STARTING_HEARTS].Set(3); + mOptions[RSK_STARTING_HEARTS].Set(2); mOptions[RSK_DAMAGE_MULTIPLIER].Set(0); mOptions[RSK_ALL_LOCATIONS_REACHABLE].Set(0); mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].Set(0); @@ -710,17 +712,16 @@ void Context::ParseArchipelagoItemsLocations(const std::vectorset_slot_connected_handler([&](const nlohmann::json) { + apClient->set_slot_connected_handler([&](const nlohmann::json data) { ArchipelagoConsole_SendMessage("[LOG] Connected.", false); ArchipelagoClient::StartLocationScouts(); + + slotData = data; // if we are already in game when we connect // we won't have to request an itemSynch @@ -229,7 +231,7 @@ const std::string ArchipelagoClient::GetSlotName() const { return apClient->get_slot(); } -const std::map& ArchipelagoClient::GetSlotData() { +const nlohmann::json ArchipelagoClient::GetSlotData() { return slotData; } @@ -268,18 +270,17 @@ const char* ArchipelagoClient::GetConnectionStatus() { extern "C" void Archipelago_InitSaveFile() { gSaveContext.ship.quest.data.archipelago.isArchipelago = 1; + nlohmann::json slotData = ArchipelagoClient::GetInstance().GetSlotData(); + gSaveContext.ship.quest.data.archipelago.deathLink = slotData["death_link"]; + std::vector scoutedItems = ArchipelagoClient::GetInstance().GetScoutedItems(); for (uint32_t i = 0; i < scoutedItems.size(); i++) { RandomizerCheck rc = Rando::StaticData::locationNameToEnum[scoutedItems[i].locationName]; - gSaveContext.ship.quest.data.archipelago.locations[rc].itemType = scoutedItems[i].flags; SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[rc].itemName, scoutedItems[i].itemName, ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[rc].itemName)); - SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[rc].locationName, - scoutedItems[i].locationName, - ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[rc].locationName)); SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[rc].playerName, scoutedItems[i].playerName, ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[rc].playerName)); @@ -301,15 +302,9 @@ void LoadArchipelagoData() { "locations", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations), [](size_t i) { SaveManager::Instance->LoadStruct("", [&i]() { - SaveManager::Instance->LoadData("itemType", - gSaveContext.ship.quest.data.archipelago.locations[i].itemType); - SaveManager::Instance->LoadCharArray( "itemName", gSaveContext.ship.quest.data.archipelago.locations[i].itemName, ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].itemName)); - SaveManager::Instance->LoadCharArray( - "locationName", gSaveContext.ship.quest.data.archipelago.locations[i].locationName, - ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].locationName)); SaveManager::Instance->LoadCharArray( "playerName", gSaveContext.ship.quest.data.archipelago.locations[i].playerName, ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].playerName)); @@ -329,13 +324,8 @@ void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave) SaveManager::Instance->SaveArray( "locations", ARRAY_COUNT(saveContext->ship.quest.data.archipelago.locations), [&](size_t i) { SaveManager::Instance->SaveStruct("", [&]() { - SaveManager::Instance->SaveData("itemType", - saveContext->ship.quest.data.archipelago.locations[i].itemType); - SaveManager::Instance->SaveData("itemName", saveContext->ship.quest.data.archipelago.locations[i].itemName); - SaveManager::Instance->SaveData("locationName", - saveContext->ship.quest.data.archipelago.locations[i].locationName); SaveManager::Instance->SaveData("playerName", saveContext->ship.quest.data.archipelago.locations[i].playerName); }); @@ -353,12 +343,8 @@ void InitArchipelagoData(bool isDebug) { ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName)); for (uint32_t i = 0; i < ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations); i++) { - gSaveContext.ship.quest.data.archipelago.locations[i].itemType = -1; - SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].itemName, "", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].itemName)); - SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].locationName, "", - ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].locationName)); SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].playerName, "", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[i].playerName)); } diff --git a/soh/soh/Network/Archipelago/Archipelago.h b/soh/soh/Network/Archipelago/Archipelago.h index 6967d7e14..8875aa838 100644 --- a/soh/soh/Network/Archipelago/Archipelago.h +++ b/soh/soh/Network/Archipelago/Archipelago.h @@ -3,6 +3,7 @@ #include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/static_data.h" #include +#include // Forward declaration class APClient; @@ -40,7 +41,7 @@ class ArchipelagoClient{ const std::string GetSlotName() const; const char* GetConnectionStatus(); - const std::map& GetSlotData(); + const nlohmann::json GetSlotData(); const std::vector& GetScoutedItems(); bool IsConnected(); @@ -68,7 +69,7 @@ class ArchipelagoClient{ bool gameWon; - std::map slotData; + nlohmann::json slotData; std::set locations; std::vector scoutedItems; };