// set up the starting point of the search IPath::SearchResult CPathEstimator::InitSearch(const MoveData& moveData, const CPathFinderDef& peDef, bool synced) { // is starting square inside goal area? const int xSquare = blockStates[startBlocknr].nodeOffsets[moveData.pathType].x; const int zSquare = blockStates[startBlocknr].nodeOffsets[moveData.pathType].y; if (peDef.IsGoal(xSquare, zSquare)) return IPath::CantGetCloser; // no, clean the system from last search ResetSearch(); // mark and store the start-block blockStates[startBlocknr].nodeMask |= PATHOPT_OPEN; blockStates[startBlocknr].fCost = 0.0f; blockStates[startBlocknr].gCost = 0.0f; blockStates.SetMaxFCost(0.0f); blockStates.SetMaxGCost(0.0f); dirtyBlocks.push_back(startBlocknr); openBlockBuffer.SetSize(0); // add the starting block to the open-blocks-queue PathNode* ob = openBlockBuffer.GetNode(openBlockBuffer.GetSize()); ob->fCost = 0.0f; ob->gCost = 0.0f; ob->nodePos = startBlock; ob->nodeNum = startBlocknr; openBlocks.push(ob); // mark starting point as best found position goalBlock = startBlock; goalHeuristic = peDef.Heuristic(xSquare, zSquare); // get the goal square offset goalSqrOffset = peDef.GoalSquareOffset(BLOCK_SIZE); // perform the search IPath::SearchResult result = DoSearch(moveData, peDef, synced); // if no improvements are found, then return CantGetCloser instead if (goalBlock.x == startBlock.x && goalBlock.y == startBlock.y) { return IPath::CantGetCloser; } return result; }
/** * Make some initial calculations and preparations */ IPath::SearchResult CPathEstimator::InitSearch(const MoveData& moveData, const CPathFinderDef& peDef) { // is starting square inside goal area? int xSquare = blockState[startBlocknr].sqrCenter[moveData.pathType].x; int zSquare = blockState[startBlocknr].sqrCenter[moveData.pathType].y; if (peDef.IsGoal(xSquare, zSquare)) return CantGetCloser; // no, clean the system from last search ResetSearch(); // mark and store the start-block blockState[startBlocknr].options |= PATHOPT_OPEN; blockState[startBlocknr].cost = 0; dirtyBlocks.push_back(startBlocknr); openBlockBufferIndex = 0; // add the starting block to the open-blocks-queue OpenBlock* ob = &openBlockBuffer[openBlockBufferIndex]; ob->cost = 0; ob->currentCost = 0; ob->block = startBlock; ob->blocknr = startBlocknr; openBlocks.push(ob); // mark starting point as best found position goalBlock = startBlock; goalHeuristic = peDef.Heuristic(xSquare, zSquare); // get the goal square offset goalSqrOffset = peDef.GoalSquareOffset(BLOCK_SIZE); // perform the search SearchResult result = DoSearch(moveData, peDef); // if no improvements are found, then return CantGetCloser instead if (goalBlock.x == startBlock.x && goalBlock.y == startBlock.y) return CantGetCloser; else return result; }
/* Making some initial calculations and preparations. */ IPath::SearchResult CPathEstimator::InitSearch(const MoveData& moveData, const CPathFinderDef& peDef) { //Starting square is inside goal area? int xSquare = blockState[startBlocknr].sqrCenter[moveData.pathType].x; int zSquare = blockState[startBlocknr].sqrCenter[moveData.pathType].y; if(peDef.IsGoal(xSquare, zSquare)) return CantGetCloser; //Cleaning the system from last search. ResetSearch(); //Marks and store the start-block. blockState[startBlocknr].options |= PATHOPT_OPEN; blockState[startBlocknr].cost = 0; dirtyBlocks.push_back(startBlocknr); //Adding the starting block to the open-blocks-queue. OpenBlock* ob = openBlockBufferPointer = openBlockBuffer; ob->cost = 0; ob->currentCost = 0; ob->block = startBlock; ob->blocknr = startBlocknr; openBlocks.push(ob); //Mark starting point as best found position. goalBlock = startBlock; goalHeuristic = peDef.Heuristic(xSquare, zSquare); //Gets goal square offset. goalSqrOffset = peDef.GoalSquareOffset(BLOCK_SIZE); //Performs the search. SearchResult result = DoSearch(moveData, peDef); //If no improvements are found, then return CantGetCloser instead. if(goalBlock.x == startBlock.x && goalBlock.y == startBlock.y) return CantGetCloser; else return result; }