|
@@ -96,49 +96,49 @@ static inline bool NPFGetFlag(const AySt
|
|
|
/**
|
|
|
* Sets the given flag on the given AyStarNode to the given value.
|
|
|
*/
|
|
|
static inline void NPFSetFlag(AyStarNode *node, NPFNodeFlag flag, bool value)
|
|
|
{
|
|
|
SB(node->user_data[NPF_NODE_FLAGS], flag, 1, value);
|
|
|
}
|
|
|
|
|
|
bool CheckIgnoreFirstTile(const PathNode *node)
|
|
|
{
|
|
|
return (node->parent == nullptr && HasBit(node->node.user_data[NPF_NODE_FLAGS], NPF_FLAG_IGNORE_START_TILE));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Calculates the minimum distance travelled to get from t0 to t1 when only
|
|
|
* using tracks (ie, only making 45 degree turns). Returns the distance in the
|
|
|
* NPF scale, ie the number of full tiles multiplied by NPF_TILE_LENGTH to
|
|
|
* prevent rounding.
|
|
|
*/
|
|
|
static uint NPFDistanceTrack(TileIndex t0, TileIndex t1)
|
|
|
{
|
|
|
const uint dx = Delta(TileX(t0), TileX(t1));
|
|
|
const uint dy = Delta(TileY(t0), TileY(t1));
|
|
|
|
|
|
const uint straightTracks = 2 * min(dx, dy); // The number of straight (not full length) tracks
|
|
|
const uint straightTracks = 2 * std::min(dx, dy); // The number of straight (not full length) tracks
|
|
|
/* OPTIMISATION:
|
|
|
* Original: diagTracks = max(dx, dy) - min(dx,dy);
|
|
|
* Proof:
|
|
|
* (dx+dy) - straightTracks == (min + max) - straightTracks = min + max - 2 * min = max - min */
|
|
|
const uint diagTracks = dx + dy - straightTracks; // The number of diagonal (full tile length) tracks.
|
|
|
|
|
|
/* Don't factor out NPF_TILE_LENGTH below, this will round values and lose
|
|
|
* precision */
|
|
|
return diagTracks * NPF_TILE_LENGTH + straightTracks * NPF_TILE_LENGTH * STRAIGHT_TRACK_LENGTH;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Calculates a hash value for use in the NPF.
|
|
|
* @param key1 The TileIndex of the tile to hash
|
|
|
* @param key2 The Trackdir of the track on the tile.
|
|
|
*
|
|
|
* @todo Think of a better hash.
|
|
|
*/
|
|
|
static uint NPFHash(uint key1, uint key2)
|
|
|
{
|
|
|
/* TODO: think of a better hash? */
|
|
|
uint part1 = TileX(key1) & NPF_HASH_HALFMASK;
|
|
|
uint part2 = TileY(key1) & NPF_HASH_HALFMASK;
|
|
|
|