about summary refs log tree commit diff stats
path: root/src/tracker_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker_state.cpp')
-rw-r--r--src/tracker_state.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/src/tracker_state.cpp b/src/tracker_state.cpp index eaf3e6b..14d302b 100644 --- a/src/tracker_state.cpp +++ b/src/tracker_state.cpp
@@ -1,5 +1,8 @@
1#include "tracker_state.h" 1#include "tracker_state.h"
2 2
3#include <fmt/core.h>
4#include <hkutil/string.h>
5
3#include <list> 6#include <list>
4#include <map> 7#include <map>
5#include <mutex> 8#include <mutex>
@@ -9,6 +12,7 @@
9 12
10#include "ap_state.h" 13#include "ap_state.h"
11#include "game_data.h" 14#include "game_data.h"
15#include "logger.h"
12 16
13namespace { 17namespace {
14 18
@@ -231,7 +235,9 @@ class StateCalculator {
231 PaintingExit target_painting = 235 PaintingExit target_painting =
232 GD_GetPaintingExit(GD_GetPaintingByName( 236 GD_GetPaintingExit(GD_GetPaintingByName(
233 AP_GetPaintingMapping().at(cur_painting.internal_id))); 237 AP_GetPaintingMapping().at(cur_painting.internal_id)));
238 painting_exit.source_room = cur_painting.room;
234 painting_exit.destination_room = target_painting.room; 239 painting_exit.destination_room = target_painting.room;
240 painting_exit.type = EntranceType::kPainting;
235 241
236 new_boundary.push_back(painting_exit); 242 new_boundary.push_back(painting_exit);
237 } 243 }
@@ -258,6 +264,12 @@ class StateCalculator {
258 reachable_rooms_.insert(room_exit.destination_room); 264 reachable_rooms_.insert(room_exit.destination_room);
259 reachable_changed = true; 265 reachable_changed = true;
260 266
267#ifndef NDEBUG
268 std::list<int> room_path = paths_[room_exit.source_room];
269 room_path.push_back(room_exit.destination_room);
270 paths_[room_exit.destination_room] = room_path;
271#endif
272
261 const Room& room_obj = GD_GetRoom(room_exit.destination_room); 273 const Room& room_obj = GD_GetRoom(room_exit.destination_room);
262 for (const Exit& out_edge : room_obj.exits) { 274 for (const Exit& out_edge : room_obj.exits) {
263 if (out_edge.type == EntranceType::kPainting && 275 if (out_edge.type == EntranceType::kPainting &&
@@ -296,20 +308,33 @@ class StateCalculator {
296 308
297 if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") { 309 if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") {
298 new_boundary.push_back( 310 new_boundary.push_back(
299 {.destination_room = GD_GetRoomByName("Outside The Undeterred"), 311 {.source_room = room_exit.destination_room,
312 .destination_room = GD_GetRoomByName("Outside The Undeterred"),
300 .type = EntranceType::kPainting}); 313 .type = EntranceType::kPainting});
301 } 314 }
302 315
303 if (AP_IsPilgrimageEnabled()) { 316 if (AP_IsPilgrimageEnabled()) {
304 if (room_obj.name == "Hub Room") { 317 int pilgrimage_start_id = GD_GetRoomByName("Hub Room");
318 if (AP_IsSunwarpShuffle()) {
319 for (const auto& [start_index, mapping] :
320 AP_GetSunwarpMapping()) {
321 if (mapping.dots == 1) {
322 pilgrimage_start_id = GD_GetRoomForSunwarp(start_index);
323 }
324 }
325 }
326
327 if (room_exit.destination_room == pilgrimage_start_id) {
305 new_boundary.push_back( 328 new_boundary.push_back(
306 {.destination_room = GD_GetRoomByName("Pilgrim Antechamber"), 329 {.source_room = room_exit.destination_room,
330 .destination_room = GD_GetRoomByName("Pilgrim Antechamber"),
307 .type = EntranceType::kPilgrimage}); 331 .type = EntranceType::kPilgrimage});
308 } 332 }
309 } else { 333 } else {
310 if (room_obj.name == "Starting Room") { 334 if (room_obj.name == "Starting Room") {
311 new_boundary.push_back( 335 new_boundary.push_back(
312 {.destination_room = GD_GetRoomByName("Pilgrim Antechamber"), 336 {.source_room = room_exit.destination_room,
337 .destination_room = GD_GetRoomByName("Pilgrim Antechamber"),
313 .door = 338 .door =
314 GD_GetDoorByName("Pilgrim Antechamber - Sun Painting"), 339 GD_GetDoorByName("Pilgrim Antechamber - Sun Painting"),
315 .type = EntranceType::kPainting}); 340 .type = EntranceType::kPainting});
@@ -350,6 +375,19 @@ class StateCalculator {
350 return door_report_; 375 return door_report_;
351 } 376 }
352 377
378 std::string GetPathToRoom(int room_id) const {
379 if (!paths_.count(room_id)) {
380 return "";
381 }
382
383 const std::list<int>& path = paths_.at(room_id);
384 std::vector<std::string> room_names;
385 for (int room_id : path) {
386 room_names.push_back(GD_GetRoom(room_id).name);
387 }
388 return hatkirby::implode(room_names, " -> ");
389 }
390
353 private: 391 private:
354 template <typename T> 392 template <typename T>
355 Decision IsNonGroupedDoorReachable(const T& door_obj) { 393 Decision IsNonGroupedDoorReachable(const T& door_obj) {
@@ -603,6 +641,8 @@ class StateCalculator {
603 std::set<int> solveable_panels_; 641 std::set<int> solveable_panels_;
604 std::set<int> reachable_paintings_; 642 std::set<int> reachable_paintings_;
605 std::map<int, std::map<std::string, bool>> door_report_; 643 std::map<int, std::map<std::string, bool>> door_report_;
644
645 std::map<int, std::list<int>> paths_;
606}; 646};
607 647
608} // namespace 648} // namespace