HAAStarResult RoutePlanner::setupHierarchicalOpenList(Unit *unit, const Vec2i &target) { // get Transitions for start cluster Transitions transitions; Vec2i startCluster = ClusterMap::cellToCluster(unit->getPos()); ClusterMap *clusterMap = world->getCartographer()->getClusterMap(); clusterMap->getTransitions(startCluster, unit->getCurrField(), transitions); DiagonalDistance dd(target); nsgSearchEngine->getNeighbourFunc().setSearchCluster(startCluster); bool startTrap = true; // attempt quick path from unit->pos to each transition, // if successful add transition to open list AnnotatedMap *aMap = world->getCartographer()->getMasterMap(); aMap->annotateLocal(unit); for (Transitions::iterator it = transitions.begin(); it != transitions.end(); ++it) { float cost = quickSearch(unit->getCurrField(), unit->getSize(), unit->getPos(), (*it)->nwPos); if (cost != numeric_limits<float>::infinity()) { tSearchEngine->setOpen(*it, dd((*it)->nwPos), cost); startTrap = false; } } aMap->clearLocalAnnotations(unit); if (startTrap) { // do again, without annnotations, return TRAPPED if all else goes well bool locked = true; for (Transitions::iterator it = transitions.begin(); it != transitions.end(); ++it) { float cost = quickSearch(unit->getCurrField(), unit->getSize(), unit->getPos(), (*it)->nwPos); if (cost != numeric_limits<float>::infinity()) { tSearchEngine->setOpen(*it, dd((*it)->nwPos), cost); locked = false; } } if (locked) { return HAAStarResult::FAILURE; } } if (startTrap) { return HAAStarResult::START_TRAP; } return HAAStarResult::COMPLETE; }