From c15abdc411190b360cd3060f19e4c35aa8875599 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 23 May 2025 13:50:20 +0200 Subject: [PATCH] Init archipelago data, place different AP item types --- soh/include/z64save.h | 2 +- soh/soh/Enhancements/randomizer/context.cpp | 21 ++++++---- .../Enhancements/randomizer/randomizer.cpp | 9 ++--- soh/soh/Network/Archipelago/Archipelago.cpp | 39 ++++++++++++++----- soh/soh/Network/Archipelago/Archipelago.h | 7 ++++ soh/src/code/z_sram.c | 12 +++++- 6 files changed, 64 insertions(+), 26 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index c9748fac1..84f50ded2 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -170,7 +170,7 @@ typedef struct ShipBossRushSaveContextData { } ShipBossRushSaveContextData; typedef struct ArchipelagoLocationData { - u8 itemType; + s8 itemType; char itemName[100]; char locationName[100]; char playerName[17]; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index e890a6f7c..f072725e7 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -484,8 +484,8 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) { void Context::ParseArchipelagoItemsLocations(const std::vector& scouted_items) { const std::string SlotName = ArchipelagoClient::GetInstance().GetSlotName(); - // Zero out the item table first - for(int rc = 1; rc <= RC_MAX; rc++) { + // Zero out the location table first + for(int rc = 1; rc < RC_MAX; rc++) { itemLocationTable[rc].SetPlacedItem(RG_NONE); } @@ -497,15 +497,20 @@ void Context::ParseArchipelagoItemsLocations(const std::vectorsecond; itemLocationTable[rc].SetPlacedItem(item); } else { // other player item - itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_USEFUL); - // i'll have to figure out custom names at some point, this currently does nothing - //overrides[rc] = ItemOverride(rc, RG_DEKU_NUTS_5); - //std::string getText = ap_item.playerName + "'s " + ap_item.itemName; - //overrides[rc].SetTrickName(Text(getText, getText, getText)); + switch (ap_item.flags) { + case 0: + itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_JUNK); + break; + case 1: + itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_PROGRESSIVE); + break; + case 2: + itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_USEFUL); + break; + } } } } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 67b93e55d..3739703c1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -5540,12 +5540,9 @@ void Randomizer::CreateCustomMessages() { GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w halten!", "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), - GIMESSAGE_NO_GERMAN(RG_ARCHIPELAGO_ITEM_USEFUL, ITEM_BEAN, "You found an useful %rAP_ITEM%w!", - "Needs French Translation"), - GIMESSAGE_NO_GERMAN(RG_ARCHIPELAGO_ITEM_JUNK, ITEM_BEAN, "You found a junk %rAP_ITEM%w!", - "Needs French Translation"), - GIMESSAGE_NO_GERMAN(RG_ARCHIPELAGO_ITEM_PROGRESSIVE, ITEM_BEAN, "You found a progressive %rAP_ITEM%w!", - "Needs French Translation"), + GIMESSAGE_UNTRANSLATED(RG_ARCHIPELAGO_ITEM_USEFUL, ITEM_NUT, "You found an useful %gAP Item%w!"), + GIMESSAGE_UNTRANSLATED(RG_ARCHIPELAGO_ITEM_JUNK, ITEM_NUT, "You found a junk %gAP Item%w!"), + GIMESSAGE_UNTRANSLATED(RG_ARCHIPELAGO_ITEM_PROGRESSIVE, ITEM_NUT, "You found a progressive %gAP Item%w!"), } }; CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); diff --git a/soh/soh/Network/Archipelago/Archipelago.cpp b/soh/soh/Network/Archipelago/Archipelago.cpp index b6124f148..0aa4b9452 100644 --- a/soh/soh/Network/Archipelago/Archipelago.cpp +++ b/soh/soh/Network/Archipelago/Archipelago.cpp @@ -114,21 +114,20 @@ bool ArchipelagoClient::IsConnected() { return apClient->get_state() == APClient::State::SLOT_CONNECTED; } -void ArchipelagoClient::CheckLocation(RandomizerCheck SoH_check_id) { - //std::string_view ap_name = Rando::StaticData::SohCheckToAP[SoH_check_id]; - std::string ap_name = Rando::StaticData::GetLocation(SoH_check_id)->GetName(); - if(ap_name.empty()) { +void ArchipelagoClient::CheckLocation(RandomizerCheck sohCheckId) { + std::string apName = Rando::StaticData::GetLocation(sohCheckId)->GetName(); + if (apName.empty()) { return; } - int64_t ap_item_id = apClient->get_location_id(std::string(ap_name)); - std::string logMessage = "[LOG] Checked: " + ap_name + "(" + std::to_string(ap_item_id) + "), sending to AP server"; + int64_t apItemId = apClient->get_location_id(std::string(apName)); + + std::string logMessage = "[LOG] Checked: " + apName + "(" + std::to_string(apItemId) + "), sending to AP server"; ArchipelagoConsole_SendMessage(logMessage.c_str()); - // currently not sending, because i only get so many real chances if(!IsConnected()) { return; } - apClient->LocationChecks({ap_item_id}); + apClient->LocationChecks({ apItemId }); } void ArchipelagoClient::AddItemRecievedCallback(std::function callback) { @@ -204,6 +203,26 @@ const char* ArchipelagoClient::GetConnectionStatus() { } } +extern "C" void Archipelago_InitSaveFile() { + gSaveContext.ship.quest.data.archipelago.isArchipelago = 1; + + 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)); + } +} void LoadArchipelagoData() { SaveManager::Instance->LoadData("isArchipelago", gSaveContext.ship.quest.data.archipelago.isArchipelago); @@ -271,8 +290,8 @@ void InitArchipelagoData(bool isDebug) { SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.slotName, "", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName)); - for (uint32_t i; i < ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations); i++) { - gSaveContext.ship.quest.data.archipelago.locations[i].itemType = 0; + 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)); diff --git a/soh/soh/Network/Archipelago/Archipelago.h b/soh/soh/Network/Archipelago/Archipelago.h index c4c6c21d1..35acb6b5a 100644 --- a/soh/soh/Network/Archipelago/Archipelago.h +++ b/soh/soh/Network/Archipelago/Archipelago.h @@ -1,4 +1,5 @@ #pragma once +#ifdef __cplusplus #include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/static_data.h" #include @@ -83,3 +84,9 @@ class ArchipelagoClient{ void LoadArchipelagoData(); void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave); void InitArchipelagoData(bool isDebug); +extern "C" { +#endif // END __cplusplus +void Archipelago_InitSaveFile(); +#ifdef __cplusplus +} +#endif diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 8fc6d1dde..023ee02df 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -8,6 +8,7 @@ #include "soh/OTRGlobals.h" #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Network/Archipelago/Archipelago.h" #define NUM_DUNGEONS 8 #define NUM_COWS 10 @@ -261,10 +262,19 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { u8 currentQuest = fileChooseCtx->questType[fileChooseCtx->buttonIndex]; - if (currentQuest == QUEST_RANDOMIZER && (Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded())) { + // Temporary + if (CVarGetInteger(CVAR_REMOTE_ARCHIPELAGO("Connected"), 0)) { + currentQuest = QUEST_ARCHIPELAGO; + } + + if ((currentQuest == QUEST_RANDOMIZER && (Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded())) || + currentQuest == QUEST_ARCHIPELAGO) { gSaveContext.ship.quest.id = QUEST_RANDOMIZER; Randomizer_InitSaveFile(); + if (currentQuest == QUEST_ARCHIPELAGO) { + Archipelago_InitSaveFile(); + } } else { gSaveContext.ship.quest.id = currentQuest; }