diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-07-16 00:47:11 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-07-16 00:47:11 -0400 |
| commit | 52bc9fdf99d452c592e174acd9cb174ec00e19d7 (patch) | |
| tree | f859724e8710fa30d2bd90e82614cc04f058f870 | |
| parent | bbf47da879b816167c8f3bed716570effa4b52bb (diff) | |
| download | lingo-ap-tracker-52bc9fdf99d452c592e174acd9cb174ec00e19d7.tar.gz lingo-ap-tracker-52bc9fdf99d452c592e174acd9cb174ec00e19d7.tar.bz2 lingo-ap-tracker-52bc9fdf99d452c592e174acd9cb174ec00e19d7.zip | |
Added path tracking for debugging
| -rw-r--r-- | src/game_data.cpp | 3 | ||||
| -rw-r--r-- | src/game_data.h | 1 | ||||
| -rw-r--r-- | src/tracker_state.cpp | 35 |
3 files changed, 35 insertions, 4 deletions
| diff --git a/src/game_data.cpp b/src/game_data.cpp index e75170e..4c0104f 100644 --- a/src/game_data.cpp +++ b/src/game_data.cpp | |||
| @@ -109,6 +109,7 @@ struct GameData { | |||
| 109 | auto process_single_entrance = | 109 | auto process_single_entrance = |
| 110 | [this, room_id, from_room_id](const YAML::Node &option) { | 110 | [this, room_id, from_room_id](const YAML::Node &option) { |
| 111 | Exit exit_obj; | 111 | Exit exit_obj; |
| 112 | exit_obj.source_room = from_room_id; | ||
| 112 | exit_obj.destination_room = room_id; | 113 | exit_obj.destination_room = room_id; |
| 113 | 114 | ||
| 114 | if (option["door"]) { | 115 | if (option["door"]) { |
| @@ -143,7 +144,7 @@ struct GameData { | |||
| 143 | switch (entrance_it.second.Type()) { | 144 | switch (entrance_it.second.Type()) { |
| 144 | case YAML::NodeType::Scalar: { | 145 | case YAML::NodeType::Scalar: { |
| 145 | // This is just "true". | 146 | // This is just "true". |
| 146 | rooms_[from_room_id].exits.push_back({.destination_room = room_id}); | 147 | rooms_[from_room_id].exits.push_back({.source_room = from_room_id, .destination_room = room_id}); |
| 147 | break; | 148 | break; |
| 148 | } | 149 | } |
| 149 | case YAML::NodeType::Map: { | 150 | case YAML::NodeType::Map: { |
| diff --git a/src/game_data.h b/src/game_data.h index b787e6f..23f7b3a 100644 --- a/src/game_data.h +++ b/src/game_data.h | |||
| @@ -83,6 +83,7 @@ struct Door { | |||
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | struct Exit { | 85 | struct Exit { |
| 86 | int source_room; | ||
| 86 | int destination_room; | 87 | int destination_room; |
| 87 | std::optional<int> door; | 88 | std::optional<int> door; |
| 88 | EntranceType type = EntranceType::kNormal; | 89 | EntranceType type = EntranceType::kNormal; |
| diff --git a/src/tracker_state.cpp b/src/tracker_state.cpp index da8f426..ba615d1 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 | ||
| 13 | namespace { | 17 | namespace { |
| 14 | 18 | ||
| @@ -217,6 +221,7 @@ class StateCalculator { | |||
| 217 | PaintingExit target_painting = | 221 | PaintingExit target_painting = |
| 218 | GD_GetPaintingExit(GD_GetPaintingByName( | 222 | GD_GetPaintingExit(GD_GetPaintingByName( |
| 219 | AP_GetPaintingMapping().at(cur_painting.internal_id))); | 223 | AP_GetPaintingMapping().at(cur_painting.internal_id))); |
| 224 | painting_exit.source_room = cur_painting.room; | ||
| 220 | painting_exit.destination_room = target_painting.room; | 225 | painting_exit.destination_room = target_painting.room; |
| 221 | painting_exit.type = EntranceType::kPainting; | 226 | painting_exit.type = EntranceType::kPainting; |
| 222 | 227 | ||
| @@ -245,6 +250,12 @@ class StateCalculator { | |||
| 245 | reachable_rooms_.insert(room_exit.destination_room); | 250 | reachable_rooms_.insert(room_exit.destination_room); |
| 246 | reachable_changed = true; | 251 | reachable_changed = true; |
| 247 | 252 | ||
| 253 | #ifndef NDEBUG | ||
| 254 | std::list<int> room_path = paths_[room_exit.source_room]; | ||
| 255 | room_path.push_back(room_exit.destination_room); | ||
| 256 | paths_[room_exit.destination_room] = room_path; | ||
| 257 | #endif | ||
| 258 | |||
| 248 | const Room& room_obj = GD_GetRoom(room_exit.destination_room); | 259 | const Room& room_obj = GD_GetRoom(room_exit.destination_room); |
| 249 | for (const Exit& out_edge : room_obj.exits) { | 260 | for (const Exit& out_edge : room_obj.exits) { |
| 250 | if (out_edge.type == EntranceType::kPainting && | 261 | if (out_edge.type == EntranceType::kPainting && |
| @@ -283,7 +294,8 @@ class StateCalculator { | |||
| 283 | 294 | ||
| 284 | if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") { | 295 | if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") { |
| 285 | new_boundary.push_back( | 296 | new_boundary.push_back( |
| 286 | {.destination_room = GD_GetRoomByName("Outside The Undeterred"), | 297 | {.source_room = room_exit.destination_room, |
| 298 | .destination_room = GD_GetRoomByName("Outside The Undeterred"), | ||
| 287 | .type = EntranceType::kPainting}); | 299 | .type = EntranceType::kPainting}); |
| 288 | } | 300 | } |
| 289 | 301 | ||
| @@ -300,13 +312,15 @@ class StateCalculator { | |||
| 300 | 312 | ||
| 301 | if (room_exit.destination_room == pilgrimage_start_id) { | 313 | if (room_exit.destination_room == pilgrimage_start_id) { |
| 302 | new_boundary.push_back( | 314 | new_boundary.push_back( |
| 303 | {.destination_room = GD_GetRoomByName("Pilgrim Antechamber"), | 315 | {.source_room = room_exit.destination_room, |
| 316 | .destination_room = GD_GetRoomByName("Pilgrim Antechamber"), | ||
| 304 | .type = EntranceType::kPilgrimage}); | 317 | .type = EntranceType::kPilgrimage}); |
| 305 | } | 318 | } |
| 306 | } else { | 319 | } else { |
| 307 | if (room_obj.name == "Starting Room") { | 320 | if (room_obj.name == "Starting Room") { |
| 308 | new_boundary.push_back( | 321 | new_boundary.push_back( |
| 309 | {.destination_room = GD_GetRoomByName("Pilgrim Antechamber"), | 322 | {.source_room = room_exit.destination_room, |
| 323 | .destination_room = GD_GetRoomByName("Pilgrim Antechamber"), | ||
| 310 | .door = | 324 | .door = |
| 311 | GD_GetDoorByName("Pilgrim Antechamber - Sun Painting"), | 325 | GD_GetDoorByName("Pilgrim Antechamber - Sun Painting"), |
| 312 | .type = EntranceType::kPainting}); | 326 | .type = EntranceType::kPainting}); |
| @@ -347,6 +361,19 @@ class StateCalculator { | |||
| 347 | return door_report_; | 361 | return door_report_; |
| 348 | } | 362 | } |
| 349 | 363 | ||
| 364 | std::string GetPathToRoom(int room_id) const { | ||
| 365 | if (!paths_.count(room_id)) { | ||
| 366 | return ""; | ||
| 367 | } | ||
| 368 | |||
| 369 | const std::list<int>& path = paths_.at(room_id); | ||
| 370 | std::vector<std::string> room_names; | ||
| 371 | for (int room_id : path) { | ||
| 372 | room_names.push_back(GD_GetRoom(room_id).name); | ||
| 373 | } | ||
| 374 | return hatkirby::implode(room_names, " -> "); | ||
| 375 | } | ||
| 376 | |||
| 350 | private: | 377 | private: |
| 351 | Decision IsNonGroupedDoorReachable(const Door& door_obj) { | 378 | Decision IsNonGroupedDoorReachable(const Door& door_obj) { |
| 352 | bool has_item = AP_HasItem(door_obj.ap_item_id); | 379 | bool has_item = AP_HasItem(door_obj.ap_item_id); |
| @@ -585,6 +612,8 @@ class StateCalculator { | |||
| 585 | std::set<int> solveable_panels_; | 612 | std::set<int> solveable_panels_; |
| 586 | std::set<int> reachable_paintings_; | 613 | std::set<int> reachable_paintings_; |
| 587 | std::map<int, std::map<std::string, bool>> door_report_; | 614 | std::map<int, std::map<std::string, bool>> door_report_; |
| 615 | |||
| 616 | std::map<int, std::list<int>> paths_; | ||
| 588 | }; | 617 | }; |
| 589 | 618 | ||
| 590 | } // namespace | 619 | } // namespace |
