Beginning of retrieving slot data (deathlink), various fixes

This commit is contained in:
aMannus
2025-05-25 11:29:13 +02:00
parent 2b6f81351c
commit ab307fa3e9
4 changed files with 24 additions and 38 deletions

View File

@@ -170,9 +170,7 @@ typedef struct ShipBossRushSaveContextData {
} ShipBossRushSaveContextData;
typedef struct ArchipelagoLocationData {
s8 itemType;
char itemName[100];
char locationName[100];
char playerName[17];
} ArchipelagoLocationData;

View File

@@ -484,6 +484,8 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) {
void Context::ParseArchipelagoOptions(const std::map<std::string, int>& 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<std::string, int>& 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<std::string, int>& 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::vector<ArchipelagoClient
const RandomizerGet item = StaticData::itemNameToEnum[ap_item.itemName];
itemLocationTable[rc].SetPlacedItem(item);
} else {
// other player item
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;
// Other player item
// If progressive or trap bit flag is set, make item progressive.
if (ap_item.flags & (1 << 0) || ap_item.flags & (1 << 2)) {
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_PROGRESSIVE);
// If useful bit flag is on, make item useful.
} else if (ap_item.flags & (1 << 1)) {
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_USEFUL);
// None of these flags being present means it's junk.
} else {
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_JUNK);
}
}
}

View File

@@ -59,9 +59,11 @@ bool ArchipelagoClient::StartClient() {
0b001, tags);
});
apClient->set_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<std::string, int>& 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<ArchipelagoClient::ApItem> 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));
}

View File

@@ -3,6 +3,7 @@
#include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/randomizer/static_data.h"
#include <vector>
#include <nlohmann/json.hpp>
// Forward declaration
class APClient;
@@ -40,7 +41,7 @@ class ArchipelagoClient{
const std::string GetSlotName() const;
const char* GetConnectionStatus();
const std::map<std::string, int>& GetSlotData();
const nlohmann::json GetSlotData();
const std::vector<ApItem>& GetScoutedItems();
bool IsConnected();
@@ -68,7 +69,7 @@ class ArchipelagoClient{
bool gameWon;
std::map<std::string, int> slotData;
nlohmann::json slotData;
std::set<int64_t> locations;
std::vector<ApItem> scoutedItems;
};