1
0
Fork 0

(svn r4553) int and magic numbers -> Slope and DiagDirection

release/0.5
tron 2006-04-23 19:08:33 +00:00
parent 72d3fabb58
commit 8ef2c13c65
5 changed files with 38 additions and 40 deletions

View File

@ -1603,7 +1603,7 @@ clear_town_stuff:;
} }
} else if (p->mode == 3) { } else if (p->mode == 3) {
//Clear stuff and then build single rail. //Clear stuff and then build single rail.
if (GetTileSlope(c,NULL) != 0) if (GetTileSlope(c, NULL) != SLOPE_FLAT)
return CMD_ERROR; return CMD_ERROR;
ret = DoCommand(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); ret = DoCommand(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR);
if (CmdFailed(ret)) return CMD_ERROR; if (CmdFailed(ret)) return CMD_ERROR;
@ -1675,7 +1675,7 @@ static void AiDoTerraformLand(TileIndex tile, int dir, int unk, int mode)
{ {
PlayerID old_player; PlayerID old_player;
uint32 r; uint32 r;
uint slope; Slope slope;
uint h; uint h;
old_player = _current_player; old_player = _current_player;
@ -1698,7 +1698,7 @@ static void AiDoTerraformLand(TileIndex tile, int dir, int unk, int mode)
slope = GetTileSlope(tile, &h); slope = GetTileSlope(tile, &h);
if (slope != 0) { if (slope != SLOPE_FLAT) {
if (mode > 0 || (mode == 0 && !(r & 0xC))) { if (mode > 0 || (mode == 0 && !(r & 0xC))) {
// Terraform up // Terraform up
DoCommand(tile, _terraform_up_flags[slope - 1], 1, DoCommand(tile, _terraform_up_flags[slope - 1], 1,
@ -1920,14 +1920,14 @@ static bool AiCheckRailPathBetter(AiRailFinder *arf, const byte *p)
static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile, const byte *p) static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile, const byte *p)
{ {
TileIndex tile_new; TileIndex tile_new;
uint tileh; Slope tileh;
uint z; uint z;
bool flag; bool flag;
int dir2 = p[0] & 3; int dir2 = p[0] & 3;
tileh = GetTileSlope(tile, &z); tileh = GetTileSlope(tile, &z);
if (tileh == _dir_table_1[dir2] || (tileh == 0 && z != 0)) { if (tileh == _dir_table_1[dir2] || (tileh == SLOPE_FLAT && z != 0)) {
tile_new = tile; tile_new = tile;
// Allow bridges directly over bottom tiles // Allow bridges directly over bottom tiles
flag = z == 0; flag = z == 0;
@ -1938,7 +1938,7 @@ static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile,
tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2)); tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2));
type = GetTileType(tile_new); type = GetTileType(tile_new);
if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile_new, NULL) != 0) { if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile_new, NULL) != SLOPE_FLAT) {
if (!flag) return; if (!flag) return;
break; break;
} }
@ -2586,7 +2586,7 @@ clear_town_stuff:;
} else if (p->mode == 3) { } else if (p->mode == 3) {
if (flag & DC_EXEC) continue; if (flag & DC_EXEC) continue;
if (GetTileSlope(c, NULL) != 0) return CMD_ERROR; if (GetTileSlope(c, NULL) != SLOPE_FLAT) return CMD_ERROR;
if (!IsTileType(c, MP_STREET) || GetRoadType(c) != ROAD_NORMAL) { if (!IsTileType(c, MP_STREET) || GetRoadType(c) != ROAD_NORMAL) {
ret = DoCommand(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); ret = DoCommand(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR);
@ -2828,14 +2828,14 @@ static bool AiBuildRoadHelper(TileIndex tile, int flags, int type)
static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile, const byte *p) static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile, const byte *p)
{ {
TileIndex tile_new; TileIndex tile_new;
uint tileh; Slope tileh;
uint z; uint z;
bool flag; bool flag;
int dir2 = p[0] & 3; int dir2 = p[0] & 3;
tileh = GetTileSlope(tile, &z); tileh = GetTileSlope(tile, &z);
if (tileh == _dir_table_1[dir2] || (tileh == 0 && z != 0)) { if (tileh == _dir_table_1[dir2] || (tileh == SLOPE_FLAT && z != 0)) {
tile_new = tile; tile_new = tile;
// Allow bridges directly over bottom tiles // Allow bridges directly over bottom tiles
flag = z == 0; flag = z == 0;
@ -2846,7 +2846,7 @@ static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile,
tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2)); tile_new = TILE_MASK(tile_new + TileOffsByDir(dir2));
type = GetTileType(tile_new); type = GetTileType(tile_new);
if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile, NULL) != 0) { if (type == MP_CLEAR || type == MP_TREES || GetTileSlope(tile, NULL) != SLOPE_FLAT) {
// Allow a bridge if either we have a tile that's water, rail or street, // Allow a bridge if either we have a tile that's water, rail or street,
// or if we found an up tile. // or if we found an up tile.
if (!flag) return; if (!flag) return;

View File

@ -314,17 +314,15 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
// Next step, check for bridges and tunnels // Next step, check for bridges and tunnels
if (current->path.parent != NULL && current->path.node.user_data[0] == 0) { if (current->path.parent != NULL && current->path.node.user_data[0] == 0) {
// First we get the dir from this tile and his parent // First we get the dir from this tile and his parent
int dir = AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile); DiagDirection dir = AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile);
// It means we can only walk with the track, so the bridge has to be in the same direction // It means we can only walk with the track, so the bridge has to be in the same direction
TileIndex tile = current->path.node.tile; TileIndex tile = current->path.node.tile;
TileIndex new_tile = tile; TileIndex new_tile = tile;
uint tileh; Slope tileh = GetTileSlope(tile, NULL);
tileh = GetTileSlope(tile, NULL);
// Bridges can only be build on land that is not flat // Bridges can only be build on land that is not flat
// And if there is a road or rail blocking // And if there is a road or rail blocking
if (tileh != 0 || if (tileh != SLOPE_FLAT ||
(PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDir(dir), MP_STREET)) || (PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDir(dir), MP_STREET)) ||
(!PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDir(dir), MP_RAILWAY))) { (!PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDir(dir), MP_RAILWAY))) {
for (;;) { for (;;) {
@ -349,16 +347,16 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
} }
// Next, check for tunnels! // Next, check for tunnels!
// Tunnels can only be build with tileh of 3, 6, 9 or 12, depending on the direction // Tunnels can only be built on slopes corresponding to the direction
// For now, we check both sides for this tile.. terraforming gives fuzzy result // For now, we check both sides for this tile.. terraforming gives fuzzy result
if ((dir == 0 && tileh == 12) || if ((dir == DIAGDIR_NE && tileh == SLOPE_NE) ||
(dir == 1 && tileh == 6) || (dir == DIAGDIR_SE && tileh == SLOPE_SE) ||
(dir == 2 && tileh == 3) || (dir == DIAGDIR_SW && tileh == SLOPE_SW) ||
(dir == 3 && tileh == 9)) { (dir == DIAGDIR_NW && tileh == SLOPE_NW)) {
// Now simply check if a tunnel can be build // Now simply check if a tunnel can be build
ret = AI_DoCommand(tile, (PathFinderInfo->rail_or_road?0:0x200), 0, DC_AUTO, CMD_BUILD_TUNNEL); ret = AI_DoCommand(tile, (PathFinderInfo->rail_or_road?0:0x200), 0, DC_AUTO, CMD_BUILD_TUNNEL);
tileh = GetTileSlope(_build_tunnel_endtile, NULL); tileh = GetTileSlope(_build_tunnel_endtile, NULL);
if (!CmdFailed(ret) && (tileh == 3 || tileh == 6 || tileh == 9 || tileh == 12)) { if (!CmdFailed(ret) && (tileh == SLOPE_SW || tileh == SLOPE_SE || tileh == SLOPE_NW || tileh == SLOPE_NE)) {
aystar->neighbours[aystar->num_neighbours].tile = _build_tunnel_endtile; aystar->neighbours[aystar->num_neighbours].tile = _build_tunnel_endtile;
aystar->neighbours[aystar->num_neighbours].user_data[0] = AI_PATHFINDER_FLAG_TUNNEL + (dir << 8); aystar->neighbours[aystar->num_neighbours].user_data[0] = AI_PATHFINDER_FLAG_TUNNEL + (dir << 8);
aystar->neighbours[aystar->num_neighbours++].direction = 0; aystar->neighbours[aystar->num_neighbours++].direction = 0;
@ -368,9 +366,9 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
} }
extern uint GetRailFoundation(uint tileh, TrackBits bits); extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c
extern uint GetRoadFoundation(uint tileh, uint bits); extern uint GetRoadFoundation(Slope tileh, uint bits); // XXX function declaration in .c
extern uint GetBridgeFoundation(uint tileh, Axis); // XXX function declaration in .c extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c
enum { enum {
BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12, BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
}; };
@ -380,8 +378,8 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
{ {
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target; Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
int r, res = 0; int r, res = 0;
uint tileh = GetTileSlope(current->tile, NULL); Slope tileh = GetTileSlope(current->tile, NULL);
uint parent_tileh = GetTileSlope(parent->path.node.tile, NULL); Slope parent_tileh = GetTileSlope(parent->path.node.tile, NULL);
// Check if we hit the end-tile // Check if we hit the end-tile
if (TILES_BETWEEN(current->tile, PathFinderInfo->end_tile_tl, PathFinderInfo->end_tile_br)) { if (TILES_BETWEEN(current->tile, PathFinderInfo->end_tile_tl, PathFinderInfo->end_tile_br)) {
@ -411,13 +409,13 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
// when there is a flat land all around, they are more expensive to build, and // when there is a flat land all around, they are more expensive to build, and
// especially they essentially block the ability to connect or cross the road // especially they essentially block the ability to connect or cross the road
// from one side. // from one side.
if (parent_tileh != 0 && parent->path.parent != NULL) { if (parent_tileh != SLOPE_FLAT && parent->path.parent != NULL) {
// Skip if the tile was from a bridge or tunnel // Skip if the tile was from a bridge or tunnel
if (parent->path.node.user_data[0] == 0 && current->user_data[0] == 0) { if (parent->path.node.user_data[0] == 0 && current->user_data[0] == 0) {
if (PathFinderInfo->rail_or_road) { if (PathFinderInfo->rail_or_road) {
r = GetRailFoundation(parent_tileh, 1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)); r = GetRailFoundation(parent_tileh, 1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
// Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information.. // Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information..
if (r >= 15 || (r == 0 && (BRIDGE_NO_FOUNDATION & (1 << tileh)))) { if (r >= 15 || (r == 0 && HASBIT(BRIDGE_NO_FOUNDATION, tileh))) {
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY; res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
} else { } else {
res += AI_PATHFINDER_FOUNDATION_PENALTY; res += AI_PATHFINDER_FOUNDATION_PENALTY;
@ -448,17 +446,17 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
res += AI_PATHFINDER_BRIDGE_PENALTY * GetBridgeLength(current->tile, parent->path.node.tile); res += AI_PATHFINDER_BRIDGE_PENALTY * GetBridgeLength(current->tile, parent->path.node.tile);
// Check if we are going up or down, first for the starting point // Check if we are going up or down, first for the starting point
// In user_data[0] is at the 8th bit the direction // In user_data[0] is at the 8th bit the direction
if (!(BRIDGE_NO_FOUNDATION & (1 << parent_tileh))) { if (!HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh)) {
if (GetBridgeFoundation(parent_tileh, (current->user_data[0] >> 8) & 1) < 15) if (GetBridgeFoundation(parent_tileh, (current->user_data[0] >> 8) & 1) < 15)
res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
// Second for the end point // Second for the end point
if (!(BRIDGE_NO_FOUNDATION & (1 << tileh))) { if (!HASBIT(BRIDGE_NO_FOUNDATION, tileh)) {
if (GetBridgeFoundation(tileh, (current->user_data[0] >> 8) & 1) < 15) if (GetBridgeFoundation(tileh, (current->user_data[0] >> 8) & 1) < 15)
res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
if (parent_tileh == 0) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; if (parent_tileh == SLOPE_FLAT) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
if (tileh == 0) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; if (tileh == SLOPE_FLAT) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
// To prevent the AI from taking the fastest way in tiles, but not the fastest way // To prevent the AI from taking the fastest way in tiles, but not the fastest way

View File

@ -79,12 +79,12 @@ int AiNew_GetRoadDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c)
} }
// Get's the direction between 2 tiles seen from tile_a // Get's the direction between 2 tiles seen from tile_a
int AiNew_GetDirection(TileIndex tile_a, TileIndex tile_b) DiagDirection AiNew_GetDirection(TileIndex tile_a, TileIndex tile_b)
{ {
if (TileY(tile_a) < TileY(tile_b)) return 1; if (TileY(tile_a) < TileY(tile_b)) return DIAGDIR_SE;
if (TileY(tile_a) > TileY(tile_b)) return 3; if (TileY(tile_a) > TileY(tile_b)) return DIAGDIR_NW;
if (TileX(tile_a) < TileX(tile_b)) return 2; if (TileX(tile_a) < TileX(tile_b)) return DIAGDIR_SW;
return 0; return DIAGDIR_NE;
} }
// This functions looks up if this vehicle is special for this AI // This functions looks up if this vehicle is special for this AI

View File

@ -838,8 +838,8 @@ static void AiNew_State_FindDepot(Player *p)
if (IsTileType(tile, MP_TUNNELBRIDGE)) continue; if (IsTileType(tile, MP_TUNNELBRIDGE)) continue;
// Is the terrain clear? // Is the terrain clear?
if (IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)) { if (IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)) {
// If the current tile is on a slope (tileh != 0) then we do not allow this // If the current tile is on a slope then we do not allow this
if (GetTileSlope(tile, NULL) != 0) continue; if (GetTileSlope(tile, NULL) != SLOPE_FLAT) continue;
// Check if everything went okay.. // Check if everything went okay..
r = AiNew_Build_Depot(p, t, ReverseDiagDir(j), 0); r = AiNew_Build_Depot(p, t, ReverseDiagDir(j), 0);
if (CmdFailed(r)) continue; if (CmdFailed(r)) continue;

View File

@ -245,7 +245,7 @@ void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo
// ai_shared.c // ai_shared.c
int AiNew_GetRailDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c); int AiNew_GetRailDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c);
int AiNew_GetRoadDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c); int AiNew_GetRoadDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c);
int AiNew_GetDirection(TileIndex tile_a, TileIndex tile_b); DiagDirection AiNew_GetDirection(TileIndex tile_a, TileIndex tile_b);
bool AiNew_SetSpecialVehicleFlag(Player *p, Vehicle *v, uint flag); bool AiNew_SetSpecialVehicleFlag(Player *p, Vehicle *v, uint flag);
uint AiNew_GetSpecialVehicleFlag(Player *p, Vehicle *v); uint AiNew_GetSpecialVehicleFlag(Player *p, Vehicle *v);