mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
remove int AStarPathFinder::CalcG(int*) function
not being called by anyone at the moment
This commit is contained in:
committed by
majcosta
parent
481e518790
commit
764d2f9389
@@ -1454,268 +1454,6 @@ INT16 AStarPathfinder::CalcAP(int const terrainCost, UINT8 const direction)
|
||||
return movementAPCost;
|
||||
}
|
||||
|
||||
int AStarPathfinder::CalcG(int* pPrevCost)
|
||||
{
|
||||
//how much is admission to the next tile
|
||||
if ( gfPathAroundObstacles == false)
|
||||
{
|
||||
return TRAVELCOST_FLAT;
|
||||
}
|
||||
|
||||
|
||||
int nextCost = gubWorldMovementCosts[ CurrentNode ][ direction ][ onRooftop ];
|
||||
*pPrevCost = nextCost;
|
||||
|
||||
//if we are holding down shift and finding a direct path, count non obstacles as flat terrain
|
||||
if (gfPlotDirectPath && nextCost < NOPASS && nextCost != 0)
|
||||
{
|
||||
return TRAVELCOST_FLAT;
|
||||
}
|
||||
|
||||
//performance: if nextCost is low then do not do many many if == checks
|
||||
if ( nextCost >= TRAVELCOST_FENCE )
|
||||
{
|
||||
//ATE: Check for differences from reality
|
||||
// Is next cost an obstcale
|
||||
if ( nextCost == TRAVELCOST_HIDDENOBSTACLE )
|
||||
{
|
||||
if ( fPathingForPlayer )
|
||||
{
|
||||
// Is this obstacle a hidden tile that has not been revealed yet?
|
||||
BOOLEAN fHiddenStructVisible;
|
||||
if( DoesGridNoContainHiddenStruct( CurrentNode, &fHiddenStructVisible ) )
|
||||
{
|
||||
// Are we not visible, if so use terrain costs!
|
||||
if ( !fHiddenStructVisible )
|
||||
{
|
||||
// Set cost of terrain!
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( nextCost == TRAVELCOST_NOT_STANDING )
|
||||
{
|
||||
// for path plotting purposes, use the terrain value
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
else if ( nextCost == TRAVELCOST_EXITGRID )
|
||||
{
|
||||
if (gfPlotPathToExitGrid)
|
||||
{
|
||||
// replace with terrain cost so that we can plot path, otherwise is obstacle
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
|
||||
//ddd: window. { check 2 conditions: 1. if next tile is a window and we will have to hump through it
|
||||
//2. if current tile is a window and we should jump through the window to reach another tile
|
||||
else if ( nextCost == TRAVELCOST_JUMPABLEWINDOW
|
||||
|| nextCost == TRAVELCOST_JUMPABLEWINDOW_N
|
||||
|| nextCost == TRAVELCOST_JUMPABLEWINDOW_W)
|
||||
{
|
||||
|
||||
// don't let anyone path diagonally through doors!
|
||||
if (IsDiagonal(direction) == true)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];//?
|
||||
|
||||
}
|
||||
//ddd: window }
|
||||
|
||||
else if ( nextCost == TRAVELCOST_FENCE && fNonFenceJumper )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if ( IS_TRAVELCOST_DOOR( nextCost ) )
|
||||
{
|
||||
// don't let anyone path diagonally through doors!
|
||||
if (IsDiagonal(direction) == true)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
INT32 iDoorGridNo = CurrentNode;
|
||||
bool fDoorIsObstacleIfClosed = FALSE;
|
||||
bool fDoorIsOpen = false;
|
||||
switch( nextCost )
|
||||
{
|
||||
case TRAVELCOST_DOOR_CLOSED_HERE:
|
||||
fDoorIsObstacleIfClosed = TRUE;
|
||||
iDoorGridNo = CurrentNode;
|
||||
break;
|
||||
case TRAVELCOST_DOOR_CLOSED_N:
|
||||
fDoorIsObstacleIfClosed = TRUE;
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_CLOSED_W:
|
||||
fDoorIsObstacleIfClosed = TRUE;
|
||||
iDoorGridNo = CurrentNode + dirDelta[ WEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_HERE:
|
||||
iDoorGridNo = CurrentNode;
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_N:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_NE:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTHEAST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_E:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ EAST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_SE:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ SOUTHEAST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_S:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ SOUTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_SW:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ SOUTHWEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_W:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ WEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_NW:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTHWEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_N_N:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTH ] + dirDelta[ NORTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_NW_N:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTHWEST ] + dirDelta[ NORTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_NE_N:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTHEAST ] + dirDelta[ NORTH ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_W_W:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ WEST ] + dirDelta[ WEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_SW_W:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ SOUTHWEST ] + dirDelta[ WEST ];
|
||||
break;
|
||||
case TRAVELCOST_DOOR_OPEN_NW_W:
|
||||
iDoorGridNo = CurrentNode + dirDelta[ NORTHWEST ] + dirDelta[ WEST ];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( fPathingForPlayer && gpWorldLevelData[ iDoorGridNo ].ubExtFlags[0] & MAPELEMENT_EXT_DOOR_STATUS_PRESENT )
|
||||
{
|
||||
// check door status
|
||||
DOOR_STATUS* pDoorStatus = GetDoorStatus( iDoorGridNo );
|
||||
if (pDoorStatus)
|
||||
{
|
||||
fDoorIsOpen = (pDoorStatus->ubFlags & DOOR_PERCEIVED_OPEN) != 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// door destroyed?
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// check door structure
|
||||
STRUCTURE* pDoorStructure = FindStructure( iDoorGridNo, STRUCTURE_ANYDOOR );
|
||||
if (pDoorStructure)
|
||||
{
|
||||
fDoorIsOpen = (pDoorStructure->fFlags & STRUCTURE_OPEN) != 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// door destroyed?
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
|
||||
// now determine movement cost... if it hasn't been changed already
|
||||
if ( IS_TRAVELCOST_DOOR( nextCost ) )
|
||||
{
|
||||
if (fDoorIsOpen)
|
||||
{
|
||||
if (fDoorIsObstacleIfClosed)
|
||||
{
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCost = TRAVELCOST_OBSTACLE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fDoorIsObstacleIfClosed)
|
||||
{
|
||||
// door is closed and this should be an obstacle, EXCEPT if we are calculating
|
||||
// a path for an enemy or NPC with keys
|
||||
if ( fPathingForPlayer || ( pSoldier && (pSoldier->flags.uiStatusFlags & (SOLDIER_MONSTER | SOLDIER_ANIMAL) ) ) )
|
||||
{
|
||||
nextCost = TRAVELCOST_OBSTACLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// have to check if door is locked and NPC does not have keys!
|
||||
// This function has an inaccurate name. It is actually checking if the door has LOCK info.
|
||||
DOOR* pDoor = FindDoorInfoAtGridNo( iDoorGridNo );
|
||||
if (pDoor)
|
||||
{
|
||||
if (!pDoor->fLocked || pSoldier->flags.bHasKeys)
|
||||
{
|
||||
// add to AP cost
|
||||
//if (maxAPBudget)
|
||||
{
|
||||
fGoingThroughDoor = TRUE;
|
||||
}
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCost = TRAVELCOST_OBSTACLE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The door is closed, so we still have to open it
|
||||
fGoingThroughDoor = TRUE;
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCost = gTileTypeMovementCost[ gpWorldLevelData[ CurrentNode ].ubTerrainID ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( fNonSwimmer && ISWATER( gpWorldLevelData[ CurrentNode ].ubTerrainID))
|
||||
{
|
||||
// creatures and animals can't go in water
|
||||
nextCost = TRAVELCOST_OBSTACLE;
|
||||
}
|
||||
}
|
||||
|
||||
// Apr. '96 - moved up be ahead of AP_Budget stuff
|
||||
if ( nextCost >= NOPASS ) // || ( nextCost == TRAVELCOST_DOOR ) )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// make water cost attractive for water to water paths
|
||||
// Why? If a path through water gets you there sooner, you shouldn't need
|
||||
// artificial inflation to figure that out. And if not, then get out of the water!
|
||||
//if (bWaterToWater && ISWATER(nextCost) )
|
||||
//{
|
||||
// nextCost = EASYWATERCOST;
|
||||
//}
|
||||
|
||||
return nextCost;
|
||||
}//end CalcG
|
||||
|
||||
int AStarPathfinder::CalcH()
|
||||
{
|
||||
if ( fCopyReachable )
|
||||
|
||||
Reference in New Issue
Block a user