/** * Performs the actual search. */ IPath::SearchResult CPathEstimator::DoSearch(const MoveData& moveData, const CPathFinderDef& peDef, bool synced) { bool foundGoal = false; while (!openBlocks.empty() && (openBlockBuffer.GetSize() < maxBlocksToBeSearched)) { // get the open block with lowest cost PathNode* ob = const_cast<PathNode*>(openBlocks.top()); openBlocks.pop(); // check if the block has been marked as unaccessible during its time in the queue if (blockStates[ob->nodeNum].nodeMask & (PATHOPT_BLOCKED | PATHOPT_CLOSED | PATHOPT_FORBIDDEN)) continue; // no, check if the goal is already reached const int xBSquare = blockStates[ob->nodeNum].nodeOffsets[moveData.pathType].x; const int zBSquare = blockStates[ob->nodeNum].nodeOffsets[moveData.pathType].y; const int xGSquare = ob->nodePos.x * BLOCK_SIZE + goalSqrOffset.x; const int zGSquare = ob->nodePos.y * BLOCK_SIZE + goalSqrOffset.y; if (peDef.IsGoal(xBSquare, zBSquare) || peDef.IsGoal(xGSquare, zGSquare)) { goalBlock = ob->nodePos; goalHeuristic = 0; foundGoal = true; break; } // no, test the 8 surrounding blocks // NOTE: each of these calls increments openBlockBuffer.idx by 1, so // maxBlocksToBeSearched is always less than <MAX_SEARCHED_NODES_PE - 8> TestBlock(moveData, peDef, *ob, PATHDIR_LEFT, synced); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_UP, synced); TestBlock(moveData, peDef, *ob, PATHDIR_UP, synced); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_UP, synced); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT, synced); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_DOWN, synced); TestBlock(moveData, peDef, *ob, PATHDIR_DOWN, synced); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_DOWN, synced); // mark this block as closed blockStates[ob->nodeNum].nodeMask |= PATHOPT_CLOSED; } // we found our goal if (foundGoal) return IPath::Ok; // we could not reach the goal if (openBlockBuffer.GetSize() >= maxBlocksToBeSearched) return IPath::GoalOutOfRange; // search could not reach the goal due to the unit being locked in if (openBlocks.empty()) return IPath::GoalOutOfRange; // should never happen LogObject() << "ERROR: CPathEstimator::DoSearch() - Unhandled end of search!\n"; return IPath::Error; }
/** * Performs the actual search. */ IPath::SearchResult CPathEstimator::DoSearch(const MoveData& moveData, const CPathFinderDef& peDef) { bool foundGoal = false; while (!openBlocks.empty() && (openBlockBufferIndex < maxBlocksToBeSearched)) { // get the open block with lowest cost OpenBlock* ob = openBlocks.top(); openBlocks.pop(); // check if the block has been marked as unaccessible during its time in the queue if (blockState[ob->blocknr].options & (PATHOPT_BLOCKED | PATHOPT_CLOSED | PATHOPT_FORBIDDEN)) continue; // no, check if the goal is already reached int xBSquare = blockState[ob->blocknr].sqrCenter[moveData.pathType].x; int zBSquare = blockState[ob->blocknr].sqrCenter[moveData.pathType].y; int xGSquare = ob->block.x * BLOCK_SIZE + goalSqrOffset.x; int zGSquare = ob->block.y * BLOCK_SIZE + goalSqrOffset.y; if (peDef.IsGoal(xBSquare, zBSquare) || peDef.IsGoal(xGSquare, zGSquare)) { goalBlock = ob->block; goalHeuristic = 0; foundGoal = true; break; } // no, test the 8 surrounding blocks // NOTE: each of these calls increments openBlockBufferIndex by 1, so // maxBlocksToBeSearched is always less than <MAX_SEARCHED_BLOCKS - 8> TestBlock(moveData, peDef, *ob, PATHDIR_LEFT); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_UP); TestBlock(moveData, peDef, *ob, PATHDIR_UP); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_UP); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_DOWN); TestBlock(moveData, peDef, *ob, PATHDIR_DOWN); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_DOWN); // mark this block as closed blockState[ob->blocknr].options |= PATHOPT_CLOSED; } // we found our goal if (foundGoal) return Ok; // we could not reach the goal if (openBlockBufferIndex >= maxBlocksToBeSearched) return GoalOutOfRange; // search could not reach the goal due to the unit being locked in if (openBlocks.empty()) return GoalOutOfRange; // should never happen LogObject() << "ERROR: CPathEstimator::DoSearch() - Unhandled end of search!\n"; return Error; }
/* Performs the actual search. */ IPath::SearchResult CPathEstimator::DoSearch(const MoveData& moveData, const CPathFinderDef& peDef) { bool foundGoal = false; while(!openBlocks.empty() && (openBlockBufferPointer - openBlockBuffer) < (maxBlocksToBeSearched - 8)) { //Get the open block with lowest cost. OpenBlock* ob = openBlocks.top(); openBlocks.pop(); //Check if the block has been marked as unaccessable during it's time in queue. if(blockState[ob->blocknr].options & (PATHOPT_BLOCKED | PATHOPT_CLOSED | PATHOPT_FORBIDDEN)) continue; //Check if the goal is reached. int xBSquare = blockState[ob->blocknr].sqrCenter[moveData.pathType].x; int zBSquare = blockState[ob->blocknr].sqrCenter[moveData.pathType].y; int xGSquare = ob->block.x * BLOCK_SIZE + goalSqrOffset.x; int zGSquare = ob->block.y * BLOCK_SIZE + goalSqrOffset.y; if(peDef.IsGoal(xBSquare, zBSquare) || peDef.IsGoal(xGSquare, zGSquare)) { goalBlock = ob->block; goalHeuristic = 0; foundGoal = true; break; } //Test the 8 surrounding blocks. TestBlock(moveData, peDef, *ob, PATHDIR_LEFT); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_UP); TestBlock(moveData, peDef, *ob, PATHDIR_UP); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_UP); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT); TestBlock(moveData, peDef, *ob, PATHDIR_RIGHT_DOWN); TestBlock(moveData, peDef, *ob, PATHDIR_DOWN); TestBlock(moveData, peDef, *ob, PATHDIR_LEFT_DOWN); //Mark this block as closed. blockState[ob->blocknr].options |= PATHOPT_CLOSED; } //Returning search-result. if(foundGoal) return Ok; //Could not reach the goal. if(openBlockBufferPointer - openBlockBuffer >= (maxBlocksToBeSearched - 8)) return GoalOutOfRange; //Search could not reach the goal, due to the unit being locked in. if(openBlocks.empty()) return GoalOutOfRange; //Below shall never be runned. logOutput << "ERROR: CPathEstimator::DoSearch() - Unhandled end of search!\n"; return Error; }