diff options
Diffstat (limited to 'mm/2s2h/Rando/CheckTracker/CheckTracker.cpp')
| -rw-r--r-- | mm/2s2h/Rando/CheckTracker/CheckTracker.cpp | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp index 8a5c53a9f..84e8aaa69 100644 --- a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp +++ b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp @@ -58,7 +58,7 @@ float trackerScale = 1.0f; float searchBoxPadding = 15.0f; ImVec4 trackerBG = ImVec4{ 0, 0, 0, 0.5f }; -std::map<SceneId, std::vector<RandoCheckId>> sceneChecks; +std::map<SceneId, std::set<RandoCheckId>> sceneChecks; std::vector<SceneId> sortedSceneIds; std::unordered_map<RandoCheckId, std::string> accessLogicFuncs; @@ -125,8 +125,58 @@ void initializeSceneChecks() { continue; } + // Skip Grotto Checks, they will be handled below + if (randoStaticCheck.sceneId == SCENE_KAKUSIANA) { + continue; + } + + // Skip Enemy Drops, they will be handled below + if (randoStaticCheck.randoCheckType == RCTYPE_ENEMY_DROP) { + continue; + } + SceneId sceneId = (SceneId)Play_GetOriginalSceneId(randoStaticCheck.sceneId); - sceneChecks[sceneId].push_back(randoStaticCheck.randoCheckId); + sceneChecks[sceneId].insert(randoStaticCheck.randoCheckId); + } + + for (auto& [regionId, staticRegion] : Rando::Logic::Regions) { + // Handle grottos separately, their checks are assigned to the connected region + if (staticRegion.sceneId == SCENE_KAKUSIANA) { + RandoRegionId connectedRegionId = RR_MAX; + if (regionId == RR_LONE_PEAK_SHRINE) { + connectedRegionId = RR_LONE_PEAK_SHRINE; + } else { + for (auto& [entrance, _] : staticRegion.exits) { + connectedRegionId = Rando::Logic::GetRegionIdFromEntrance(entrance); + } + for (auto& [regionId, _] : staticRegion.connections) { + connectedRegionId = regionId; + } + if (connectedRegionId == RR_MAX) { + continue; + } + } + SceneId connectedSceneId = Rando::Logic::Regions[connectedRegionId].sceneId; + for (auto& [randoCheckId, _] : staticRegion.checks) { + RandoSaveCheck& randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId]; + if (!randoSaveCheck.shuffled) { + continue; + } + sceneChecks[connectedSceneId].insert(randoCheckId); + } + } else { + // Handle enemy drop seperately, they can be in multiple regions + for (auto& [randoCheckId, _] : staticRegion.checks) { + auto& randoStaticCheck = Rando::StaticData::Checks[randoCheckId]; + RandoSaveCheck& randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId]; + if (!randoSaveCheck.shuffled || randoStaticCheck.randoCheckType != RCTYPE_ENEMY_DROP) { + continue; + } + + SceneId sceneId = (SceneId)Play_GetOriginalSceneId(staticRegion.sceneId); + sceneChecks[sceneId].insert(randoCheckId); + } + } } sortedSceneIds.clear(); @@ -268,9 +318,6 @@ void CheckTrackerDrawNonLogicalList() { ImGui::Separator(); ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0, 0, 0, 0)); std::string headerText = Ship_GetSceneName(sceneId); - if (sceneId == SCENE_SPOT00) { - headerText = "Various Regions"; - } headerText += " (" + std::to_string(obtainedCheckSum) + "/" + std::to_string(unfilteredChecks.size()) + ")"; ImGui::PushStyleColor(ImGuiCol_Text, obtainedCheckSum == unfilteredChecks.size() |
