diff options
Diffstat (limited to 'src/ap_state.cpp')
-rw-r--r-- | src/ap_state.cpp | 58 |
1 files changed, 39 insertions, 19 deletions
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 { | |||
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; |
@@ -95,6 +96,8 @@ struct APState { | |||
95 | } | 96 | } |
96 | } | 97 | } |
97 | 98 | ||
99 | tracked_data_storage_keys.push_back("PlayerPos"); | ||
100 | |||
98 | initialized = true; | 101 | initialized = true; |
99 | } | 102 | } |
100 | 103 | ||
@@ -122,6 +125,7 @@ struct APState { | |||
122 | inventory.clear(); | 125 | inventory.clear(); |
123 | checked_locations.clear(); | 126 | checked_locations.clear(); |
124 | data_storage.clear(); | 127 | data_storage.clear(); |
128 | player_pos = std::nullopt; | ||
125 | victory_data_storage_key.clear(); | 129 | victory_data_storage_key.clear(); |
126 | door_shuffle_mode = kNO_DOORS; | 130 | door_shuffle_mode = kNO_DOORS; |
127 | color_shuffle = false; | 131 | color_shuffle = false; |
@@ -187,15 +191,7 @@ struct APState { | |||
187 | apclient->set_retrieved_handler( | 191 | apclient->set_retrieved_handler( |
188 | [this](const std::map<std::string, nlohmann::json>& data) { | 192 | [this](const std::map<std::string, nlohmann::json>& data) { |
189 | for (const auto& [key, value] : data) { | 193 | for (const auto& [key, value] : data) { |
190 | if (value.is_boolean()) { | 194 | HandleDataStorage(key, value); |
191 | data_storage[key] = value.get<bool>(); | ||
192 | TrackerLog("Data storage " + key + " retrieved as " + | ||
193 | (value.get<bool>() ? "true" : "false")); | ||
194 | } else if (value.is_number()) { | ||
195 | data_storage[key] = value.get<int>(); | ||
196 | TrackerLog("Data storage " + key + " retrieved as " + | ||
197 | std::to_string(value.get<int>())); | ||
198 | } | ||
199 | } | 195 | } |
200 | 196 | ||
201 | RefreshTracker(); | 197 | RefreshTracker(); |
@@ -204,16 +200,7 @@ struct APState { | |||
204 | apclient->set_set_reply_handler([this](const std::string& key, | 200 | apclient->set_set_reply_handler([this](const std::string& key, |
205 | const nlohmann::json& value, | 201 | const nlohmann::json& value, |
206 | const nlohmann::json&) { | 202 | const nlohmann::json&) { |
207 | if (value.is_boolean()) { | 203 | HandleDataStorage(key, value); |
208 | data_storage[key] = value.get<bool>(); | ||
209 | TrackerLog("Data storage " + key + " retrieved as " + | ||
210 | (value.get<bool>() ? "true" : "false")); | ||
211 | } else if (value.is_number()) { | ||
212 | data_storage[key] = value.get<int>(); | ||
213 | TrackerLog("Data storage " + key + " retrieved as " + | ||
214 | std::to_string(value.get<int>())); | ||
215 | } | ||
216 | |||
217 | RefreshTracker(); | 204 | RefreshTracker(); |
218 | }); | 205 | }); |
219 | 206 | ||
@@ -335,6 +322,35 @@ struct APState { | |||
335 | } | 322 | } |
336 | } | 323 | } |
337 | 324 | ||
325 | void HandleDataStorage(const std::string& key, const nlohmann::json& value) { | ||
326 | if (value.is_boolean()) { | ||
327 | data_storage[key] = value.get<bool>(); | ||
328 | TrackerLog("Data storage " + key + " retrieved as " + | ||
329 | (value.get<bool>() ? "true" : "false")); | ||
330 | } else if (value.is_number()) { | ||
331 | data_storage[key] = value.get<int>(); | ||
332 | TrackerLog("Data storage " + key + " retrieved as " + | ||
333 | std::to_string(value.get<int>())); | ||
334 | } else if (value.is_object()) { | ||
335 | if (key.ends_with("PlayerPos")) { | ||
336 | auto map_value = value.get<std::map<std::string, int>>(); | ||
337 | player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]); | ||
338 | } else { | ||
339 | data_storage[key] = value.get<std::map<std::string, int>>(); | ||
340 | } | ||
341 | |||
342 | TrackerLog("Data storage " + key + " retrieved as dictionary"); | ||
343 | } else if (value.is_null()) { | ||
344 | if (key.ends_with("PlayerPos")) { | ||
345 | player_pos = std::nullopt; | ||
346 | } else { | ||
347 | data_storage.erase(key); | ||
348 | } | ||
349 | |||
350 | TrackerLog("Data storage " + key + " retrieved as null"); | ||
351 | } | ||
352 | } | ||
353 | |||
338 | bool HasCheckedGameLocation(int location_id) { | 354 | bool HasCheckedGameLocation(int location_id) { |
339 | return checked_locations.count(location_id); | 355 | return checked_locations.count(location_id); |
340 | } | 356 | } |
@@ -446,3 +462,7 @@ bool AP_HasAchievement(const std::string& achievement_name) { | |||
446 | bool AP_HasEarlyColorHallways() { return GetState().early_color_hallways; } | 462 | bool AP_HasEarlyColorHallways() { return GetState().early_color_hallways; } |
447 | 463 | ||
448 | bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); } | 464 | bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); } |
465 | |||
466 | std::optional<std::tuple<int, int>> AP_GetPlayerPosition() { | ||
467 | return GetState().player_pos; | ||
468 | } | ||