/* Turns a part of the estimate path into detailed path. */ void CPathManager::EstimateToDetailed(MultiPath& path, float3 startPos) { //If there is no estimate path, nothing could be done. if(path.estimatedPath.path.empty()) return; path.estimatedPath.path.pop_back(); //Remove estimate waypoints until //the next one is far enought. while(!path.estimatedPath.path.empty() && path.estimatedPath.path.back().distance2D(startPos) < DETAILED_DISTANCE * SQUARE_SIZE) path.estimatedPath.path.pop_back(); //Get the goal of the detailed search. float3 goalPos; if(path.estimatedPath.path.empty()) goalPos = path.estimatedPath.pathGoal; else goalPos = path.estimatedPath.path.back(); //Define the search. CRangedGoalWithCircularConstraint rangedGoalPFD(startPos,goalPos, 0,2,1000); //Perform the search. //If this is the final improvement of the path, then use the original goal. IPath::SearchResult result; if(path.estimatedPath.path.empty() && path.estimatedPath2.path.empty()) result = pf->GetPath(*path.moveData, startPos, *path.peDef, path.detailedPath, true); else result = pf->GetPath(*path.moveData, startPos, rangedGoalPFD, path.detailedPath, true); //If no refined path could be found, set goal as desired goal. if(result == IPath::CantGetCloser || result == IPath::Error) { path.detailedPath.pathGoal = goalPos; } }
// converts part of a med-res path into a high-res path void CPathManager::MedRes2MaxRes(MultiPath& multiPath, const float3& startPos, int ownerId, bool synced) const { IPath::Path& maxResPath = multiPath.maxResPath; IPath::Path& medResPath = multiPath.medResPath; IPath::Path& lowResPath = multiPath.lowResPath; if (medResPath.path.empty()) return; medResPath.path.pop_back(); // Remove estimate waypoints until // the next one is far enough. while (!medResPath.path.empty() && medResPath.path.back().SqDistance2D(startPos) < Square(DETAILED_DISTANCE * SQUARE_SIZE)) medResPath.path.pop_back(); // get the goal of the detailed search float3 goalPos; if (medResPath.path.empty()) { goalPos = medResPath.pathGoal; } else { goalPos = medResPath.path.back(); } // define the search CRangedGoalWithCircularConstraint rangedGoalPFD(startPos, goalPos, 0.0f, 2.0f, 1000); // Perform the search. // If this is the final improvement of the path, then use the original goal. IPath::SearchResult result; if (medResPath.path.empty() && lowResPath.path.empty()) { result = maxResPF->GetPath(*multiPath.moveData, startPos, *multiPath.peDef, maxResPath, true, false, MAX_SEARCHED_NODES_PF, true, ownerId, synced); } else { result = maxResPF->GetPath(*multiPath.moveData, startPos, rangedGoalPFD, maxResPath, true, false, MAX_SEARCHED_NODES_PF, true, ownerId, synced); } // If no refined path could be found, set goal as desired goal. if (result == IPath::CantGetCloser || result == IPath::Error) { maxResPath.pathGoal = goalPos; } }