From 98487c58c31bf0ce49d89c0bb9c7c173f2ad978d Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 27 Apr 2024 15:10:40 -0400 Subject: Fix pilgrimage detection when sunwarp shuffle is on --- src/tracker_state.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'src/tracker_state.cpp') diff --git a/src/tracker_state.cpp b/src/tracker_state.cpp index 0101e98..640a159 100644 --- a/src/tracker_state.cpp +++ b/src/tracker_state.cpp @@ -27,7 +27,7 @@ TrackerState& GetState() { class StateCalculator; struct StateCalculatorOptions { - std::string start = "Menu"; + int start; bool pilgrimage = false; StateCalculator* parent = nullptr; }; @@ -42,8 +42,7 @@ class StateCalculator { void Calculate() { std::list panel_boundary; std::list flood_boundary; - flood_boundary.push_back( - {.destination_room = GD_GetRoomByName(options_.start)}); + flood_boundary.push_back({.destination_room = options_.start}); bool reachable_changed = true; while (reachable_changed) { @@ -328,21 +327,32 @@ class StateCalculator { } } - static const std::vector> - pilgrimage_pairs = { - {"Crossroads", "Hot Crusts Area"}, - // {"Orange Tower Third Floor", "Orange Tower Third Floor"}, - {"Outside The Initiated", "Orange Tower First Floor"}, - {"Outside The Undeterred", "Orange Tower Fourth Floor"}, - {"Color Hunt", "Outside The Agreeable"}}; + std::vector> pilgrimage_pairs; + if (AP_IsSunwarpShuffle()) { + pilgrimage_pairs = std::vector>(5); - for (const auto& [from_room, to_room] : pilgrimage_pairs) { + for (const auto& [start_index, mapping] : AP_GetSunwarpMapping()) { + if (mapping.dots > 1) { + std::get<1>(pilgrimage_pairs[mapping.dots - 2]) = start_index; + } + if (mapping.dots < 6) { + std::get<0>(pilgrimage_pairs[mapping.dots - 1]) = + mapping.exit_index; + } + } + } else { + pilgrimage_pairs = {{6, 1}, {8, 3}, {9, 4}, {10, 5}}; + } + + for (const auto& [from_sunwarp, to_sunwarp] : pilgrimage_pairs) { StateCalculator pilgrimage_calculator( - {.start = from_room, .pilgrimage = true, .parent = this}); + {.start = GD_GetRoomForSunwarp(from_sunwarp), + .pilgrimage = true, + .parent = this}); pilgrimage_calculator.Calculate(); if (!pilgrimage_calculator.GetReachableRooms().count( - GD_GetRoomByName(to_room))) { + GD_GetRoomForSunwarp(to_sunwarp))) { return kMaybe; } } @@ -390,7 +400,7 @@ class StateCalculator { } // namespace void RecalculateReachability() { - StateCalculator state_calculator; + StateCalculator state_calculator({.start = GD_GetRoomByName("Menu")}); state_calculator.Calculate(); const std::set& reachable_rooms = state_calculator.GetReachableRooms(); -- cgit 1.4.1