diff options
| author | Garrett Cox <garrettjcox@gmail.com> | 2024-11-03 14:26:39 -0600 |
|---|---|---|
| committer | Garrett Cox <garrettjcox@gmail.com> | 2024-11-03 14:26:39 -0600 |
| commit | 7fa63244e4d2f1dbfab9babeb9ddd670f57fbc60 (patch) | |
| tree | 7bb4b4be25b8c8a12e7b74a9e68487fcec87a16c /mm/2s2h/Rando/CheckTracker/CheckTracker.cpp | |
| parent | 0e4a2e9fc8ca15a046c81a460b9716028f6dece6 (diff) | |
PoC glitchless playthrough implementation
Diffstat (limited to 'mm/2s2h/Rando/CheckTracker/CheckTracker.cpp')
| -rw-r--r-- | mm/2s2h/Rando/CheckTracker/CheckTracker.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp new file mode 100644 index 000000000..fcfcc318d --- /dev/null +++ b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp @@ -0,0 +1,59 @@ + +#include "CheckTracker.h" +#include "2s2h/ShipUtils.h" + +namespace Rando { + +namespace CheckTracker { + +void FindReachableRegions(RandoRegionId currentRegion, std::set<RandoRegionId>& reachableRegions) { + auto& randoStaticRegion = Rando::StaticData::Regions[currentRegion]; + + for (auto& [neighborRegionId, accessLogicFunc] : randoStaticRegion.regions) { + // Check if the region is accessible and hasn’t been visited yet + if (reachableRegions.count(neighborRegionId) == 0 && accessLogicFunc()) { + reachableRegions.insert(neighborRegionId); // Mark region as visited + FindReachableRegions(neighborRegionId, reachableRegions); // Recursively visit neighbors + } + } +} + +void Window::DrawElement() { + std::set<RandoRegionId> reachableRegions = { RR_CLOCK_TOWN_SOUTH }; + FindReachableRegions(RR_CLOCK_TOWN_SOUTH, reachableRegions); + + for (RandoRegionId regionId : reachableRegions) { + auto& randoStaticRegion = Rando::StaticData::Regions[regionId]; + std::vector<RandoCheckId> availableChecks; + + for (auto& [randoCheckId, accessLogicFunc] : randoStaticRegion.checks) { + auto& randoStaticCheck = Rando::StaticData::Checks[randoCheckId]; + auto& randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId]; + if (randoSaveCheck.shuffled && !randoSaveCheck.obtained && accessLogicFunc()) { + availableChecks.push_back(randoCheckId); + } + } + + if (availableChecks.size() > 0) { + std::string regionName = Ship_GetSceneName(randoStaticRegion.sceneId); + if (randoStaticRegion.name != "") { + regionName += " - "; + regionName += randoStaticRegion.name; + } + ImGui::SeparatorText(regionName.c_str()); + + for (RandoCheckId checkId : availableChecks) { + auto& randoStaticCheck = Rando::StaticData::Checks[checkId]; + ImGui::Text("%s", randoStaticCheck.name); + } + } + } +} + +void SettingsWindow::DrawElement() { + ImGui::Text("Check Tracker Settings"); +} + +} // namespace CheckTracker + +} // namespace Rando |
