mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
This commit is contained in:
parent
a1e94b67d5
commit
d4beff7954
7
ai.h
7
ai.h
@ -228,13 +228,6 @@ enum {
|
|||||||
#define AI_PATHFINDER_FLAG_BRIDGE 1
|
#define AI_PATHFINDER_FLAG_BRIDGE 1
|
||||||
#define AI_PATHFINDER_FLAG_TUNNEL 2
|
#define AI_PATHFINDER_FLAG_TUNNEL 2
|
||||||
|
|
||||||
// A macro for mp_street, where 0x20 is depot
|
|
||||||
// mp_tunnelbridge, where 0xf0 is a bridge, and 0x4/0x2 means: roadtunnel/bridge
|
|
||||||
#define AI_PATHFINDER_IS_ROAD(tile) ((IsTileType(tile, MP_STREET) && !(_map5[tile] & 0x20)) || \
|
|
||||||
(IsTileType(tile, MP_TUNNELBRIDGE) && \
|
|
||||||
(((_map5[tile] & 0x80) == 0 && (_map5[tile] & 0x4) == 0x4) || \
|
|
||||||
((_map5[tile] & 0x80) != 0 && (_map5[tile] & 0x2) == 0x2))))
|
|
||||||
|
|
||||||
typedef void AiNew_StateFunction(Player *p);
|
typedef void AiNew_StateFunction(Player *p);
|
||||||
|
|
||||||
// ai_new.c
|
// ai_new.c
|
||||||
|
@ -27,6 +27,21 @@ bool TestCanBuildStationHere(uint tile, byte dir) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool IsRoad(TileIndex tile)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
// MP_STREET, but not a road depot?
|
||||||
|
(IsTileType(tile, MP_STREET) && !(_map5[tile] & 0x20)) ||
|
||||||
|
(IsTileType(tile, MP_TUNNELBRIDGE) && (
|
||||||
|
// road tunnel?
|
||||||
|
((_map5[tile] & 0x80) == 0 && (_map5[tile] & 0x4) == 0x4) ||
|
||||||
|
// road bridge?
|
||||||
|
((_map5[tile] & 0x80) != 0 && (_map5[tile] & 0x2) == 0x2)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Checks if a tile 'a' is between the tiles 'b' and 'c'
|
// Checks if a tile 'a' is between the tiles 'b' and 'c'
|
||||||
#define TILES_BETWEEN(a, b, c) (TileX(a) >= TileX(b) && TileX(a) <= TileX(c) && TileY(a) >= TileY(b) && TileY(a) <= TileY(c))
|
#define TILES_BETWEEN(a, b, c) (TileX(a) >= TileX(b) && TileX(a) <= TileX(c) && TileY(a) >= TileY(b) && TileY(a) <= TileY(c))
|
||||||
|
|
||||||
@ -186,7 +201,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
|
|||||||
// We do this simply by just building the tile!
|
// We do this simply by just building the tile!
|
||||||
|
|
||||||
// If the next step is a bridge, we have to enter it the right way
|
// If the next step is a bridge, we have to enter it the right way
|
||||||
if (!PathFinderInfo->rail_or_road && AI_PATHFINDER_IS_ROAD(current->path.node.tile + TileOffsByDir(i))) {
|
if (!PathFinderInfo->rail_or_road && IsRoad(current->path.node.tile + TileOffsByDir(i))) {
|
||||||
if (IsTileType(current->path.node.tile + TileOffsByDir(i), MP_TUNNELBRIDGE)) {
|
if (IsTileType(current->path.node.tile + TileOffsByDir(i), MP_TUNNELBRIDGE)) {
|
||||||
// An existing bridge... let's test the direction ;)
|
// An existing bridge... let's test the direction ;)
|
||||||
if ((_map5[current->path.node.tile + TileOffsByDir(i)] & 1U) != (i & 1)) continue;
|
if ((_map5[current->path.node.tile + TileOffsByDir(i)] & 1U) != (i & 1)) continue;
|
||||||
@ -198,7 +213,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// But also if we are on a bridge, we can only move a certain direction
|
// But also if we are on a bridge, we can only move a certain direction
|
||||||
if (!PathFinderInfo->rail_or_road && AI_PATHFINDER_IS_ROAD(current->path.node.tile)) {
|
if (!PathFinderInfo->rail_or_road && IsRoad(current->path.node.tile)) {
|
||||||
if (IsTileType(current->path.node.tile, MP_TUNNELBRIDGE)) {
|
if (IsTileType(current->path.node.tile, MP_TUNNELBRIDGE)) {
|
||||||
// An existing bridge/tunnel... let's test the direction ;)
|
// An existing bridge/tunnel... let's test the direction ;)
|
||||||
if ((_map5[current->path.node.tile] & 1U) != (i & 1)) continue;
|
if ((_map5[current->path.node.tile] & 1U) != (i & 1)) continue;
|
||||||
@ -240,7 +255,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
|
|||||||
} else {
|
} else {
|
||||||
// Road check
|
// Road check
|
||||||
dir = AiNew_GetRoadDirection(current->path.parent->node.tile, current->path.node.tile, current->path.node.tile + TileOffsByDir(i));
|
dir = AiNew_GetRoadDirection(current->path.parent->node.tile, current->path.node.tile, current->path.node.tile + TileOffsByDir(i));
|
||||||
if (AI_PATHFINDER_IS_ROAD(current->path.node.tile)) {
|
if (IsRoad(current->path.node.tile)) {
|
||||||
if (IsTileType(current->path.node.tile, MP_TUNNELBRIDGE)) {
|
if (IsTileType(current->path.node.tile, MP_TUNNELBRIDGE)) {
|
||||||
// We have a bridge, how nicely! We should mark it...
|
// We have a bridge, how nicely! We should mark it...
|
||||||
dir = 0;
|
dir = 0;
|
||||||
@ -361,7 +376,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
|
|||||||
if (!PathFinderInfo->rail_or_road) {
|
if (!PathFinderInfo->rail_or_road) {
|
||||||
// Road has the lovely advantage it can use other road... check if
|
// Road has the lovely advantage it can use other road... check if
|
||||||
// the current tile is road, and if so, give a good bonus
|
// the current tile is road, and if so, give a good bonus
|
||||||
if (AI_PATHFINDER_IS_ROAD(current->tile)) {
|
if (IsRoad(current->tile)) {
|
||||||
res -= AI_PATHFINDER_ROAD_ALREADY_EXISTS_BONUS;
|
res -= AI_PATHFINDER_ROAD_ALREADY_EXISTS_BONUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -378,7 +393,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
|
|||||||
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
|
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!(AI_PATHFINDER_IS_ROAD(parent->path.node.tile) && IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE))) {
|
if (!(IsRoad(parent->path.node.tile) && IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE))) {
|
||||||
r = GetRoadFoundation(parent_ti.tileh, AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
|
r = GetRoadFoundation(parent_ti.tileh, AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
|
||||||
if (r >= 15 || r == 0)
|
if (r >= 15 || r == 0)
|
||||||
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
|
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
|
||||||
@ -423,7 +438,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
|
|||||||
if (parent->path.parent != NULL &&
|
if (parent->path.parent != NULL &&
|
||||||
AiNew_GetDirection(current->tile, parent->path.node.tile) != AiNew_GetDirection(parent->path.node.tile, parent->path.parent->node.tile)) {
|
AiNew_GetDirection(current->tile, parent->path.node.tile) != AiNew_GetDirection(parent->path.node.tile, parent->path.parent->node.tile)) {
|
||||||
// When road exists, we don't like turning, but its free, so don't be to piggy about it
|
// When road exists, we don't like turning, but its free, so don't be to piggy about it
|
||||||
if (AI_PATHFINDER_IS_ROAD(parent->path.node.tile))
|
if (IsRoad(parent->path.node.tile))
|
||||||
res += AI_PATHFINDER_DIRECTION_CHANGE_ON_EXISTING_ROAD_PENALTY;
|
res += AI_PATHFINDER_DIRECTION_CHANGE_ON_EXISTING_ROAD_PENALTY;
|
||||||
else
|
else
|
||||||
res += AI_PATHFINDER_DIRECTION_CHANGE_PENALTY;
|
res += AI_PATHFINDER_DIRECTION_CHANGE_PENALTY;
|
||||||
|
Loading…
Reference in New Issue
Block a user