From 6ea8823de147ac71563c7e3e803746e7eabf9b95 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 16 Aug 2024 00:39:50 +0200 Subject: [PATCH] Add Total Checks to Check/Item Trackers - devrando edition (#4292) * Fix fmt in savestates * Check Tracker Totals --- .../randomizer/randomizer_check_tracker.cpp | 29 +++++++++++++++++++ .../randomizer/randomizer_check_tracker.h | 2 ++ .../randomizer/randomizer_item_tracker.cpp | 28 ++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index de46a4496..f8838f827 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -138,6 +138,8 @@ u32 areasSpoiled = 0; bool showVOrMQ; s8 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" s8 areaCheckTotals[RCAREA_INVALID]; +uint16_t totalChecks = 0; +uint16_t totalChecksGotten = 0; bool optCollapseAll; // A bool that will collapse all checks once bool optExpandAll; // A bool that will expand all checks once RandomizerCheck lastLocationChecked = RC_UNKNOWN_CHECK; @@ -260,6 +262,24 @@ void TrySetAreas() { } } +void CalculateTotals() { + totalChecks = 0; + totalChecksGotten = 0; + + for (uint8_t i = 0; i < RCAREA_INVALID; i++) { + totalChecks += areaCheckTotals[i]; + totalChecksGotten += areaChecksGotten[i]; + } +} + +uint16_t GetTotalChecks() { + return totalChecks; +} + +uint16_t GetTotalChecksGotten() { + return totalChecksGotten; +} + void RecalculateAreaTotals() { for (auto [rcArea, checks] : checksByArea) { if (rcArea == RCAREA_INVALID) { @@ -278,6 +298,9 @@ void RecalculateAreaTotals() { } } } + + totalChecks = 0; + totalChecksGotten = 0; } void SetCheckCollected(RandomizerCheck rc) { @@ -957,6 +980,10 @@ void CheckTrackerWindow::DrawElement() { UIWidgets::PaddedSeparator(); + ImGui::Text("Total Checks: %d / %d", totalChecksGotten, totalChecks); + + UIWidgets::PaddedSeparator(); + //Checks Section Lead-in ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -1349,6 +1376,8 @@ void UpdateOrdering(RandomizerCheckArea rcArea) { if(checksByArea.contains(rcArea)) { std::sort(checksByArea.find(rcArea)->second.begin(), checksByArea.find(rcArea)->second.end(), CompareChecks); } + + CalculateTotals(); } bool IsEoDCheck(RandomizerCheckType type) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index c8915a8ec..60094dd02 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -51,6 +51,8 @@ bool IsCheckShuffled(RandomizerCheck rc); void InitTrackerData(bool isDebug); RandomizerCheckArea GetCheckArea(); void UpdateCheck(uint32_t, RandomizerCheckTrackerData); +uint16_t GetTotalChecks(); +uint16_t GetTotalChecksGotten(); bool IsAreaSpoiled(RandomizerCheckArea rcArea); void SetAreaSpoiled(RandomizerCheckArea rcArea); } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 6371708d6..8b7f97a69 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -316,6 +316,11 @@ typedef enum { SECTION_DISPLAY_EXTENDED_SEPARATE } ItemTrackerExtendedDisplayType; +typedef enum { + SECTION_DISPLAY_MINIMAL_HIDDEN, + SECTION_DISPLAY_MINIMAL_SEPARATE +} ItemTrackerMinimalDisplayType; + struct ItemTrackerNumbers { int currentCapacity; int maxCapacity; @@ -911,6 +916,16 @@ void DrawNotes(bool resizeable = false) { ImGui::EndGroup(); } +void DrawTotalChecks() { + uint16_t totalChecks = CheckTracker::GetTotalChecks(); + uint16_t totalChecksGotten = CheckTracker::GetTotalChecksGotten(); + + ImGui::BeginGroup(); + ImGui::SetWindowFontScale(2.5); + ImGui::Text("Checks: %d/%d", totalChecksGotten, totalChecks); + ImGui::EndGroup(); +} + // Windowing stuff ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { @@ -1313,6 +1328,14 @@ void ItemTrackerWindow::DrawElement() { DrawNotes(true); EndFloatingWindows(); } + + if (CVarGetInteger("gTrackers.ItemTracker.TotalChecks.DisplayType", SECTION_DISPLAY_MINIMAL_HIDDEN) == + SECTION_DISPLAY_MINIMAL_SEPARATE) { + ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver); + BeginFloatingWindows("Total Checks"); + DrawTotalChecks(); + EndFloatingWindows(); + } } } @@ -1324,6 +1347,7 @@ static const char* displayModes[2] = { "Always", "Combo Button Hold" }; static const char* buttons[14] = { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" }; static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Separate" }; +static const char* minimalDisplayTypes[2] = { "Hidden", "Separate" }; void ItemTrackerSettingsWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(733, 472), ImGuiCond_FirstUseEver); @@ -1459,6 +1483,10 @@ void ItemTrackerSettingsWindow::DrawElement() { shouldUpdateVectors = true; } + if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, SECTION_DISPLAY_MINIMAL_HIDDEN)) { + shouldUpdateVectors = true; + } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, SECTION_DISPLAY_HIDDEN)) { shouldUpdateVectors = true;