diff options
Diffstat (limited to 'src/ap_state.cpp')
-rw-r--r-- | src/ap_state.cpp | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/src/ap_state.cpp b/src/ap_state.cpp index 8ff0ccd..e4d892b 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp | |||
@@ -4,6 +4,7 @@ | |||
4 | #define _WEBSOCKETPP_CPP11_STRICT_ | 4 | #define _WEBSOCKETPP_CPP11_STRICT_ |
5 | #pragma comment(lib, "crypt32") | 5 | #pragma comment(lib, "crypt32") |
6 | 6 | ||
7 | #include <fmt/core.h> | ||
7 | #include <hkutil/string.h> | 8 | #include <hkutil/string.h> |
8 | 9 | ||
9 | #include <any> | 10 | #include <any> |
@@ -21,6 +22,7 @@ | |||
21 | #include <tuple> | 22 | #include <tuple> |
22 | 23 | ||
23 | #include "game_data.h" | 24 | #include "game_data.h" |
25 | #include "logger.h" | ||
24 | #include "tracker_frame.h" | 26 | #include "tracker_frame.h" |
25 | #include "tracker_state.h" | 27 | #include "tracker_state.h" |
26 | 28 | ||
@@ -75,7 +77,7 @@ struct APState { | |||
75 | 77 | ||
76 | void Connect(std::string server, std::string player, std::string password) { | 78 | void Connect(std::string server, std::string player, std::string password) { |
77 | if (!initialized) { | 79 | if (!initialized) { |
78 | wxLogVerbose("Initializing APState..."); | 80 | TrackerLog("Initializing APState..."); |
79 | 81 | ||
80 | std::thread([this]() { | 82 | std::thread([this]() { |
81 | for (;;) { | 83 | for (;;) { |
@@ -91,14 +93,14 @@ struct APState { | |||
91 | }).detach(); | 93 | }).detach(); |
92 | 94 | ||
93 | for (int panel_id : GD_GetAchievementPanels()) { | 95 | for (int panel_id : GD_GetAchievementPanels()) { |
94 | tracked_data_storage_keys.push_back( | 96 | tracked_data_storage_keys.push_back(fmt::format( |
95 | "Achievement|" + GD_GetPanel(panel_id).achievement_name); | 97 | "Achievement|{}", GD_GetPanel(panel_id).achievement_name)); |
96 | } | 98 | } |
97 | 99 | ||
98 | for (const MapArea& map_area : GD_GetMapAreas()) { | 100 | for (const MapArea& map_area : GD_GetMapAreas()) { |
99 | for (const Location& location : map_area.locations) { | 101 | for (const Location& location : map_area.locations) { |
100 | tracked_data_storage_keys.push_back( | 102 | tracked_data_storage_keys.push_back( |
101 | "Hunt|" + std::to_string(location.ap_location_id)); | 103 | fmt::format("Hunt|{}", location.ap_location_id)); |
102 | } | 104 | } |
103 | } | 105 | } |
104 | 106 | ||
@@ -109,10 +111,10 @@ struct APState { | |||
109 | } | 111 | } |
110 | 112 | ||
111 | tracker_frame->SetStatusMessage("Connecting to Archipelago server...."); | 113 | tracker_frame->SetStatusMessage("Connecting to Archipelago server...."); |
112 | wxLogStatus("Connecting to Archipelago server (%s)...", server); | 114 | TrackerLog(fmt::format("Connecting to Archipelago server ({})...", server)); |
113 | 115 | ||
114 | { | 116 | { |
115 | wxLogVerbose("Destroying old AP client..."); | 117 | TrackerLog("Destroying old AP client..."); |
116 | 118 | ||
117 | std::lock_guard client_guard(client_mutex); | 119 | std::lock_guard client_guard(client_mutex); |
118 | 120 | ||
@@ -158,10 +160,10 @@ struct APState { | |||
158 | apclient->set_room_info_handler([this, player, password]() { | 160 | apclient->set_room_info_handler([this, player, password]() { |
159 | inventory.clear(); | 161 | inventory.clear(); |
160 | 162 | ||
161 | wxLogStatus("Connected to Archipelago server. Authenticating as %s %s", | 163 | TrackerLog(fmt::format( |
162 | player, | 164 | "Connected to Archipelago server. Authenticating as {} {}", player, |
163 | (password.empty() ? "without password" | 165 | (password.empty() ? "without password" |
164 | : "with password " + password)); | 166 | : "with password " + password))); |
165 | tracker_frame->SetStatusMessage( | 167 | tracker_frame->SetStatusMessage( |
166 | "Connected to Archipelago server. Authenticating..."); | 168 | "Connected to Archipelago server. Authenticating..."); |
167 | 169 | ||
@@ -173,7 +175,7 @@ struct APState { | |||
173 | [this](const std::list<int64_t>& locations) { | 175 | [this](const std::list<int64_t>& locations) { |
174 | for (const int64_t location_id : locations) { | 176 | for (const int64_t location_id : locations) { |
175 | checked_locations.insert(location_id); | 177 | checked_locations.insert(location_id); |
176 | wxLogVerbose("Location: %lld", location_id); | 178 | TrackerLog(fmt::format("Location: {}", location_id)); |
177 | } | 179 | } |
178 | 180 | ||
179 | RefreshTracker(false); | 181 | RefreshTracker(false); |
@@ -182,14 +184,14 @@ struct APState { | |||
182 | apclient->set_slot_disconnected_handler([this]() { | 184 | apclient->set_slot_disconnected_handler([this]() { |
183 | tracker_frame->SetStatusMessage( | 185 | tracker_frame->SetStatusMessage( |
184 | "Disconnected from Archipelago. Attempting to reconnect..."); | 186 | "Disconnected from Archipelago. Attempting to reconnect..."); |
185 | wxLogStatus( | 187 | TrackerLog( |
186 | "Slot disconnected from Archipelago. Attempting to reconnect..."); | 188 | "Slot disconnected from Archipelago. Attempting to reconnect..."); |
187 | }); | 189 | }); |
188 | 190 | ||
189 | apclient->set_socket_disconnected_handler([this]() { | 191 | apclient->set_socket_disconnected_handler([this]() { |
190 | tracker_frame->SetStatusMessage( | 192 | tracker_frame->SetStatusMessage( |
191 | "Disconnected from Archipelago. Attempting to reconnect..."); | 193 | "Disconnected from Archipelago. Attempting to reconnect..."); |
192 | wxLogStatus( | 194 | TrackerLog( |
193 | "Socket disconnected from Archipelago. Attempting to reconnect..."); | 195 | "Socket disconnected from Archipelago. Attempting to reconnect..."); |
194 | }); | 196 | }); |
195 | 197 | ||
@@ -197,7 +199,7 @@ struct APState { | |||
197 | [this](const std::list<APClient::NetworkItem>& items) { | 199 | [this](const std::list<APClient::NetworkItem>& items) { |
198 | for (const APClient::NetworkItem& item : items) { | 200 | for (const APClient::NetworkItem& item : items) { |
199 | inventory[item.item]++; | 201 | inventory[item.item]++; |
200 | wxLogVerbose("Item: %lld", item.item); | 202 | TrackerLog(fmt::format("Item: {}", item.item)); |
201 | } | 203 | } |
202 | 204 | ||
203 | RefreshTracker(false); | 205 | RefreshTracker(false); |
@@ -222,10 +224,10 @@ struct APState { | |||
222 | apclient->set_slot_connected_handler([this, &connection_mutex]( | 224 | apclient->set_slot_connected_handler([this, &connection_mutex]( |
223 | const nlohmann::json& slot_data) { | 225 | const nlohmann::json& slot_data) { |
224 | tracker_frame->SetStatusMessage("Connected to Archipelago!"); | 226 | tracker_frame->SetStatusMessage("Connected to Archipelago!"); |
225 | wxLogStatus("Connected to Archipelago!"); | 227 | TrackerLog("Connected to Archipelago!"); |
226 | 228 | ||
227 | data_storage_prefix = | 229 | data_storage_prefix = |
228 | "Lingo_" + std::to_string(apclient->get_player_number()) + "_"; | 230 | fmt::format("Lingo_{}_", apclient->get_player_number()); |
229 | door_shuffle_mode = slot_data["shuffle_doors"].get<DoorShuffleMode>(); | 231 | door_shuffle_mode = slot_data["shuffle_doors"].get<DoorShuffleMode>(); |
230 | color_shuffle = slot_data["shuffle_colors"].get<int>() == 1; | 232 | color_shuffle = slot_data["shuffle_colors"].get<int>() == 1; |
231 | painting_shuffle = slot_data["shuffle_paintings"].get<int>() == 1; | 233 | painting_shuffle = slot_data["shuffle_paintings"].get<int>() == 1; |
@@ -277,18 +279,18 @@ struct APState { | |||
277 | corrected_keys.push_back(data_storage_prefix + key); | 279 | corrected_keys.push_back(data_storage_prefix + key); |
278 | } | 280 | } |
279 | 281 | ||
280 | { | 282 | victory_data_storage_key = |
281 | std::ostringstream vdsks; | 283 | fmt::format("_read_client_status_{}_{}", apclient->get_team_number(), |
282 | vdsks << "_read_client_status_" << apclient->get_team_number() << "_" | 284 | apclient->get_player_number()); |
283 | << apclient->get_player_number(); | ||
284 | victory_data_storage_key = vdsks.str(); | ||
285 | } | ||
286 | 285 | ||
287 | corrected_keys.push_back(victory_data_storage_key); | 286 | corrected_keys.push_back(victory_data_storage_key); |
288 | 287 | ||
289 | apclient->Get(corrected_keys); | 288 | apclient->Get(corrected_keys); |
290 | apclient->SetNotify(corrected_keys); | 289 | apclient->SetNotify(corrected_keys); |
291 | 290 | ||
291 | ResetReachabilityRequirements(); | ||
292 | RefreshTracker(true); | ||
293 | |||
292 | { | 294 | { |
293 | std::lock_guard connection_lock(connection_mutex); | 295 | std::lock_guard connection_lock(connection_mutex); |
294 | if (!has_connection_result) { | 296 | if (!has_connection_result) { |
@@ -333,7 +335,7 @@ struct APState { | |||
333 | } | 335 | } |
334 | 336 | ||
335 | std::string full_message = hatkirby::implode(error_messages, " "); | 337 | std::string full_message = hatkirby::implode(error_messages, " "); |
336 | wxLogError(wxString(full_message)); | 338 | TrackerLog(full_message); |
337 | 339 | ||
338 | wxMessageBox(full_message, "Connection failed", wxOK | wxICON_ERROR); | 340 | wxMessageBox(full_message, "Connection failed", wxOK | wxICON_ERROR); |
339 | }); | 341 | }); |
@@ -355,7 +357,7 @@ struct APState { | |||
355 | DestroyClient(); | 357 | DestroyClient(); |
356 | 358 | ||
357 | tracker_frame->SetStatusMessage("Disconnected from Archipelago."); | 359 | tracker_frame->SetStatusMessage("Disconnected from Archipelago."); |
358 | wxLogStatus("Timeout while connecting to Archipelago server."); | 360 | TrackerLog("Timeout while connecting to Archipelago server."); |
359 | wxMessageBox("Timeout while connecting to Archipelago server.", | 361 | wxMessageBox("Timeout while connecting to Archipelago server.", |
360 | "Connection failed", wxOK | wxICON_ERROR); | 362 | "Connection failed", wxOK | wxICON_ERROR); |
361 | 363 | ||
@@ -374,9 +376,6 @@ struct APState { | |||
374 | } | 376 | } |
375 | 377 | ||
376 | if (connected) { | 378 | if (connected) { |
377 | ResetReachabilityRequirements(); | ||
378 | RefreshTracker(true); | ||
379 | } else { | ||
380 | client_active = false; | 379 | client_active = false; |
381 | } | 380 | } |
382 | } | 381 | } |
@@ -384,11 +383,12 @@ struct APState { | |||
384 | void HandleDataStorage(const std::string& key, const nlohmann::json& value) { | 383 | void HandleDataStorage(const std::string& key, const nlohmann::json& value) { |
385 | if (value.is_boolean()) { | 384 | if (value.is_boolean()) { |
386 | data_storage[key] = value.get<bool>(); | 385 | data_storage[key] = value.get<bool>(); |
387 | wxLogVerbose("Data storage %s retrieved as %s", key, | 386 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, |
388 | (value.get<bool>() ? "true" : "false")); | 387 | (value.get<bool>() ? "true" : "false"))); |
389 | } else if (value.is_number()) { | 388 | } else if (value.is_number()) { |
390 | data_storage[key] = value.get<int>(); | 389 | data_storage[key] = value.get<int>(); |
391 | wxLogVerbose("Data storage %s retrieved as %d", key, value.get<int>()); | 390 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, |
391 | value.get<int>())); | ||
392 | } else if (value.is_object()) { | 392 | } else if (value.is_object()) { |
393 | if (key.ends_with("PlayerPos")) { | 393 | if (key.ends_with("PlayerPos")) { |
394 | auto map_value = value.get<std::map<std::string, int>>(); | 394 | auto map_value = value.get<std::map<std::string, int>>(); |
@@ -397,7 +397,7 @@ struct APState { | |||
397 | data_storage[key] = value.get<std::map<std::string, int>>(); | 397 | data_storage[key] = value.get<std::map<std::string, int>>(); |
398 | } | 398 | } |
399 | 399 | ||
400 | wxLogVerbose("Data storage %s retrieved as dictionary", key); | 400 | TrackerLog(fmt::format("Data storage {} retrieved as dictionary", key)); |
401 | } else if (value.is_null()) { | 401 | } else if (value.is_null()) { |
402 | if (key.ends_with("PlayerPos")) { | 402 | if (key.ends_with("PlayerPos")) { |
403 | player_pos = std::nullopt; | 403 | player_pos = std::nullopt; |
@@ -405,7 +405,7 @@ struct APState { | |||
405 | data_storage.erase(key); | 405 | data_storage.erase(key); |
406 | } | 406 | } |
407 | 407 | ||
408 | wxLogVerbose("Data storage %s retrieved as null", key); | 408 | TrackerLog(fmt::format("Data storage {} retrieved as null", key)); |
409 | } else if (value.is_array()) { | 409 | } else if (value.is_array()) { |
410 | auto list_value = value.get<std::vector<std::string>>(); | 410 | auto list_value = value.get<std::vector<std::string>>(); |
411 | 411 | ||
@@ -416,8 +416,8 @@ struct APState { | |||
416 | data_storage[key] = list_value; | 416 | data_storage[key] = list_value; |
417 | } | 417 | } |
418 | 418 | ||
419 | wxLogVerbose("Data storage %s retrieved as list: [%s]", key, | 419 | TrackerLog(fmt::format("Data storage {} retrieved as list: [{}]", key, |
420 | hatkirby::implode(list_value, ", ")); | 420 | hatkirby::implode(list_value, ", "))); |
421 | } | 421 | } |
422 | } | 422 | } |
423 | 423 | ||
@@ -427,7 +427,7 @@ struct APState { | |||
427 | 427 | ||
428 | bool HasCheckedHuntPanel(int location_id) { | 428 | bool HasCheckedHuntPanel(int location_id) { |
429 | std::string key = | 429 | std::string key = |
430 | data_storage_prefix + "Hunt|" + std::to_string(location_id); | 430 | fmt::format("{}Hunt|{}", data_storage_prefix, location_id); |
431 | return data_storage.count(key) && std::any_cast<bool>(data_storage.at(key)); | 431 | return data_storage.count(key) && std::any_cast<bool>(data_storage.at(key)); |
432 | } | 432 | } |
433 | 433 | ||
@@ -436,12 +436,13 @@ struct APState { | |||
436 | } | 436 | } |
437 | 437 | ||
438 | bool HasAchievement(const std::string& name) { | 438 | bool HasAchievement(const std::string& name) { |
439 | std::string key = data_storage_prefix + "Achievement|" + name; | 439 | std::string key = |
440 | fmt::format("{}Achievement|{}", data_storage_prefix, name); | ||
440 | return data_storage.count(key) && std::any_cast<bool>(data_storage.at(key)); | 441 | return data_storage.count(key) && std::any_cast<bool>(data_storage.at(key)); |
441 | } | 442 | } |
442 | 443 | ||
443 | const std::set<std::string>& GetCheckedPaintings() { | 444 | const std::set<std::string>& GetCheckedPaintings() { |
444 | std::string key = data_storage_prefix + "Paintings"; | 445 | std::string key = fmt::format("{}Paintings", data_storage_prefix); |
445 | if (!data_storage.count(key)) { | 446 | if (!data_storage.count(key)) { |
446 | data_storage[key] = std::set<std::string>(); | 447 | data_storage[key] = std::set<std::string>(); |
447 | } | 448 | } |
@@ -458,7 +459,7 @@ struct APState { | |||
458 | } | 459 | } |
459 | 460 | ||
460 | void RefreshTracker(bool reset) { | 461 | void RefreshTracker(bool reset) { |
461 | wxLogVerbose("Refreshing display..."); | 462 | TrackerLog("Refreshing display..."); |
462 | 463 | ||
463 | RecalculateReachability(); | 464 | RecalculateReachability(); |
464 | 465 | ||
@@ -472,7 +473,7 @@ struct APState { | |||
472 | int64_t GetItemId(const std::string& item_name) { | 473 | int64_t GetItemId(const std::string& item_name) { |
473 | int64_t ap_id = apclient->get_item_id(item_name); | 474 | int64_t ap_id = apclient->get_item_id(item_name); |
474 | if (ap_id == APClient::INVALID_NAME_ID) { | 475 | if (ap_id == APClient::INVALID_NAME_ID) { |
475 | wxLogError("Could not find AP item ID for %s", item_name); | 476 | TrackerLog(fmt::format("Could not find AP item ID for {}", item_name)); |
476 | } | 477 | } |
477 | 478 | ||
478 | return ap_id; | 479 | return ap_id; |