|
|
|
@ -35,7 +35,7 @@ static bool IsRoad(TileIndex tile)
|
|
|
|
|
{
|
|
|
|
|
return
|
|
|
|
|
// MP_STREET, but not a road depot?
|
|
|
|
|
(IsTileType(tile, MP_STREET) && !(IsTileDepotType(tile, TRANSPORT_ROAD))) ||
|
|
|
|
|
(IsTileType(tile, MP_STREET) && !IsTileDepotType(tile, TRANSPORT_ROAD)) ||
|
|
|
|
|
(IsTileType(tile, MP_TUNNELBRIDGE) && (
|
|
|
|
|
// road tunnel?
|
|
|
|
|
((_map5[tile] & 0x80) == 0 && (_map5[tile] & 0x4) == 0x4) ||
|
|
|
|
@ -82,9 +82,11 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre
|
|
|
|
|
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current);
|
|
|
|
|
|
|
|
|
|
// This creates the AiPathFinder
|
|
|
|
|
AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFinderInfo) {
|
|
|
|
|
AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFinderInfo)
|
|
|
|
|
{
|
|
|
|
|
PathNode start_node;
|
|
|
|
|
uint x,y;
|
|
|
|
|
uint x;
|
|
|
|
|
uint y;
|
|
|
|
|
// Create AyStar
|
|
|
|
|
AyStar *result = malloc(sizeof(AyStar));
|
|
|
|
|
init_AyStar(result, AiPathFinder_Hash, 1 << 10);
|
|
|
|
@ -122,9 +124,11 @@ AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFin
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// To reuse AyStar we sometimes have to clean all the memory
|
|
|
|
|
void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo) {
|
|
|
|
|
void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo)
|
|
|
|
|
{
|
|
|
|
|
PathNode start_node;
|
|
|
|
|
uint x,y;
|
|
|
|
|
uint x;
|
|
|
|
|
uint y;
|
|
|
|
|
|
|
|
|
|
aystar->clear(aystar);
|
|
|
|
|
|
|
|
|
@ -149,7 +153,8 @@ void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The h-value, simple calculation
|
|
|
|
|
static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent) {
|
|
|
|
|
static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
|
|
|
|
|
{
|
|
|
|
|
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
|
|
|
|
|
int r, r2;
|
|
|
|
|
if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION) {
|
|
|
|
@ -167,7 +172,8 @@ static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// We found the end.. let's get the route back and put it in an array
|
|
|
|
|
static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *current) {
|
|
|
|
|
static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *current)
|
|
|
|
|
{
|
|
|
|
|
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
|
|
|
|
|
uint i = 0;
|
|
|
|
|
PathNode *parent = ¤t->path;
|
|
|
|
@ -188,7 +194,8 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// What tiles are around us.
|
|
|
|
|
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current) {
|
|
|
|
|
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current)
|
|
|
|
|
{
|
|
|
|
|
uint i;
|
|
|
|
|
int ret;
|
|
|
|
|
int dir;
|
|
|
|
@ -202,10 +209,8 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
|
|
|
|
|
TileIndex ctile = current->path.node.tile; // Current tile
|
|
|
|
|
TileIndex atile = ctile + TileOffsByDir(i); // Adjacent tile
|
|
|
|
|
|
|
|
|
|
if (TileX(atile) > 1 &&
|
|
|
|
|
TileX(atile) < MapMaxX() - 1 &&
|
|
|
|
|
TileY(atile) > 1 &&
|
|
|
|
|
TileY(atile) < MapMaxY() - 1) {
|
|
|
|
|
if (TileX(atile) > 1 && TileX(atile) < MapMaxX() - 1 &&
|
|
|
|
|
TileY(atile) > 1 && TileY(atile) < MapMaxY() - 1) {
|
|
|
|
|
// We also directly test if the current tile can connect to this tile..
|
|
|
|
|
// We do this simply by just building the tile!
|
|
|
|
|
|
|
|
|
@ -296,7 +301,6 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
|
|
|
|
|
|
|
|
|
|
// Next step, check for bridges and tunnels
|
|
|
|
|
if (current->path.parent != NULL && current->path.node.user_data[0] == 0) {
|
|
|
|
|
|
|
|
|
|
TileInfo ti;
|
|
|
|
|
// First we get the dir from this tile and his parent
|
|
|
|
|
int dir = AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile);
|
|
|
|
@ -360,7 +364,8 @@ enum {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// The most important function: it calculates the g-value
|
|
|
|
|
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent) {
|
|
|
|
|
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
|
|
|
|
|
{
|
|
|
|
|
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
|
|
|
|
|
int r, res = 0;
|
|
|
|
|
TileInfo ti, parent_ti;
|
|
|
|
|