about summary refs log tree commit diff stats
path: root/src/ap_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ap_state.cpp')
-rw-r--r--src/ap_state.cpp60
1 files changed, 40 insertions, 20 deletions
diff --git a/src/ap_state.cpp b/src/ap_state.cpp index 1ac6575..aeed914 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp
@@ -27,7 +27,7 @@
27 27
28constexpr int AP_MAJOR = 0; 28constexpr int AP_MAJOR = 0;
29constexpr int AP_MINOR = 4; 29constexpr int AP_MINOR = 4;
30constexpr int AP_REVISION = 0; 30constexpr int AP_REVISION = 5;
31 31
32constexpr const char* CERT_STORE_PATH = "cacert.pem"; 32constexpr const char* CERT_STORE_PATH = "cacert.pem";
33constexpr int ITEM_HANDLING = 7; // <- all 33constexpr int ITEM_HANDLING = 7; // <- all
@@ -54,6 +54,7 @@ struct APState {
54 std::map<int64_t, int> inventory; 54 std::map<int64_t, int> inventory;
55 std::set<int64_t> checked_locations; 55 std::set<int64_t> checked_locations;
56 std::map<std::string, std::any> data_storage; 56 std::map<std::string, std::any> data_storage;
57 std::optional<std::tuple<int, int>> player_pos;
57 58
58 DoorShuffleMode door_shuffle_mode = kNO_DOORS; 59 DoorShuffleMode door_shuffle_mode = kNO_DOORS;
59 bool color_shuffle = false; 60 bool color_shuffle = false;
@@ -101,6 +102,8 @@ struct APState {
101 } 102 }
102 } 103 }
103 104
105 tracked_data_storage_keys.push_back("PlayerPos");
106
104 initialized = true; 107 initialized = true;
105 } 108 }
106 109
@@ -128,6 +131,7 @@ struct APState {
128 inventory.clear(); 131 inventory.clear();
129 checked_locations.clear(); 132 checked_locations.clear();
130 data_storage.clear(); 133 data_storage.clear();
134 player_pos = std::nullopt;
131 victory_data_storage_key.clear(); 135 victory_data_storage_key.clear();
132 door_shuffle_mode = kNO_DOORS; 136 door_shuffle_mode = kNO_DOORS;
133 color_shuffle = false; 137 color_shuffle = false;
@@ -199,15 +203,7 @@ struct APState {
199 apclient->set_retrieved_handler( 203 apclient->set_retrieved_handler(
200 [this](const std::map<std::string, nlohmann::json>& data) { 204 [this](const std::map<std::string, nlohmann::json>& data) {
201 for (const auto& [key, value] : data) { 205 for (const auto& [key, value] : data) {
202 if (value.is_boolean()) { 206 HandleDataStorage(key, value);
203 data_storage[key] = value.get<bool>();
204 TrackerLog("Data storage " + key + " retrieved as " +
205 (value.get<bool>() ? "true" : "false"));
206 } else if (value.is_number()) {
207 data_storage[key] = value.get<int>();
208 TrackerLog("Data storage " + key + " retrieved as " +
209 std::to_string(value.get<int>()));
210 }
211 } 207 }
212 208
213 RefreshTracker(); 209 RefreshTracker();
@@ -216,16 +212,7 @@ struct APState {
216 apclient->set_set_reply_handler([this](const std::string& key, 212 apclient->set_set_reply_handler([this](const std::string& key,
217 const nlohmann::json& value, 213 const nlohmann::json& value,
218 const nlohmann::json&) { 214 const nlohmann::json&) {
219 if (value.is_boolean()) { 215 HandleDataStorage(key, value);
220 data_storage[key] = value.get<bool>();
221 TrackerLog("Data storage " + key + " retrieved as " +
222 (value.get<bool>() ? "true" : "false"));
223 } else if (value.is_number()) {
224 data_storage[key] = value.get<int>();
225 TrackerLog("Data storage " + key + " retrieved as " +
226 std::to_string(value.get<int>()));
227 }
228
229 RefreshTracker(); 216 RefreshTracker();
230 }); 217 });
231 218
@@ -369,6 +356,35 @@ struct APState {
369 } 356 }
370 } 357 }
371 358
359 void HandleDataStorage(const std::string& key, const nlohmann::json& value) {
360 if (value.is_boolean()) {
361 data_storage[key] = value.get<bool>();
362 TrackerLog("Data storage " + key + " retrieved as " +
363 (value.get<bool>() ? "true" : "false"));
364 } else if (value.is_number()) {
365 data_storage[key] = value.get<int>();
366 TrackerLog("Data storage " + key + " retrieved as " +
367 std::to_string(value.get<int>()));
368 } else if (value.is_object()) {
369 if (key.ends_with("PlayerPos")) {
370 auto map_value = value.get<std::map<std::string, int>>();
371 player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]);
372 } else {
373 data_storage[key] = value.get<std::map<std::string, int>>();
374 }
375
376 TrackerLog("Data storage " + key + " retrieved as dictionary");
377 } else if (value.is_null()) {
378 if (key.ends_with("PlayerPos")) {
379 player_pos = std::nullopt;
380 } else {
381 data_storage.erase(key);
382 }
383
384 TrackerLog("Data storage " + key + " retrieved as null");
385 }
386 }
387
372 bool HasCheckedGameLocation(int location_id) { 388 bool HasCheckedGameLocation(int location_id) {
373 return checked_locations.count(location_id); 389 return checked_locations.count(location_id);
374 } 390 }
@@ -498,3 +514,7 @@ const std::map<int, SunwarpMapping>& AP_GetSunwarpMapping() {
498} 514}
499 515
500bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); } 516bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); }
517
518std::optional<std::tuple<int, int>> AP_GetPlayerPosition() {
519 return GetState().player_pos;
520}