Beginning of retrieving slot data (deathlink), various fixes
This commit is contained in:
@@ -170,9 +170,7 @@ typedef struct ShipBossRushSaveContextData {
|
|||||||
} ShipBossRushSaveContextData;
|
} ShipBossRushSaveContextData;
|
||||||
|
|
||||||
typedef struct ArchipelagoLocationData {
|
typedef struct ArchipelagoLocationData {
|
||||||
s8 itemType;
|
|
||||||
char itemName[100];
|
char itemName[100];
|
||||||
char locationName[100];
|
|
||||||
char playerName[17];
|
char playerName[17];
|
||||||
} ArchipelagoLocationData;
|
} ArchipelagoLocationData;
|
||||||
|
|
||||||
|
|||||||
@@ -484,6 +484,8 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) {
|
|||||||
void Context::ParseArchipelagoOptions(const std::map<std::string, int>& slot_data) {
|
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
|
// Set options to what Archipelago expects. Need to slowly convert these to options in apworld and
|
||||||
// load those in instead.
|
// load those in instead.
|
||||||
|
|
||||||
|
nlohmann::json slotData = ArchipelagoClient::GetInstance().GetSlotData();
|
||||||
mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_OFF);
|
mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_OFF);
|
||||||
mOptions[RSK_KAK_GATE].Set(RO_KAK_GATE_OPEN);
|
mOptions[RSK_KAK_GATE].Set(RO_KAK_GATE_OPEN);
|
||||||
mOptions[RSK_DOOR_OF_TIME].Set(RO_DOOROFTIME_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_FISHING_POLE_HINT].Set(RO_GENERIC_NO);
|
||||||
mOptions[RSK_HINT_CLARITY].Set(0);
|
mOptions[RSK_HINT_CLARITY].Set(0);
|
||||||
mOptions[RSK_HINT_DISTRIBUTION].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_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_ANYWHERE);
|
||||||
mOptions[RSK_GERUDO_KEYS].Set(RO_GERUDO_KEYS_ANYWHERE);
|
mOptions[RSK_GERUDO_KEYS].Set(RO_GERUDO_KEYS_ANYWHERE);
|
||||||
mOptions[RSK_BOSS_KEYSANITY].Set(RO_DUNGEON_ITEM_LOC_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_MIX_GROTTO_ENTRANCES].Set(0);
|
||||||
mOptions[RSK_DECOUPLED_ENTRANCES].Set(0);
|
mOptions[RSK_DECOUPLED_ENTRANCES].Set(0);
|
||||||
mOptions[RSK_STARTING_SKULLTULA_TOKEN].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_DAMAGE_MULTIPLIER].Set(0);
|
||||||
mOptions[RSK_ALL_LOCATIONS_REACHABLE].Set(0);
|
mOptions[RSK_ALL_LOCATIONS_REACHABLE].Set(0);
|
||||||
mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].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];
|
const RandomizerGet item = StaticData::itemNameToEnum[ap_item.itemName];
|
||||||
itemLocationTable[rc].SetPlacedItem(item);
|
itemLocationTable[rc].SetPlacedItem(item);
|
||||||
} else {
|
} else {
|
||||||
// other player item
|
// Other player item
|
||||||
switch (ap_item.flags) {
|
// If progressive or trap bit flag is set, make item progressive.
|
||||||
case 0:
|
if (ap_item.flags & (1 << 0) || ap_item.flags & (1 << 2)) {
|
||||||
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_JUNK);
|
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_PROGRESSIVE);
|
||||||
break;
|
// If useful bit flag is on, make item useful.
|
||||||
case 1:
|
} else if (ap_item.flags & (1 << 1)) {
|
||||||
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_PROGRESSIVE);
|
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_USEFUL);
|
||||||
break;
|
// None of these flags being present means it's junk.
|
||||||
case 2:
|
} else {
|
||||||
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_USEFUL);
|
itemLocationTable[rc].SetPlacedItem(RG_ARCHIPELAGO_ITEM_JUNK);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,9 +59,11 @@ bool ArchipelagoClient::StartClient() {
|
|||||||
0b001, tags);
|
0b001, tags);
|
||||||
});
|
});
|
||||||
|
|
||||||
apClient->set_slot_connected_handler([&](const nlohmann::json) {
|
apClient->set_slot_connected_handler([&](const nlohmann::json data) {
|
||||||
ArchipelagoConsole_SendMessage("[LOG] Connected.", false);
|
ArchipelagoConsole_SendMessage("[LOG] Connected.", false);
|
||||||
ArchipelagoClient::StartLocationScouts();
|
ArchipelagoClient::StartLocationScouts();
|
||||||
|
|
||||||
|
slotData = data;
|
||||||
|
|
||||||
// if we are already in game when we connect
|
// if we are already in game when we connect
|
||||||
// we won't have to request an itemSynch
|
// we won't have to request an itemSynch
|
||||||
@@ -229,7 +231,7 @@ const std::string ArchipelagoClient::GetSlotName() const {
|
|||||||
return apClient->get_slot();
|
return apClient->get_slot();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<std::string, int>& ArchipelagoClient::GetSlotData() {
|
const nlohmann::json ArchipelagoClient::GetSlotData() {
|
||||||
return slotData;
|
return slotData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,18 +270,17 @@ const char* ArchipelagoClient::GetConnectionStatus() {
|
|||||||
extern "C" void Archipelago_InitSaveFile() {
|
extern "C" void Archipelago_InitSaveFile() {
|
||||||
gSaveContext.ship.quest.data.archipelago.isArchipelago = 1;
|
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();
|
std::vector<ArchipelagoClient::ApItem> scoutedItems = ArchipelagoClient::GetInstance().GetScoutedItems();
|
||||||
|
|
||||||
for (uint32_t i = 0; i < scoutedItems.size(); i++) {
|
for (uint32_t i = 0; i < scoutedItems.size(); i++) {
|
||||||
RandomizerCheck rc = Rando::StaticData::locationNameToEnum[scoutedItems[i].locationName];
|
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,
|
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[rc].itemName,
|
||||||
scoutedItems[i].itemName,
|
scoutedItems[i].itemName,
|
||||||
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[rc].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,
|
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[rc].playerName,
|
||||||
scoutedItems[i].playerName,
|
scoutedItems[i].playerName,
|
||||||
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations[rc].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),
|
"locations", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations),
|
||||||
[](size_t i) {
|
[](size_t i) {
|
||||||
SaveManager::Instance->LoadStruct("", [&i]() {
|
SaveManager::Instance->LoadStruct("", [&i]() {
|
||||||
SaveManager::Instance->LoadData("itemType",
|
|
||||||
gSaveContext.ship.quest.data.archipelago.locations[i].itemType);
|
|
||||||
|
|
||||||
SaveManager::Instance->LoadCharArray(
|
SaveManager::Instance->LoadCharArray(
|
||||||
"itemName", gSaveContext.ship.quest.data.archipelago.locations[i].itemName,
|
"itemName", gSaveContext.ship.quest.data.archipelago.locations[i].itemName,
|
||||||
ARRAY_COUNT(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(
|
SaveManager::Instance->LoadCharArray(
|
||||||
"playerName", gSaveContext.ship.quest.data.archipelago.locations[i].playerName,
|
"playerName", gSaveContext.ship.quest.data.archipelago.locations[i].playerName,
|
||||||
ARRAY_COUNT(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(
|
SaveManager::Instance->SaveArray(
|
||||||
"locations", ARRAY_COUNT(saveContext->ship.quest.data.archipelago.locations), [&](size_t i) {
|
"locations", ARRAY_COUNT(saveContext->ship.quest.data.archipelago.locations), [&](size_t i) {
|
||||||
SaveManager::Instance->SaveStruct("", [&]() {
|
SaveManager::Instance->SaveStruct("", [&]() {
|
||||||
SaveManager::Instance->SaveData("itemType",
|
|
||||||
saveContext->ship.quest.data.archipelago.locations[i].itemType);
|
|
||||||
|
|
||||||
SaveManager::Instance->SaveData("itemName",
|
SaveManager::Instance->SaveData("itemName",
|
||||||
saveContext->ship.quest.data.archipelago.locations[i].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",
|
SaveManager::Instance->SaveData("playerName",
|
||||||
saveContext->ship.quest.data.archipelago.locations[i].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));
|
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName));
|
||||||
|
|
||||||
for (uint32_t i = 0; i < ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations); i++) {
|
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, "",
|
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].itemName, "",
|
||||||
ARRAY_COUNT(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, "",
|
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].playerName, "",
|
||||||
ARRAY_COUNT(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/randomizerTypes.h"
|
||||||
#include "soh/Enhancements/randomizer/static_data.h"
|
#include "soh/Enhancements/randomizer/static_data.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
// Forward declaration
|
// Forward declaration
|
||||||
class APClient;
|
class APClient;
|
||||||
@@ -40,7 +41,7 @@ class ArchipelagoClient{
|
|||||||
const std::string GetSlotName() const;
|
const std::string GetSlotName() const;
|
||||||
|
|
||||||
const char* GetConnectionStatus();
|
const char* GetConnectionStatus();
|
||||||
const std::map<std::string, int>& GetSlotData();
|
const nlohmann::json GetSlotData();
|
||||||
const std::vector<ApItem>& GetScoutedItems();
|
const std::vector<ApItem>& GetScoutedItems();
|
||||||
|
|
||||||
bool IsConnected();
|
bool IsConnected();
|
||||||
@@ -68,7 +69,7 @@ class ArchipelagoClient{
|
|||||||
|
|
||||||
bool gameWon;
|
bool gameWon;
|
||||||
|
|
||||||
std::map<std::string, int> slotData;
|
nlohmann::json slotData;
|
||||||
std::set<int64_t> locations;
|
std::set<int64_t> locations;
|
||||||
std::vector<ApItem> scoutedItems;
|
std::vector<ApItem> scoutedItems;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user