summaryrefslogtreecommitdiff
path: root/ai
diff options
context:
space:
mode:
Diffstat (limited to 'ai')
-rw-r--r--ai/default/default.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/ai/default/default.c b/ai/default/default.c
index 50b5c7674..0c874f05e 100644
--- a/ai/default/default.c
+++ b/ai/default/default.c
@@ -1837,7 +1837,6 @@ typedef struct AiRailFinder {
TileIndex cur_best_tile, best_tile;
TileIndex bridge_end_tile;
Player *player;
- TileInfo ti;
} AiRailFinder;
static const byte _ai_table_15[4][8] = {
@@ -1916,26 +1915,29 @@ static bool AiCheckRailPathBetter(AiRailFinder *arf, const byte *p)
static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile, const byte *p)
{
TileIndex tile_new;
+ uint tileh;
+ uint z;
bool flag;
int dir2 = p[0] & 3;
- FindLandscapeHeightByTile(&arf->ti, tile);
-
- if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) {
+ tileh = GetTileSlope(tile, &z);
+ if (tileh == _dir_table_1[dir2] || (tileh == 0 && z != 0)) {
tile_new = tile;
// Allow bridges directly over bottom tiles
- flag = arf->ti.z == 0;
+ flag = z == 0;
for (;;) {
+ TileType type;
+
if ((TileIndexDiff)tile_new < -TileOffsByDir(dir2)) return; // Wraping around map, no bridge possible!
tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2));
- FindLandscapeHeightByTile(&arf->ti, tile_new);
- if (arf->ti.tileh != 0 || arf->ti.type == MP_CLEAR || arf->ti.type == MP_TREES) {
+ type = GetTileType(tile_new);
+
+ if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile_new, NULL) != 0) {
if (!flag) return;
break;
}
- if (arf->ti.type != MP_WATER && arf->ti.type != MP_RAILWAY && arf->ti.type != MP_STREET)
- return;
+ if (type != MP_WATER && type != MP_RAILWAY && type != MP_STREET) return;
flag = true;
}
@@ -1955,9 +1957,9 @@ static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile,
static inline void AiCheckBuildRailTunnelHere(AiRailFinder *arf, TileIndex tile, const byte *p)
{
- FindLandscapeHeightByTile(&arf->ti, tile);
+ uint z;
- if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) {
+ if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
int32 cost = DoCommandByTile(tile, arf->player->ai.railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL);
if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) {
@@ -2011,8 +2013,7 @@ static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir)
p = _ai_table_15[dir];
// Try to build a single rail in all directions.
- FindLandscapeHeightByTile(&arf->ti, tile);
- if (arf->ti.z == 0) {
+ if (GetTileZ(tile) == 0) {
p += 6;
} else {
do {
@@ -2669,7 +2670,6 @@ typedef struct {
TileIndex cur_best_tile, best_tile;
TileIndex bridge_end_tile;
Player *player;
- TileInfo ti;
} AiRoadFinder;
typedef struct AiRoadEnum {
@@ -2790,27 +2790,31 @@ static bool AiBuildRoadHelper(TileIndex tile, int flags, int type)
static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile, const byte *p)
{
TileIndex tile_new;
+ uint tileh;
+ uint z;
bool flag;
int dir2 = p[0] & 3;
- FindLandscapeHeightByTile(&arf->ti, tile);
- if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) {
+ tileh = GetTileSlope(tile, &z);
+ if (tileh == _dir_table_1[dir2] || (tileh == 0 && z != 0)) {
tile_new = tile;
// Allow bridges directly over bottom tiles
- flag = arf->ti.z == 0;
+ flag = z == 0;
for (;;) {
+ TileType type;
+
if ((TileIndexDiff)tile_new < -TileOffsByDir(dir2)) return; // Wraping around map, no bridge possible!
tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2));
- FindLandscapeHeightByTile(&arf->ti, tile_new);
- if (arf->ti.tileh != 0 || arf->ti.type == MP_CLEAR || arf->ti.type == MP_TREES) {
+ type = GetTileType(tile_new);
+
+ if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile, NULL) != 0) {
// Allow a bridge if either we have a tile that's water, rail or street,
// or if we found an up tile.
if (!flag) return;
break;
}
- if (arf->ti.type != MP_WATER && arf->ti.type != MP_RAILWAY && arf->ti.type != MP_STREET)
- return;
+ if (type != MP_WATER && type != MP_RAILWAY && type != MP_STREET) return;
flag = true;
}
@@ -2828,9 +2832,9 @@ static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile,
static inline void AiCheckBuildRoadTunnelHere(AiRoadFinder *arf, TileIndex tile, const byte *p)
{
- FindLandscapeHeightByTile(&arf->ti, tile);
+ uint z;
- if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) {
+ if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
int32 cost = DoCommandByTile(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL);
if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) {
@@ -2879,8 +2883,7 @@ static void AiBuildRoadRecursive(AiRoadFinder *arf, TileIndex tile, int dir)
p = _ai_table_15[dir];
// Try to build a single rail in all directions.
- FindLandscapeHeightByTile(&arf->ti, tile);
- if (arf->ti.z == 0) {
+ if (GetTileZ(tile) == 0) {
p += 6;
} else {
do {