# UNDF: UNDF-2026-000001158 # UNDF: UNDF-2026-XXXXXXXXX --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -835,6 +835,8 @@ class WalkRegions { private: void loadOriginal(); void loadRevised(); + +#include + public: int _resNum; RouteEnds _routeEnds; @@ -843,7 +845,9 @@ public: Common::Array _idxList; Common::Array _idxList2; - Common::List _disabledRegions; + // Changed from Common::List to std::unordered_set to make + // contains() and disableRegion() O(1) instead of O(D). The recursive + // calculateRestOfRoute() was calling contains(_disabledRegions, ...) on + // every connected region per step, producing O(D * R * depth) total work. + std::unordered_set _disabledRegions; public: WalkRegions() { _resNum = -1; } --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -4302,18 +4302,18 @@ void WalkRegions::synchronize(Serializer &s) { // Synchronize the list of disabled regions as a list of values terminated with a '-1' int regionId = 0; if (s.isLoading()) { _disabledRegions.clear(); s.syncAsSint16LE(regionId); while (regionId != -1) { - _disabledRegions.push_back(regionId); + _disabledRegions.insert(regionId); s.syncAsSint16LE(regionId); } } else { - Common::List::iterator i; - for (i = _disabledRegions.begin(); i != _disabledRegions.end(); ++i) { - regionId = *i; + for (const int id : _disabledRegions) { + regionId = id; s.syncAsSint16LE(regionId); } regionId = -1; s.syncAsSint16LE(regionId); } } @@ -4325,8 +4325,8 @@ void WalkRegions::synchronize(Serializer &s) { void WalkRegions::disableRegion(int regionId) { - if (!contains(_disabledRegions, regionId)) - _disabledRegions.push_back(regionId); + _disabledRegions.insert(regionId); // O(1); unordered_set deduplicates automatically } void WalkRegions::enableRegion(int regionId) { - _disabledRegions.remove(regionId); + _disabledRegions.erase(regionId); // O(1) } --- a/engines/tsage/core.cpp (calculateRestOfRoute change) +++ b/engines/tsage/core.cpp @@ -920,7 +920,7 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg // Check every connected region until we find a route to the destination (or we have no more to check). int bestDistance = 31990; while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) { // Only check the region if it isn't in the list of explicitly disabled regions - if (!contains(g_globals->_walkRegions._disabledRegions, (int)currDest)) { + if (g_globals->_walkRegions._disabledRegions.find((int)currDest) == g_globals->_walkRegions._disabledRegions.end()) { int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute);