From 3037b9305b10b58e01055c21bbce223d7b2c673f Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 3 Apr 2024 14:33:30 -0400 Subject: Added player position tracking --- src/ap_state.cpp | 58 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 19 deletions(-) (limited to 'src/ap_state.cpp') diff --git a/src/ap_state.cpp b/src/ap_state.cpp index 8134cdb..58670e6 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp @@ -54,6 +54,7 @@ struct APState { std::map inventory; std::set checked_locations; std::map data_storage; + std::optional> player_pos; DoorShuffleMode door_shuffle_mode = kNO_DOORS; bool color_shuffle = false; @@ -95,6 +96,8 @@ struct APState { } } + tracked_data_storage_keys.push_back("PlayerPos"); + initialized = true; } @@ -122,6 +125,7 @@ struct APState { inventory.clear(); checked_locations.clear(); data_storage.clear(); + player_pos = std::nullopt; victory_data_storage_key.clear(); door_shuffle_mode = kNO_DOORS; color_shuffle = false; @@ -187,15 +191,7 @@ struct APState { apclient->set_retrieved_handler( [this](const std::map& data) { for (const auto& [key, value] : data) { - if (value.is_boolean()) { - data_storage[key] = value.get(); - TrackerLog("Data storage " + key + " retrieved as " + - (value.get() ? "true" : "false")); - } else if (value.is_number()) { - data_storage[key] = value.get(); - TrackerLog("Data storage " + key + " retrieved as " + - std::to_string(value.get())); - } + HandleDataStorage(key, value); } RefreshTracker(); @@ -204,16 +200,7 @@ struct APState { apclient->set_set_reply_handler([this](const std::string& key, const nlohmann::json& value, const nlohmann::json&) { - if (value.is_boolean()) { - data_storage[key] = value.get(); - TrackerLog("Data storage " + key + " retrieved as " + - (value.get() ? "true" : "false")); - } else if (value.is_number()) { - data_storage[key] = value.get(); - TrackerLog("Data storage " + key + " retrieved as " + - std::to_string(value.get())); - } - + HandleDataStorage(key, value); RefreshTracker(); }); @@ -335,6 +322,35 @@ struct APState { } } + void HandleDataStorage(const std::string& key, const nlohmann::json& value) { + if (value.is_boolean()) { + data_storage[key] = value.get(); + TrackerLog("Data storage " + key + " retrieved as " + + (value.get() ? "true" : "false")); + } else if (value.is_number()) { + data_storage[key] = value.get(); + TrackerLog("Data storage " + key + " retrieved as " + + std::to_string(value.get())); + } else if (value.is_object()) { + if (key.ends_with("PlayerPos")) { + auto map_value = value.get>(); + player_pos = std::tuple(map_value["x"], map_value["z"]); + } else { + data_storage[key] = value.get>(); + } + + TrackerLog("Data storage " + key + " retrieved as dictionary"); + } else if (value.is_null()) { + if (key.ends_with("PlayerPos")) { + player_pos = std::nullopt; + } else { + data_storage.erase(key); + } + + TrackerLog("Data storage " + key + " retrieved as null"); + } + } + bool HasCheckedGameLocation(int location_id) { return checked_locations.count(location_id); } @@ -446,3 +462,7 @@ bool AP_HasAchievement(const std::string& achievement_name) { bool AP_HasEarlyColorHallways() { return GetState().early_color_hallways; } bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); } + +std::optional> AP_GetPlayerPosition() { + return GetState().player_pos; +} -- cgit 1.4.1