diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-03-08 10:52:51 -0500 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-03-08 10:52:51 -0500 |
| commit | f8f55976533ac3b77bb8d31697ba2f1e54a994c1 (patch) | |
| tree | 59b4cd49e64af291b2fd0b22711174bfd79149fa /src/ap_state.cpp | |
| parent | 5fe5bec92e86a4a94cddefec51fabc22212b7364 (diff) | |
| download | lingo-ap-tracker-f8f55976533ac3b77bb8d31697ba2f1e54a994c1.tar.gz lingo-ap-tracker-f8f55976533ac3b77bb8d31697ba2f1e54a994c1.tar.bz2 lingo-ap-tracker-f8f55976533ac3b77bb8d31697ba2f1e54a994c1.zip | |
Made indicator updates more fine-grained
Diffstat (limited to 'src/ap_state.cpp')
| -rw-r--r-- | src/ap_state.cpp | 93 |
1 files changed, 54 insertions, 39 deletions
| diff --git a/src/ap_state.cpp b/src/ap_state.cpp index 29e649f..d01290b 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp | |||
| @@ -243,7 +243,7 @@ struct APState { | |||
| 243 | checked_paintings.count(painting_mapping.at(painting_id))); | 243 | checked_paintings.count(painting_mapping.at(painting_id))); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | std::string GetItemName(int id) { return apclient->get_item_name(id); } | 246 | std::string GetItemName(int id) { return apclient->get_item_name(id, "Lingo"); } |
| 247 | 247 | ||
| 248 | void RevealPaintings() { | 248 | void RevealPaintings() { |
| 249 | std::lock_guard state_guard(state_mutex); | 249 | std::lock_guard state_guard(state_mutex); |
| @@ -369,7 +369,7 @@ struct APState { | |||
| 369 | } | 369 | } |
| 370 | } | 370 | } |
| 371 | 371 | ||
| 372 | RefreshTracker(false); | 372 | RefreshTracker(StateUpdate{.cleared_locations = true}); |
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | void OnSlotDisconnected() { | 375 | void OnSlotDisconnected() { |
| @@ -391,51 +391,53 @@ struct APState { | |||
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | void OnItemsReceived(const std::list<APClient::NetworkItem>& items) { | 393 | void OnItemsReceived(const std::list<APClient::NetworkItem>& items) { |
| 394 | std::vector<ItemState> item_states; | ||
| 395 | |||
| 394 | { | 396 | { |
| 395 | std::lock_guard state_guard(state_mutex); | 397 | std::lock_guard state_guard(state_mutex); |
| 396 | 398 | ||
| 399 | std::map<int64_t, int> index_by_item; | ||
| 400 | |||
| 397 | for (const APClient::NetworkItem& item : items) { | 401 | for (const APClient::NetworkItem& item : items) { |
| 398 | inventory[item.item]++; | 402 | inventory[item.item]++; |
| 399 | TrackerLog(fmt::format("Item: {}", item.item)); | 403 | TrackerLog(fmt::format("Item: {}", item.item)); |
| 404 | |||
| 405 | index_by_item[item.item] = item.index; | ||
| 406 | } | ||
| 407 | |||
| 408 | for (const auto& [item_id, item_index] : index_by_item) { | ||
| 409 | item_states.push_back(ItemState{.name = GetItemName(item_id), | ||
| 410 | .amount = inventory[item_id], | ||
| 411 | .index = item_index}); | ||
| 400 | } | 412 | } |
| 401 | } | 413 | } |
| 402 | 414 | ||
| 403 | RefreshTracker(false); | 415 | RefreshTracker(StateUpdate{.items = item_states}); |
| 404 | } | 416 | } |
| 405 | 417 | ||
| 406 | void OnRetrieved(const std::map<std::string, nlohmann::json>& data) { | 418 | void OnRetrieved(const std::map<std::string, nlohmann::json>& data) { |
| 419 | StateUpdate state_update; | ||
| 420 | |||
| 407 | { | 421 | { |
| 408 | std::lock_guard state_guard(state_mutex); | 422 | std::lock_guard state_guard(state_mutex); |
| 409 | 423 | ||
| 410 | for (const auto& [key, value] : data) { | 424 | for (const auto& [key, value] : data) { |
| 411 | HandleDataStorage(key, value); | 425 | HandleDataStorage(key, value, state_update); |
| 412 | } | 426 | } |
| 413 | } | 427 | } |
| 414 | 428 | ||
| 415 | RefreshTracker(false); | 429 | RefreshTracker(state_update); |
| 416 | } | 430 | } |
| 417 | 431 | ||
| 418 | void OnSetReply(const std::string& key, const nlohmann::json& value) { | 432 | void OnSetReply(const std::string& key, const nlohmann::json& value) { |
| 419 | bool should_refresh = false; | 433 | StateUpdate state_update; |
| 420 | bool should_redraw_position = false; | 434 | |
| 421 | { | 435 | { |
| 422 | std::lock_guard state_guard(state_mutex); | 436 | std::lock_guard state_guard(state_mutex); |
| 423 | HandleDataStorage(key, value); | 437 | HandleDataStorage(key, value, state_update); |
| 424 | |||
| 425 | if (key.ends_with("PlayerPos")) | ||
| 426 | { | ||
| 427 | should_redraw_position = true; | ||
| 428 | } else { | ||
| 429 | should_refresh = true; | ||
| 430 | } | ||
| 431 | } | 438 | } |
| 432 | 439 | ||
| 433 | if (should_refresh) | 440 | RefreshTracker(state_update); |
| 434 | { | ||
| 435 | RefreshTracker(false); | ||
| 436 | } else if (should_redraw_position) { | ||
| 437 | tracker_frame->RedrawPosition(); | ||
| 438 | } | ||
| 439 | } | 441 | } |
| 440 | 442 | ||
| 441 | void OnSlotConnected(std::string player, std::string server, | 443 | void OnSlotConnected(std::string player, std::string server, |
| @@ -531,7 +533,7 @@ struct APState { | |||
| 531 | } | 533 | } |
| 532 | 534 | ||
| 533 | ResetReachabilityRequirements(); | 535 | ResetReachabilityRequirements(); |
| 534 | RefreshTracker(true); | 536 | RefreshTracker(std::nullopt); |
| 535 | } | 537 | } |
| 536 | 538 | ||
| 537 | void OnSlotRefused(const std::list<std::string>& errors) { | 539 | void OnSlotRefused(const std::list<std::string>& errors) { |
| @@ -574,11 +576,15 @@ struct APState { | |||
| 574 | } | 576 | } |
| 575 | 577 | ||
| 576 | // Assumes state mutex is locked. | 578 | // Assumes state mutex is locked. |
| 577 | void HandleDataStorage(const std::string& key, const nlohmann::json& value) { | 579 | void HandleDataStorage(const std::string& key, const nlohmann::json& value, StateUpdate& state_update) { |
| 578 | if (value.is_boolean()) { | 580 | if (value.is_boolean()) { |
| 579 | data_storage[key] = value.get<bool>(); | 581 | data_storage[key] = value.get<bool>(); |
| 580 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, | 582 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, |
| 581 | (value.get<bool>() ? "true" : "false"))); | 583 | (value.get<bool>() ? "true" : "false"))); |
| 584 | |||
| 585 | if (key.find("Achievement|") != std::string::npos) { | ||
| 586 | state_update.achievements = true; | ||
| 587 | } | ||
| 582 | } else if (value.is_number()) { | 588 | } else if (value.is_number()) { |
| 583 | data_storage[key] = value.get<int>(); | 589 | data_storage[key] = value.get<int>(); |
| 584 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, | 590 | TrackerLog(fmt::format("Data storage {} retrieved as {}", key, |
| @@ -587,6 +593,7 @@ struct APState { | |||
| 587 | if (key.ends_with("PlayerPos")) { | 593 | if (key.ends_with("PlayerPos")) { |
| 588 | auto map_value = value.get<std::map<std::string, int>>(); | 594 | auto map_value = value.get<std::map<std::string, int>>(); |
| 589 | player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]); | 595 | player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]); |
| 596 | state_update.player_position = true; | ||
| 590 | } else { | 597 | } else { |
| 591 | data_storage[key] = value.get<std::map<std::string, int>>(); | 598 | data_storage[key] = value.get<std::map<std::string, int>>(); |
| 592 | } | 599 | } |
| @@ -595,6 +602,7 @@ struct APState { | |||
| 595 | } else if (value.is_null()) { | 602 | } else if (value.is_null()) { |
| 596 | if (key.ends_with("PlayerPos")) { | 603 | if (key.ends_with("PlayerPos")) { |
| 597 | player_pos = std::nullopt; | 604 | player_pos = std::nullopt; |
| 605 | state_update.player_position = true; | ||
| 598 | } else { | 606 | } else { |
| 599 | data_storage.erase(key); | 607 | data_storage.erase(key); |
| 600 | } | 608 | } |
| @@ -606,6 +614,8 @@ struct APState { | |||
| 606 | if (key.ends_with("Paintings")) { | 614 | if (key.ends_with("Paintings")) { |
| 607 | data_storage[key] = | 615 | data_storage[key] = |
| 608 | std::set<std::string>(list_value.begin(), list_value.end()); | 616 | std::set<std::string>(list_value.begin(), list_value.end()); |
| 617 | state_update.paintings = | ||
| 618 | std::vector<std::string>(list_value.begin(), list_value.end()); | ||
| 609 | } else { | 619 | } else { |
| 610 | data_storage[key] = list_value; | 620 | data_storage[key] = list_value; |
| 611 | } | 621 | } |
| @@ -616,29 +626,34 @@ struct APState { | |||
| 616 | } | 626 | } |
| 617 | 627 | ||
| 618 | // State mutex should NOT be locked. | 628 | // State mutex should NOT be locked. |
| 619 | void RefreshTracker(bool reset) { | 629 | // nullopt state_update indicates a reset. |
| 630 | void RefreshTracker(std::optional<StateUpdate> state_update) { | ||
| 620 | TrackerLog("Refreshing display..."); | 631 | TrackerLog("Refreshing display..."); |
| 621 | 632 | ||
| 622 | std::string prev_msg; | 633 | if (!state_update || !state_update->items.empty() || |
| 623 | { | 634 | !state_update->paintings.empty()) { |
| 624 | std::lock_guard state_guard(state_mutex); | 635 | std::string prev_msg; |
| 636 | { | ||
| 637 | std::lock_guard state_guard(state_mutex); | ||
| 625 | 638 | ||
| 626 | prev_msg = status_message; | 639 | prev_msg = status_message; |
| 627 | SetStatusMessage(fmt::format("{} Recalculating...", status_message)); | 640 | SetStatusMessage(fmt::format("{} Recalculating...", status_message)); |
| 628 | } | 641 | } |
| 629 | 642 | ||
| 630 | RecalculateReachability(); | 643 | RecalculateReachability(); |
| 631 | 644 | ||
| 632 | if (reset) { | 645 | { |
| 633 | tracker_frame->ResetIndicators(); | 646 | std::lock_guard state_guard(state_mutex); |
| 634 | } else { | ||
| 635 | tracker_frame->UpdateIndicators(); | ||
| 636 | } | ||
| 637 | 647 | ||
| 638 | { | 648 | SetStatusMessage(prev_msg); |
| 639 | std::lock_guard state_guard(state_mutex); | 649 | } |
| 650 | } | ||
| 651 | |||
| 640 | 652 | ||
| 641 | SetStatusMessage(prev_msg); | 653 | if (!state_update) { |
| 654 | tracker_frame->ResetIndicators(); | ||
| 655 | } else { | ||
| 656 | tracker_frame->UpdateIndicators(*state_update); | ||
| 642 | } | 657 | } |
| 643 | } | 658 | } |
| 644 | 659 | ||
