| 819 | } |
| 820 | |
| 821 | std::vector<int> GetNeighborRoomNumbers(int roomNumber, unsigned int searchDepth) |
| 822 | { |
| 823 | // Initialize stack. |
| 824 | auto stack = std::stack<std::pair<int, unsigned int>>{}; // First = room number, second = depth. |
| 825 | stack.push({ roomNumber, searchDepth }); |
| 826 | |
| 827 | // Collect neighbor room numbers. |
| 828 | auto neighborRoomNumbers = std::vector<int>{}; |
| 829 | while (!stack.empty()) |
| 830 | { |
| 831 | auto [currentRoomNumber, depth] = stack.top(); |
| 832 | stack.pop(); |
| 833 | |
| 834 | // Add neighbor room number. |
| 835 | neighborRoomNumbers.push_back(currentRoomNumber); |
| 836 | |
| 837 | // Depth limit reached; continue. |
| 838 | if (depth <= 0) |
| 839 | continue; |
| 840 | |
| 841 | // Get room and check for neighbors. |
| 842 | const auto& room = g_Level.Rooms[currentRoomNumber]; |
| 843 | for (const auto& portal : room.Portals) |
| 844 | stack.push({ portal.RoomNumber, depth - 1 }); |
| 845 | } |
| 846 | |
| 847 | // Sort and remove duplicates. |
| 848 | std::sort(neighborRoomNumbers.begin(), neighborRoomNumbers.end()); |
| 849 | neighborRoomNumbers.erase(std::unique(neighborRoomNumbers.begin(), neighborRoomNumbers.end()), neighborRoomNumbers.end()); |
| 850 | |
| 851 | return neighborRoomNumbers; |
| 852 | } |
| 853 | |
| 854 | void InitializeNeighborRoomList() |
| 855 | { |