Beginning of retrieving slot data (deathlink), various fixes
This commit is contained in:
@@ -170,9 +170,7 @@ typedef struct ShipBossRushSaveContextData {
|
||||
} ShipBossRushSaveContextData;
|
||||
|
||||
typedef struct ArchipelagoLocationData {
|
||||
s8 itemType;
|
||||
char itemName[100];
|
||||
char locationName[100];
|
||||
char playerName[17];
|
||||
} ArchipelagoLocationData;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user